ARMv7-A小系统实践(八):从完整IRQ现场到按需切换,再看RTEMS

本章记录什么

这一章把主动切换与 IRQ 返回路径合并成抢占式调度,并比较两种异常帧方案:基础版在每次 IRQ 保存 64 字节完整现场;精简版常规 IRQ 只保存 32 字节 caller-saved 现场,只有确实切换任务时才保存 r4-r11。最后用 RTEMS 6.2 的 ARM 端口检查这些选择背后的工程条件。

在这一章之前做了什么

此时已经有两个彼此独立但尚未连接的能力:普通函数边界上的协同任务切换,以及能够重复进入的 Timer IRQ。抢占的关键不是在 handler 里直接调用普通 context switch,而是让定时器只提出调度请求,由最外层 IRQ 尾部决定恢复哪一个任务的异常现场。

本章会先用完整 frame 建立容易证明正确的版本,再讨论何时可以优化。性能数字不是重点;重点是每省掉一组保存动作,都必须说明是谁继续承担寄存器保护责任。

ARMv7-A小系统实践(六):异常入口、返回地址与独立中断栈

本章记录什么

这一章解释异常入口与返回,并建立任务私有的 IRQ 异常帧。它要解决的不是“进入了哪个 C 函数”,而是任意指令执行到一半时,怎样保存足够的信息,使处理结束后能够像中断从未发生一样继续执行;如果调度器选择了另一个任务,又怎样改为恢复另一个任务的现场。

在这一章之前做了什么

上一章的协同切换发生在函数调用边界,因此可借助 AAPCS 只保存 callee-saved 状态。IRQ 没有这个便利:r0-r3r12、条件标志和返回地址都可能正处于有效计算中。硬件只完成模式切换、CPSR 到 SPSR 的保存以及返回地址写入 banked lr,其余现场必须由入口汇编建立。

本章先分清硬件动作和软件动作,再说明为什么返回 PC 需要修正、为什么异常帧应归属于被打断任务、为什么 C handler 可以使用独立中断栈但恢复现场不能长期停留在共享栈上。


:D 一言句子获取中...