stm32 freertos 学习尚硅谷 第 2 章FreeRTOS基础知识
2026/4/15 9:22:20 网站建设 项目流程

多任务处理

单核处理器一次只能执行一项任务。 多任务操作系统可以通过任务之间的快速切换制造并发执行的假象

任务调度

操作系统中任务调度器的责任就是决定在某一时刻要执行哪个任务。调度器是内核中负责决定在任何特定时间应执行哪些任务的部分。内核可以在任务生命周期内多次挂起并且稍后恢复一个任务

任务状态

运行态:只有一个,

就绪态:没有任务,唯一可以直接到运行的状态

阻塞态:等待延时,外部事件

挂起态:vTaskSuspend() 进入挂起态

FreeRTOS 任务有两个很常用的 “不运行” 状态,都依赖滴答计时:
休眠(Suspended)
任务主动说:过多久再叫醒我,时间没到绝不运行。
阻塞(Blocked)
任务在等某个事件(消息、信号量、中断等),同时说:我最多等多久,超时了就不等了。

“什么时候恢复运行”。

xTickCount(滴答计数器)

一个硬件定时器周期性产生中断 → 滴答中断(Tick ISR)
每进一次中断,xTickCount + 1
这个计数就是 FreeRTOS 的系统时间
举例:
滴答频率 1kHz → 1ms 加 1
滴答频率 100Hz → 10ms 加

任务上下文是什么?
任务运行时必须用到的 CPU 资源叫上下文:

“现场”
CPU 寄存器(运算、地址、状态等)
任务堆栈
当前执行到哪一行代码

上下文切换

  • 切出 TaskA:把 CPU 寄存器里的值,存到 TaskA 的堆栈
  • 切入 TaskB:把 TaskB 堆栈里保存的值,恢复回 CPU 寄存器

FreeRTOS 不是随时切换,而是在固定时机触发:
1. 最常见:系统滴答中断(Tick ISR)
每次心跳:
检查延时任务是否唤醒
检查是否有更高优先级任务就绪
需要切换 → 标记触发 PendSV
2. 任务主动让出
任务调用 vTaskDelay
任务等待信号量 / 队列
任务运行完毕主动退出
都会主动请求切换
3. 高优先级任务就绪抢占
低优先级任务正在运行
突然来了更高优先级任务 → 立刻触发切换

真正切换 = 在 PendSV 中断服务函数里做
所有上下文切换代码,都在 PendSV_Handler () 里执行

为什么用 PendSV?(核心优势)
可以软件手动触发(想切就切)
可以设置为最低中断优先级
不会打断其他重要中断
所有中断执行完,最后才做任务切换


怎么触发 PendSV?
向中断寄存器 ICSR 的 bit28 写 1
→ 挂起 PendSV 中断
→ 等所有高优先级中断执行完
→ PendSV 运行 → 执行上下文切换

PendSV 设为 最低优先级,不影响重要中断
触发方式:置位 ICSR 的 bit28
触发时机:滴答中断、任务主动让出、高优先级抢

滴答中断、串口中断、定时器中断这种硬件中断,优先级通常很高

FreeRTOS 强制把 PendSV 设为最低中断优先级

所有硬件中断都执行完了 → 最后才轮到 PendSV 做任务切换

PendSV 可以软件手动触发
想切换任务时,只要写一个寄存器位,就能触发 PendSV

向 ICSR 寄存器的 bit28 写 1

SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk;

挂起 PendSV → 等所有高优先级中断执行完 → 自动进入 PendSV_Handler

PendSV 是什么?

Cortex‑M 为 RTOS 设计的、可软件触发的、最低优先级中断。

PendSV 用来干嘛?

专门执行 FreeRTOS 的上下文切换。

为什么要用它?

不干扰高优先级中断,保证系统实时性,让任务切换安全、延后、统一执行。

总结:

PendSV = FreeRTOS 的任务切换工人,永远等所有紧急中断干完,才最后出来做上下文切换。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询