FreeRTOS的三处栈空间设置分析

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

在这里插入图片描述

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

2、中断处理中设置栈

在这里插入图片描述

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

3、任务切换中设置栈

3.1、任务栈空间的申请

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

3.2、任务栈空间的切换

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

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

在这里插入图片描述

  • 启动时使用300字节的临时栈空间,当开启任务调度器后,这300字节的栈空间边被丢弃,后续不会再使用
  • 开启任务调度后,进入中断先把现场保存到任务栈空间,然后切换到中断独有的栈空间进行中断处理,在返回中断前,从任务栈空间恢复现场
  • 疑问:
    • 启动时的300字节临时栈空间,就在启动时使用过一次,这不是会造成300字节的资源浪费?为什么不在启动开始就直接使用中断独有的栈空间?
    • 我在启动代码里测试,在start.S中直接使用中断处理特有的栈空间,也是可以正常运行的,所以我认为是300字节的临时栈空间不是必须的
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
FreeRTOS提供了空间溢出检测的功能,但它会引入任务上下文切换的开销,因此仅推荐在应用开发或测试阶段使用。这个功能可以帮助用户减少代码的错误并提高应用程序代码的质量。每个任务都独立维护自己的空间空间总量在任务创建时进行设定。通过使用函数uxTaskGetStackHighWaterMark(),可以查询指定任务的运行历史,其空间还差多少就要溢出,这个值被称为空间的"高水线"。在FreeRTOS源码的tasks.c文件,可以找到taskCHECK_FOR_STACK_OVERFLOW函数在任务上下文切换时被调用,这意味着软件检测溢出的方式具有一定的滞后性,只有在任务发生上下文切换时才会进行检测,而不能立即检测到任务堆栈溢出的问题。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [FreeRTOS任务堆栈溢出检测机制](https://blog.csdn.net/ybhuangfugui/article/details/120897699)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [freeRTOS文实用教程6--错误排查](https://blog.csdn.net/weixin_30784501/article/details/97942628)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

正在起飞的蜗牛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值