62.RTOS调度原理

📅 2026/7/13 6:23:43 👁️ 阅读次数 📝 编程学习
62.RTOS调度原理

RTOS任务调度底层逻辑:

核心总结

任务控制块 TCB
每个任务的栈指针、任务状态、优先级、延时时间、入口函数等所有信息,都封装在一个结构体里,就是TCB

「链表节点」本质就是TCB 结构体自带链表前后指针

用链表管理所有任务
RTOS 维护多条链表:

  • 就绪链表:能马上运行的任务
  • 延时/阻塞链表:挂起、延时、等待信号量/队列的任务
  • 挂起链表:手动挂起的任务
    所有任务TCB都挂在不同链表上,用链表组织所有任务信息

SysTick 中断是调度触发源
SysTick 定时进中断,在中断里做几件关键事:

  • 遍历/操作链表:延时时间减1,时间到就把任务从阻塞链表挪到就绪链表(增删改查)
  • 任务优先级比对,选出最高优先级就绪任务
  • 触发 PendSV 做任务上下文切换(保存当前任务现场、恢复新任务现场)

真正链表增删、状态迁移逻辑,一般放在:

  • SysTick 中断服务函数里做延时计时、链表迁移
  • 上下文切换、任务栈现场保存恢复单独放在PendSV 异常里(优先级最低,适合收尾切换)

不是所有链表操作都全塞在SysTick里,但核心驱动确实是 SysTick 节拍中断 + 链表TCB管理

RTOS 就是:
每个任务 = 一个带链表节点的TCB结构体
SysTick 定时中断扫描链表,做任务状态迁移、延时到期,再通过PendSV切换最高优先级任务运行

说白了 RTOS 底层就三件事,完全是数据结构 + 中断 + 链表

  1. TCB结构体存每个任务的所有信息
  2. 多条链表分门别类管:就绪、延时、阻塞、挂起任务
  3. SysTick 周期性中断扫链表、改状态、挑最高优先级任务,PendSV 做栈上下文切换

从原理上讲:确实就是链表增删改查 + 中断调度,没任何玄学。


为啥很多人觉得难?

不是原理难,是工程细节堆出来的

  1. 汇编级上下文切换(寄存器压栈、出栈,新手懵)
  2. 优先级抢占、时间片轮转、同优先级调度逻辑
  3. 延时链表优化、空闲任务、堆栈溢出检测
  4. 信号量/队列/互斥锁,本质也都是链表+TCB阻塞挂载
  5. 中断优先级分组、临界区保护、防止调度乱套

直白说

裸机:while(1) 大循环轮询
RTOS:把大循环拆成若干个任务,用链表管起来,用SysTick定时自动帮你轮询+抢占