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

标签 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;
}

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

问题是,在我设置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/

相关文章:

assembly - ARM中如何获取寄存器值的二进制补码?

linux-kernel - kmalloc 的内存速度很慢

c++ - 在C++中排序后如何调用数组中的变量?

c++ - 在qt中的gstreamer视频上覆盖小部件

c++ - 我应该如何在没有反复试验的情况下解决这个递归问题

c++ - 如何重载 operator new 和 delete 来跟踪内存?

linux - ELF header ,偏移量 06h 和 14h 是否重复?

linux - 在linux中,文件末尾没有空字符是否正常

arm - 是否可以使用 Mali OpenCL SDK 在 ARM CPU (Cortex-a7) 上执行 OpenCL 代码?

linux - 如何从 Linux 内核读取 I2C EEPROM - ARM TI AM3352