来自另一个 ISR 的 Cortex-M7 (M4) SVCall:当 SVCall 具有更高优先级时执行,否则直接进入 HardFault

问题描述 投票:0回答:1

上下文:编写一个 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 的预期行为吗?

arm embedded interrupt cortex-m
1个回答
3
投票

是的,这是预期的行为。如果您想从另一个处理程序中挂起一个处理程序,这正是

PendSV
的设计目的(请参阅此处),这是通过在 ICSR 中设置一个位来触发的(请参阅此处)。

PendSV
通常用于操作系统上下文切换之类的事情,这样可以保证不可重入,并且可以毫无问题地多次触发。

© www.soinside.com 2019 - 2024. All rights reserved.