gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:44:51 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com