我想在下面的代码块中实现SVC保护的临界区:
key = SVC_disable();
... /* SVC protected critical block of code */
SVC_restore(key);
如何在cortex R5 ARM上实现SVC_disable/restore
关于代码流的附加细节以澄清
这是一个运行在ARM Cortex R5上的裸机应用程序
执行路径1:
Inst1
Inst2
/* ----- Start of SVC critical section -----*/
Update state atomically.
-- Another SVC may also update same state so updates to state should prevent execution of any other SVC in the core
/* ---- End of critical section ----*/
现在,当控制处于临界段时,可能会发生中断,中断服务程序可以发布一个SVC,可以破坏状态。
我不想在临界区完全禁用IRQs/FIQs。只延迟svc直到执行路径1离开临界区
任何发布的SVC都应该是一个等待异常,当执行路径1离开临界区时将被执行
我看到了禁用IRQ/FIQ的说明,但没有看到有选择地禁用SVC异常的选项。
svc
是用户空间系统调用指令。所以只有当用户空间代码在当前核心上运行时才会发生这种情况,对吧?它不会异步发生,它没有意义,让它禁用,因为什么应该发生当svc
指令运行?
要避免用户空间代码(可能包括svc
)在内核函数处于临界区时运行,请禁用临界区周围的内核抢占,并且不要休眠。这是用户空间代码可以在运行某些内核代码(AFAIK)的同一核心上运行的唯一方法。
Linux下,调用preempt_enable()
/preempt_disable()