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小系统实践(三):AAPCS32、栈与上下文汇编

本章记录什么

这一章讨论 C 函数与汇编函数如何彼此信任。处理器不会自动知道哪几个寄存器应该由调用者保存,也不会自动保证栈满足编译器要求;这些规则来自 AAPCS32。只有把参数、返回值、caller-saved、callee-saved、栈对齐和 lr 的含义连起来,才能安全地从启动汇编调用 C、从 IRQ 入口调用分发器,或者实现一个与编译器兼容的上下文切换函数。

在这一章之前做了什么

上一章已经说明模式切换如何改变 splr 和 SPSR 的可见版本。那属于处理器架构。普通函数调用则通常不改变处理器模式,它依赖的是软件合同。两者都在操作寄存器,但保存集合、返回方式和错误症状完全不同。本章先把这条边界画清楚,再进入多寄存器访存和实际函数边界。

文章中的示例会从一个普通五参数函数开始,逐步走到汇编调用 C、C 调用汇编以及结构体偏移校验。读完后,即使没有工程源码,也应能独立判断一段汇编是否破坏了 ABI。


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