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

Are the PendSV / SVC exceptions raised immediately?

我正在研究 Cortex-M4 上的上下文保存和恢复机制,以便我可以实现简单的多任务处理。我使用 arm-none-eabi-g++ 来编译这段代码。便携性暂时不是问题。

当任务可以调用 yield 函数时,我将其用于协作多任务处理的形式,该函数将通过引发 PendSV 异常向内核执行 return。 (然后内核可以为 运行 安排另一个任务,最终 return 到当前任务。)

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,还是继续执行PendSV_Handler之后的指令? =13=]函数?

我最好使用 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 确实是为更高优先级的异常处理程序说 "oh, the thread I've interrupted is now going to need to make a system call in its own context because of this" 准备的。如果您只是想让线程在其正常执行过程中进行同步系统调用,那是 svc 指令的唯一目的。