FreeRTOS任务切换笔记

1.PendSV异常

  1. PendSV 的中断由中断控制状态寄存器(ICSR) 中 PENDSVSET 为置1触发。
  2. PendSV 的中断是非实时的。
  3. PendSV 的中断服务函数就会在其他所有中断处理完成后才执行。(优先级最低)
  4. OS 内核的执行可以有两种触发方式:SVC 指令触发及SysTick 周期性的中断。
  5. 任务切换导致中断请求延迟处理(中断请求IRQ在SysTick中断产生之前产生)
  6. FreeRTOS的任务切换就是在PendSV中完成的。

2.PendSV中断服务函数

  1. PendSV 的中断服务函数定义成函数 xPortPendSVHandler()。
  2. 在进行任务切换的时候, 还需考虑是否保护和恢复浮点寄存器的值。
  3. 在 PendSV 中断服务函数中, 主要要做的事情就是, 保存硬件不会自动入栈的 CPU 信息, 已经确定写一个要运行的任务, 并将 pxCurrentTCB 指向该任务的任务控制块, 然后更新PSP 指针为该任务的任务堆栈指针。

3.FreeRTOS确定下一个要运行的任务

  1. vTaskSwitchContext()调用了函数 taskSELECT_HIGHEST_PRIORITY_TASK(), 来将pxCurrentTCB 设置为指向优先级最高的就绪态任务。
    1. uxSchedulerSuspended变量用于在系统运行的任意时刻标记需要进行任务切换,会在 SysTick 的中断服务函数中统一处理。
  2. 将 pxCurrentTCB 指向优先级最高的就绪态任务,有两种方法(滴答定时器、portYIELD()---本质是向中断控制和状态寄存器ICSR的bit28写入1挂起PendSV来启动PendSV中断), 由 FreeRTOSConfig.h 文件配置决定。
  3. taskSELECT_HIGHEST_PRIORITY_TASK()用于将 pcCurrentTCB 设置为优先级最高的就绪态任务, 因此该函数会使用位图的方式在任务优先级记录中查找优先级最高任务优先等级, 然后根据这个优先等级, 到对应的就绪态任务列表在中取任务。
  4. taskSELECT_HIGHEST_PRIORITY_TASK():全局变量 uxTopReadyPriority 以位图方式记录了系统中存在任务的优先级,将遍历的起始优先级设置为这个全局变量,而无需从系统支持优先级的最大值开始遍历,可以节约一定的遍历时间。限制了系统最大优先级数量不能超过32个。
  5. 依靠特定硬件指令实现的函数 taskSELECT_HIGHEST_PRIORITY_TASK()是一个宏定义。

4.PendSV异常何时触发

  1. PendSV 异常用于进行任务切换
  2. portYIELD():设置中断控制状态寄存器,以触发PendSV异常。

5.FreeRTOS时间片调度

  1. CPU 轮流运行优先级相同的任务, 每个任务运行的时间就是一个系统时钟节拍。
  2. 临界区是指那些必须完整运行的区域, 在临界区中的代码必须完整运行, 不能被打断。
  3. FreeRTOS 在进出临界区的时候, 通过关闭和打开受 FreeRTOS 管理的中断, 以保护临界区中的代码。
相关推荐
Chery11402 小时前
DPE5500 SPI以太网协议栈芯片详解:10/100M以太网、硬件TCP/IP与国产替代方案
arm开发·网络协议·tcp/ip
职豚求职小程序刷题3 小时前
易方达基金2027秋招笔试|考什么+场次提醒
笔记
无锡银洲自动化4 小时前
煤粉测点频繁堵管?FD 防堵风压取样器现场调试小结
笔记·产品运营
ACP广源盛139246256734 小时前
Type-C 扩展坞选型笔记:DP1.4a 转 HDMI2.0 桥接方案 GSV2201E @ACP评估
笔记·硬件架构·硬件工程·视频·hdmi·国产芯片
xian_wwq5 小时前
【学习笔记-一文读懂系列】读懂GBZ-195-2026《人工智能 工业智能体参考架构》
笔记·学习
ss2736 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 19 PostgreSQL逻辑备份:pg_dump与pg_dumpall
数据库·笔记·postgresql
flytalei7 小时前
逐浪笔记 GitOps 实战:Jenkins 构建、Argo CD 同步与 Git 回滚
笔记·git·jenkins
叼烟扛炮7 小时前
Linux 学习笔记(八):GCC 编译器的四大阶段与链接原理
linux·笔记·学习