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 管理的中断, 以保护临界区中的代码。
相关推荐
David猪大卫8 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
星恒随风8 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
蒸蒸yyyyzwd12 小时前
从后端面经学到的 3 个知识
笔记·学习
17岁的勇气12 小时前
Unity Shader unity文档学习笔记(二十二):shader变体
笔记·学习·unity
坤坤子吖13 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
路灯上の马陈15 小时前
Java 内部类 学习笔记
笔记·学习
希和202715 小时前
51 单片机入门笔记:江科大课程代码逐行讲解(按键控制 LED 流水灯)
笔记·单片机·mongodb
前进的李工15 小时前
Agent 学习笔记 12:Agent 的工具应该怎么设计
人工智能·笔记·学习·agent·工具调用·skill·工具设计
ever_you_love15 小时前
2026.11.9录屏笔记
笔记
希和202715 小时前
51 单片机按键控制 LED:江科大课程代码小白笔记
笔记·单片机·嵌入式硬件