项目地址:WillOS/WillOS/Inc/allocator.h at master · LieWill/WillOS
欢迎来到 WillOS 核心机理深度解析系列。对于刚入门 RTOS 的开发者来说,理解“多任务”不应停留在概念层面,而应深入到 Cortex-M 硬件特性 与 汇编逻辑 之间的精妙协作。
在 WillOS 的四大模块中,我们选择从 contex.s(上下文切换)作为第一章,因为它是连接“并发逻辑”与“物理 CPU”的底层纽带。如果没有这一章的汇编魔法,后面所有的内存管理和任务调度都无法在硬件层面真正跑起来。
1. 物理纽带:为什么从“上下文切换”开始?
- 调度器 (Scheduler) 只是一个决策者,它说:“现在该 A 跑了”。
- 内存管理器 (Allocator) 只是一个后勤,它提供生存空间。
- 上下文切换 (Context) 则是真正的搬运工,它负责把 CPU 内部的寄存器状态“瞬移”到内存中,再把另一个任务的状态搬回来。
理解了上下文切换,你就理解了任务是如何在物理世界中“存在”和“流转”的。
2. 核心机理:双栈指针与运行环境隔离
Cortex-M 架构通过硬件实现了两个栈指针:MSP (主栈) 和 PSP (进程栈)。这是 RTOS 稳定运行的基石。
2.1 环境隔离流转
- Thread Mode(线程模式):所有用户任务在 PSP 下运行。它们拥有独立的内存空间。
- Handler Mode(异常处理模式):所有的中断(SysTick, PendSV, 外设中断)统统在 MSP 下运行。
2.2 物理轨迹:switch_msp_to_psp 的意义
系统刚启动时一切都在 MSP 下。为了开启多任务,我们需要完成一次物理级的“脱壳”:
- 保存主环境现场:将 main 函数的栈状态交给 PSP。
- 重塑 MSP:将 MSP 指向专门分配给中断的静态内存(
isr_stack)。
机理效果:此后,无论发生多少次中断嵌套,中断的压力都在 MSP 上;而在任务调度时,调度器只需在不同的 PSP 之间切换。
3. 核心流程:PendSV 异步切换接力
WillOS 使用 PendSV(可悬起系统调用) 异常来执行切换。这是一种平滑、低延迟的设计方案。
3.1 硬件与软件的“交接棒”
- 逻辑触发:当调度器决定切换任务时,它通过写 ICSR 寄存器挂起一个 PendSV 标志。
- 异步等待:PendSV 被配置为 最低优先级。这意味着切换会等待所有紧急抢占的中断处理完成后才发生。
- 硬件自动入栈:当 CPU 准备处理 PendSV 时,硬件会自动把 8 个寄存器(R0-R3, R12, LR, PC, xPSR)压入当前的 PSP。
- 汇编手动入栈:
contex.s接管后,手动压入剩余的 R4-R11(以及 FPU 浮点寄存器)。此时,任务的“灵魂”已在内存中全量存档。
4. 后续篇章导读
有了这个“心脏”在跳动,我们接下来的旅程将顺理成章:
- Allocator (基础):探讨如何为这些“灵魂”划分沙盒化的空间。
- Scheduler (大脑):研究如何在环形链表里高效地管理这些灵魂的排班。
- Coordinator (规则):讲解这些灵魂在竞争资源时如何优雅地协作。
小贴士:你可以将
contex.s看作是 WillOS 的“底盘”。虽然它代码最少(约 100 行),但承载了整个系统与芯片硬件对话的最直接逻辑。
你好