上下文:编写一个 RTOS,有一个工作调度程序、上下文切换器等。现在实现 SVCall。主要测试/开发平台是 STM32F746-Disco Cortex-M7,也适用于带有 Cortex-M4 的 STM32F469 disco。
我的目标是将 SVCall 设置为挂起,完成当前中断和尾链到 SVC 处理程序中。我在两个地方进行此中断级联,因为它在我的实现中具有特殊用途(例如,裸中断处理程序保留线程寄存器,然后软件触发另一个 ISR,我可以在其中执行完整的复杂 C 代码)。
如果我从线程中
__asm volatile("SVC 0");
,它就可以正常工作。
如果我
__asm volatile("SVC 0");
来自ISR,其优先级低于SVC优先级,则它可以正常工作。
如果来自ISR的
__asm volatile("SVC 0");
,其优先级高于SVC优先级,SVC指令立即直接进入HardFault。它不会进入 SVC 处理程序,甚至不会完成当前较高优先级的处理程序。
这种中断级联(我称之为)方法可以与其他中断一起使用。我从较高优先级中断激活较低优先级中断,完成较高优先级中断,然后进入较低优先级中断处理程序。但它不适用于 SVC。当且仅当 SVC 的优先级高于其调用的优先级时,SVC 才会起作用。
这是 SVC 的预期行为吗?