FreeRTOS系列第22篇—FreeRTOS任务切换分析

💡 原文中文,约7100字,阅读约需17分钟。
📝

内容提要

FreeRTOS任务切换的代码占据了整个代码的一半,通过任务切换找到优先级最高的就绪任务并让其获得CPU运行权。任务切换有两种方法:执行系统调用和系统节拍时钟中断。PendSV中断通过向中断状态寄存器写入1来产生。任务切换过程中保存和恢复寄存器值,更新任务堆栈指针。任务切换方法可以是通用方法或特殊方法,特殊方法使用硬件提供的计算前导零指令选择下一个要执行的任务。

🎯

关键要点

  • FreeRTOS任务相关代码占据整个代码的一半,旨在找到优先级最高的就绪任务并让其获得CPU运行权。
  • 任务切换是实现任务调度的直接执行者,通常使用系统调用或系统节拍时钟中断来触发。
  • PendSV中断通过向中断状态寄存器写入1来产生,任务切换过程中保存和恢复寄存器值,更新任务堆栈指针。
  • Cortex-M3平台的任务切换方法可以是通用方法或特殊方法,特殊方法利用硬件提供的计算前导零指令选择下一个任务。
  • 任务切换的两种方法分别是使用taskYIELD()和portYIELD_FROM_ISR(),最终都会执行宏portYIELD()。
  • 在系统节拍时钟中断服务函数中,更新tick计数器并检查是否有任务解除阻塞,必要时产生PendSV中断。
  • PendSV中断服务程序负责找到优先级最高的就绪任务并进行任务切换。
  • Cortex-M3架构下的PendSV中断服务程序源码分析,强调了任务堆栈指针PSP和主堆栈指针MSP的使用。
  • 任务堆栈是每个任务独立运行的前提条件,局部变量优先使用寄存器,寄存器不足时使用任务堆栈空间。
  • 任务切换的核心函数vTaskSwitchContext用于选择下一个要执行的任务,支持通用方法和特殊方法。
  • 特殊方法依赖于特定架构的汇编指令,通常效率更高,但限制最大可用优先级数目为32。
  • 通过计算前导零指令CLZ,特殊方法可以更高效地找到最高优先级的就绪任务。
  • 任务切换完成后,新的任务将被执行,确保系统的实时性和响应性。
➡️

继续阅读