是否立即引发了PendSV / SVC异常?

时间:2016-03-17 11:19:12

标签: c++ assembly arm cortex-m bare-metal

我正在研究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;
}

我希望执行立即回到内核。

问题是,在PENDSVSET中设置ICSR位之后,是否保证执行立即转到PendSV_Handler,或者在{{1}之后继续执行指令功能?

我最好使用yield指令吗?

SVC

1 个答案:

答案 0 :(得分:3)

根据体系结构手册中的描述,PendSV真正用于何时为更高优先级的异常处理程序说"哦,我被中断的线程现在需要进行系统调用因为这个"在它自己的背景下。如果您只是希望线程在正常执行过程中进行同步系统调用,那么这是svc指令的唯一目的。

相关问题