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