在ARM cortex R中禁用SVC的关键部分

时间:2016-08-26 00:32:44

标签: assembly arm bare-metal

我想在下面的代码块中实现受SVC保护的关键部分:

std::cout << image_tensor;

如何在cortex R5 ARM上实现SVC_disable / restore

有关澄清的代码流的其他详细信息

这是在ARM Cortex R5上运行的裸机应用程序

执行路径1:

key = SVC_disable();

... /* SVC protected critical block of code */

SVC_restore(key);

现在,当控制在关键部分时,可能会发生中断,并且中断服务程序可以发布可能损坏状态的SVC。

我不想在关键部分完全禁用IRQ / FIQ。仅延迟SVC,直到执行路径1离开临界区

ANy发布的SVC应该是一个待处理的异常,当执行路径1离开关键部分时会执行该异常

我看到禁用IRQ / FIQ的说明,但没有看到任何选择性地禁用SVC异常的选项。

1 个答案:

答案 0 :(得分:2)

svc is the user-space system-call instruction。所以只有当用户空间代码在当前核心上运行时才会发生,对吗?它不是异步发生的,禁用它是没有意义的,因为当svc指令运行时应该发生什么?

为了避免在内核函数处于关键部分时运行用户空间代码(可能包括svc),请在关键部分周围禁用内核抢占,并且不要睡觉。这是用户空间代码在运行某些内核代码(AFAIK)的同一核心上运行的唯一方式。

在Linux中,call preempt_enable() / preempt_disable()