我可以将哪些Cortex-M3中断用于通用工作?

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编译器为此提供内置的内部函数或宏.)