FreeRTOS的三处栈空间设置分析

1、汇编启动代码中设置栈

在这里插入图片描述

  • 这个栈空间只有300字节,是用于汇编启动代码早期,以及调用C语言的main函数(创建任务等)
  • 在创建好任务,启动调取器后,这个栈空间就被抛弃掉,后续不会使用到
  • 等调度器开启后,运行任务是使用每个任务自己的栈空间,进入中断也有中断专门的栈空间

2、中断处理中设置栈

在这里插入图片描述

  • 在每次进入中断时,先保存任务执行现场到任务自己的栈空间
  • 保存好任务执行现场后,把中断特有的栈空间写到sp寄存器,整个中断处理都使用专门用于中断处理的栈空间

3、任务切换中设置栈

3.1、任务栈空间的申请

参考博客:《freertos任务调度机制深度分析(以RISC-V架构为例)》

3.2、任务栈空间的切换

在这里插入图片描述
在这里插入图片描述

4、关于三处栈空间的思考?

在这里插入图片描述

  • 启动时使用300字节的临时栈空间,当开启任务调度器后,这300字节的栈空间边被丢弃,后续不会再使用
  • 开启任务调度后,进入中断先把现场保存到任务栈空间,然后切换到中断独有的栈空间进行中断处理,在返回中断前,从任务栈空间恢复现场
  • 疑问:
    • 启动时的300字节临时栈空间,就在启动时使用过一次,这不是会造成300字节的资源浪费?为什么不在启动开始就直接使用中断独有的栈空间?
    • 我在启动代码里测试,在start.S中直接使用中断处理特有的栈空间,也是可以正常运行的,所以我认为是300字节的临时栈空间不是必须的

猜你喜欢

转载自blog.csdn.net/weixin_42031299/article/details/134931853