Cap*_*edD 7 embedded interrupt cortex-m3
我有一些代码需要在特定中断结束时运行.
我不想在中断本身的上下文中执行它,但我也不希望它在线程模式下执行.
我想以低于高级别中断的优先级运行它,该高级别中断促使其运行,但也优先级高于线程级别(以及其他一些中断).
我想我需要使用其他一个中断处理程序.
最好使用哪些以及调用它们的最佳方法是什么?
目前我正在计划仅使用中断处理程序来处理一些我没有使用的外设,并通过直接通过NVIC设置位来调用它们,但我希望有更好的,更官方的方式.
谢谢,
Mir*_*mek 15
ARM Cortex支持一种非常特殊的异常PendSV.您似乎可以完全使用此异常来完成您的工作.实际上,ARM Cortex的所有抢占式RTOS都使用PendSV来实现上下文切换.
为了使其工作,您需要优先考虑PendSV为低电平(将0xFF写入NVIC中的PRI_14寄存器).您还应该优先考虑PendSV之上的所有IRQ(在NVIC的相应优先级寄存器中写入较低的数字).当您准备好处理整个消息时,从高优先级ISR触发PendSV:
*((uint32_t volatile *)0xE000ED04) = 0x10000000; // trigger PendSV
Run Code Online (Sandbox Code Playgroud)
然后,ARM Cortex CPU将完成您的ISR以及可能被其抢占的所有其他ISR,并最终将尾链链接到PendSV异常.这是解析消息的代码所在的位置.
请注意,PendSV可能被其他ISR抢占.这一切都很好,但显然需要记住通过关键代码段保护所有共享资源(简单地禁用和启用中断).在ARM Cortex中,通过执行__asm("cpsid i")禁用中断,并通过__asm("cpsie i")启用中断.(大多数C编译器为此提供内置的内部函数或宏.)
| 归档时间: |
|
| 查看次数: |
9645 次 |
| 最近记录: |