这一部分在整体课程里扮演什么角色

uC/OS-II 源码分析的第 4 季,通常处于“从宏观架构转入微观实现”的转折点。前几季已经讲过任务管理、内存管理的整体思路,这一部分聚焦的是内核中最核心、也最晦涩的调度与同步机制。很多学习者在看源码时会卡在几个地方:为什么 `OSSched()` 不直接调用 `OS_TaskSwapContext()`?信号量和互斥量的内核态处理有什么区别?中断屏蔽和任务切换的边界在哪里?这一节正是为了解决这些细节困惑而设置的,它把之前笼统提到的“内核部分”拆解成可逐行阅读的源码模块。

适合什么基础的学习者

建议已经具备以下前置条件再进入这部分:
- 熟悉 C 语言指针操作、结构体定义以及内联汇编的基本语法
- 对实时操作系统有基本概念,理解任务、优先级、就绪表、临界区等术语
- 看过 uC/OS-II 的头文件和主要宏定义,知道 `OS_TCB`、`OS_RDY_TABLE` 等关键结构的存在
- 最好已经跑通过 uC/OS-II 的最小示例工程,对任务创建和切换有直观感受

如果你还在纠结“任务控制块长什么样”或者“怎么把任务挂到就绪链表上”,建议先回头补一下前两季关于任务管理和内存管理的内容,否则会在这节课感到明显吃力。

建议先看哪几块,资料怎么配合练习

推荐按以下顺序切入:

**先精读任务调度相关源码。** 重点跟踪 `OSSched()`、`OSIntExit()`、`OSTaskSwHook()` 的调用链,理解高优先级任务就绪时,内核如何决定何时真正发生上下文切换。对照源码中的注释和宏展开,把每一步的逻辑在纸上画出来。

**再梳理同步原语的内核实现。** 信号量(Semaphore)、互斥量(Mutex)的等待和释放路径是这段内容的难点。注意区分普通信号量和互斥量在优先级继承机制上的差异,这是 uC/OS-II 区别于其他轻量级 RTOS 的核心设计之一。

**最后结合仿真或硬件平台验证。** 资料中如果有配套的实验工程,务必亲手打断点、单步执行,观察 `OSTCBCur`、`OSPrioHighReady` 等关键变量在调度前后的值变化。如果没有现成工程,可以用串口打印关键函数入口和出口,构建自己的调试日志。

学完这部分,你应该能够独立阅读 uC/OS-II 内核核心代码,解释清楚一个外部中断发生后,系统是如何从 ISR 返回并最终切换到更高优先级任务的完整过程。这对于后续学习 FreeRTOS 或 RT-Thread 等现代实时操作系统,建立扎实的底层认知非常有价值。

课程目录

整理中,敬请期待。