是否立即引发 PendSV / SVC 异常

Are the PendSV / SVC exceptions raised immediately?

本文关键字:SVC 异常 PendSV 是否      更新时间:2023-10-16

我正在 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指令的唯一目的。