freertos任务切换的现场保存、恢复(任务栈空间)深度分析(以RISC-V架构为例)

本文详细阐述了RISC-V架构中任务控制块(TCB)的内存布局,包括栈的生长方向、任务创建时栈的初始化、切换任务时的现场保存和恢复,以及为何特定寄存器不保存在栈空间。
摘要由CSDN通过智能技术生成

1、任务控制块在内存中的布局

在这里插入图片描述

  • RISC-V架构采用的减栈,即栈向低地址空间生长;
  • 在freertos中采用任务控制块(TCB)结构来表示一个任务
  • 每个任务有自己的任务栈,任务栈是紧挨着TCB的,且TCB在地址高位,任务栈在地址低位。
  • TCB在地址高位,任务栈在地址低位的原因:xTaskCreate函数中先申请的任务栈,再申请的

2、创建任务时初始化任务栈

在这里插入图片描述

  • 线程函数的地址保存在mepc,这样在切换线程时就会把mepc寄存器中的值写到pc寄存器中,进而执行线程函数
  • 线程函数的传参保存在x10寄存器,也就是a0寄存器。因为按照RISC-V架构的函数调用规范,函数第一个参数是通过a0传递,可参考博客:《RISC-V架构的函数调用规范和栈布局》
  • xTaskReturnAddress是线程返回地址,没有特别需求可以设置成0
  • pxTopOfStack:记录栈顶,也就是当前栈被使用的最低地址(满减栈);
  • pxStack:记录栈空间的起始地址,以后要删除任务时,释放栈空间

3、切换任务时,保存任务执行现场

在这里插入图片描述

4、切换任务时,恢复任务执行现场

在这里插入图片描述

  • pxCriticalNesting:表示xCriticalNesting变量的地址
  • 把栈空间中保存的数据恢复到对应的寄存器、变量中,在执行mret命令返回后,CPU将会从mepc寄存器记录的地址处开始运行

5、为什么栈空间不保存x2、x3、x4寄存器

  • x2别名是sp(栈寄存器):sp寄存器保存在TCB的第一个成员里,不是保存在栈空间
  • x3别名是gp(全局寄存器):用于链接器松弛优化,不需要保存
  • x4别名是tp(线程寄存器):在操作系统中保存指向进程控制块,linux级别的操作系统才会使用该寄存器,freertos没有使用tp寄存器所以不用保存
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在起飞的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值