FreeRTOS 学习:(二十九)任务切换的底层逻辑(了解)

上一篇 下一篇
任务调度器 + 启动第一个任务(了解)

任务切换的底层逻辑(了解)

这章是底层逻辑解释,主要是为了解决bug、能写出更正确的代码,新手这里了解即可,会用就行,后续可以回来看看

任务切换的 本质:就是 CPU 寄存器的切换

简单点说就是:

1)所有任务都共用一组 CPU 寄存器

以 ARM Cortex-M 系列(如 STM32 使用的 M3/M4/M7)为例:

  • 通用寄存器(13 个)

    • R0 -- R12:用于数据运算、传参、临时存储。
      • R0--R3 常用于函数参数传递和返回值;
      • R4--R11 通常由函数保存(callee-saved)。
  • 特殊功能寄存器(3 个 + 1 个程序状态寄存器)

    • R13 (SP):堆栈指针(Stack Pointer),指向当前任务的堆栈顶部。

    • R14 (LR):链接寄存器(Link Register),保存函数返回地址或异常返回地址。

    • R15 (PC):程序计数器(Program Counter),指向下一条要执行的指令地址。

    • xPSR(Program Status Register):包含条件标志(如 Z、N、C、V)、中断使能位、当前执行 Thumb 状态等。

✅ 在异常(如中断、PendSV)发生时,硬件自动将 R0--R3、R12、LR、PC、xPSR 压入当前堆栈(称为"自动压栈")。

CPU 同时只能处理一个任务

2)通过触发 PendSV 中断实现任务切换

PendSV中断是如何触发的,有两种:

  • 在滴答定时器中断中调用,
  • 执行 FreeRTOS 提供的相关 API 函数:portYIELD()

本质:通过向中断控制和状态寄存器 ICSR 的 bit28 写入 1 挂起 PendSV 来启动 PendSV 中

3)压栈和出栈(PendSV 中断服务函数)

  1. 每个任务拥有独立堆栈,用于保存自己的 CPU 寄存器状态(称为"上下文")。
  2. 任务切换时 (如时间片到期或高优先级任务就绪):
    • 保存当前任务上下文(压栈,保存现场 ):
      • 硬件在进入异常(如 PendSV)时自动压栈 R0--R3、R12、LR、PC、xPSR;
      • OS 用汇编代码手动压栈 R4--R11,并将当前堆栈指针(SP)存入该任务的控制块(TCB)。
    • 切换到下一个任务(出栈,恢复现场 ):
      • 从新任务的 TCB 取出其 SP;
      • 从其堆栈中弹出 R4--R11;
      • 异常返回时,硬件自动恢复其余寄存器并跳转到该任务上次中断的位置继续执行。
  3. 关键点
    • 不是"赋值",而是通过堆栈压入/弹出实现寄存器状态的保存与恢复
    • 所有操作围绕每个任务自己的堆栈进行;
    • 硬件 + 汇编协同完成,确保高效、原子性。
  4. 总结就是:
    • 任务切换 = 保存当前任务寄存器到其堆栈 + 恢复下一任务寄存器从其堆栈,靠硬件和汇编高效协作完成。

4)图解


相关推荐
振南的单片机世界1 小时前
CPU时钟:频率越高跑越快,但物理极限在“拖后腿”
stm32·单片机·嵌入式硬件
普中科技3 小时前
【普中 51-Ai8051 开发攻略】-- 第 20 章 输入捕获实验
单片机·嵌入式硬件·输入捕获·pca·普中科技·ai8051u·aicube
d111111111d3 小时前
直流电机位置式 PID 控制 和 舵机的区别
笔记·stm32·单片机·嵌入式硬件·学习
d111111111d5 小时前
了解Modbus
网络·笔记·stm32·单片机·嵌入式硬件·学习
三佛科技-134163842125 小时前
主控FT32F031便携式吸尘器方案,迷你手持吸尘器MCU控制方案开发
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
一个平凡而乐于分享的小比特6 小时前
一文读懂MCU与FPGA:核心区别、协同之道与双修秘籍
单片机·fpga开发·职场发展·mcu开发
踏着七彩祥云的小丑7 小时前
嵌入式——认识电子元器件——微动开关系列
单片机·嵌入式硬件
调光IC-小雅7 小时前
解析FP62××系列限流保护机制:为何它是DC/DC芯片的安全底线
单片机·嵌入式硬件
gihigo19988 小时前
MAX30102 + STM32 人体血氧饱和度(SpO₂)测量方案
stm32·单片机·嵌入式硬件
LCG元8 小时前
STM32实战:基于uC/OS-III的STM32移植与多任务应用
stm32·单片机·嵌入式硬件