pendsv任务切换

psp栈指针

  • 在.bss段分配了FREERTOS的栈堆空间(在系统里面uc heap数组大小)大小

  • 所有创建的任务 如任务一的栈和tcb也在里面,还有队列等也会创建在里面

  • 在操作栈的时候就用到了我们的psp指针

二、任务调度

注意LR->R0都是硬件压栈 而其他的是软件压栈

(此处是M3权威指南的话)

也就是说假设task2 被切换任务的时候,会把当前寄存器压进task2自己的栈 而psp栈指针便前往task5的栈开始

三、启动流程

  • 任何时候,处理中断的时候,一定会切回MSP(主堆栈指针)

  • 而任务的切换是在pendsv里面的

四、切换任务过程

  • 当在执行某个任务进行切换的时候,psp栈指针会向下移动(栈指针从高地址往低地址移动),此时发生硬件压栈(从r0->r3,r12,lr,pc,xpsr),压进当前psp所指向的栈里面
  • 接着进入了pendsv中断函数里面,在上面有提及,在中断的时候,都是在msp栈里进行。
  • 通过伪代码知道,现在获取了psp的指针 并存储在了局部变量psp(此时局部变量的值都是在主栈里)当中

  • 接着检查psp指针是否有效,因为在刚上电的时候psp指针为0,如果有效的话 就会继续用软件压栈将R4-R11进行压栈,psp继续往下走,也就是把当前在cpu寄存器里面的值全部保存好在当前的任务栈中

  • 接着在保存完寄存器以后,找到当前任务的tcb地址,并把当前任务栈的指针地(PSP)址存到tcb第一个成员pxTOPOfStack保存起来,以方便后续回复任务进行弹栈

  • 接着看pendsv代码,会进行上下文的切换
  • 在调用了vTaskSwitchContext()这个函数之后,会更新pxCurrentTcb(全局变量)的值,也就是指向下一个就绪任务。

  • 紧接着就是将psp继续赋值,从新的pxCurrentTcb指针取出,此任务的栈顶地址

  • 接着就是消耗栈顶,也就是我们所谓的弹栈,回复r4-r11的寄存器(软件压栈,软件弹栈),剩下的硬件经行回复

  • 最后更新psp(之前的都是局部变量psp)的值

更多详细可以看一文读懂Freertos内核(大学生更懂大学生)-CSDN博客

相关推荐
changzehai21 分钟前
Rust + VSCode + probe-rs搭建stm32-rs嵌入式开发调试环境
vscode·后端·stm32·rust·嵌入式·probe-rs
CQ_YM15 小时前
ARM--SDK、led、beep与链接脚本
c语言·arm开发·嵌入式硬件·嵌入式
Jason_zhao_MR20 小时前
YOLO5目标检测方案-基于米尔RK3576开发板
linux·人工智能·嵌入式硬件·目标检测·计算机视觉·目标跟踪·嵌入式
断水客21 小时前
搭建ARM LINUX 内核 QEMU 仿真调试环境
linux·运维·arm开发·嵌入式
半条-咸鱼1 天前
C语言基础语法+STM32实践学习笔记 | 指针/寄存器核心应用
c语言·stm32·学习·嵌入式
Zeku1 天前
20260120 - Linux驱动学习笔记:SPI子系统核心层到具体硬件驱动
stm32·freertos·linux驱动开发·linux应用开发
明洞日记1 天前
【软考每日一练013】解析嵌入式网络数据库(NDB)架构
数据库·5g·嵌入式·软考·嵌入式实时数据库
乔碧萝成都分萝2 天前
二十四、Linux如何处理中断
linux·驱动开发·嵌入式
程序员老舅2 天前
【无标题】
c++·嵌入式·八股文·c++八股文·八股文面试题·c++面经·c++面试题
charlie1145141912 天前
现代嵌入式C++教程:对象池(Object Pool)模式
开发语言·c++·学习·算法·嵌入式·现代c++·工程实践