我正在研究 Cortex-M4 上的上下文保存和恢复机制,以便我可以实现简单的多任务处理。我使用 arm-none-eabi-g++
来编译这段代码。便携性目前不是问题。
当任务可以调用 yield
函数时,我将其用于协作多任务处理的形式,该函数将通过引发 PendSV
异常使执行返回到内核。 (然后内核可以安排另一个任务运行并最终返回当前任务。)
void Task::yield() {
// ...
// ... (Context saving code goes here) ...
// ...
// Set the PENDSVSET to trigger a PendSV exception
SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk;
}
我希望执行立即返回内核。
问题是,在我设置ICSR
中的PENDSVSET
位后,是否保证执行会立即转到PendSV_Handler
,还是会它在 yield
函数之后继续执行指令吗?
我最好为此使用 SVC
指令吗?
void Task::yield() {
// ...
// SVC has an 8-bit immediate constant argument, which
// can be used by the kernel for determining what kind
// of system call this is.
asm volatile("SVC 0");
}
最佳答案
从体系结构手册中的描述来看,PendSV 实际上是为更高优先级的异常处理程序说“哦,我中断的线程现在需要在其自己的上下文中进行系统调用,因为这个的”。如果您只是希望线程在其正常执行过程中进行同步系统调用,那是 svc
指令的唯一目的。
关于c++ - PendSV/SVC 异常是否立即引发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36059006/