1112|9

321

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

FreeRTOS怎样分配任务堆栈大小 [复制链接]

最近寡人在使用FreeRTOS的时候老是碰到一些稀奇古怪的软件BUG,网上搜了一圈后发现似乎这些问题都是我一个人遇到,搜索结果毫无头绪。而且这些BUG让人有点无从下手。比如软件运行在内核代码中莫名其妙它就进入HardFault了,这个问题还好说一点大概你还能想到可能是堆栈溢出了,但是你却无法定位究竟是哪一个任务的堆栈出了问题。再比如当你在等待一个任务通知位阻塞任务时:另外一个不相干的任务通知位突然毫无征兆的打断了任务阻塞状态,对此你根本毫无头绪。此时你的代码就像是一个千疮百孔的巨轮随时都有沉入海底的风险,总有一种无助到泪流满面的感觉。但是如果你充分信任FreeRTOS本身,那以上所有问题的根源我认为很可能都是由于堆栈溢出所导致的问题。那么此时你就需要一个火眼金睛的工具来告诉你到底是什么任务的堆栈出了问题,这些任务的堆栈究竟要分配多少才不会溢出?这个问题同样困扰了我很久,网上也搜索过但是一直没有找到满意的答案。事情的转机刚好就发生在今天上午一个神奇的时刻:楼主之前使用过TI的CCS软件,对它的堆栈分析功能印象深刻,我想到STM32CubeIDE的软件和TI的CCS软件同样都是基于eclipse,本是同根生CCS可以没理由STM32CubeIDE不行啊?此时我总算是开窍了,从此一发不可收拾,终于让我找到了正确的解决问题的方法:

点击红框中的“Max cost”可以将堆栈占用最高的函数排在最前
 
根据“Max cost”中的值将对应任务堆栈分配略大于即可,另外本次探索我还发现了另外一个好玩的东东:

翻译了才知道这个工具是用来分析函数复杂度的complexity值越高函数就越复杂,我这个函数的complexity值最高的已经到了89了,这个函数连我自己看起来都有点费劲,因此对继承者很不友好。

 

此帖出自stm32/stm8论坛

最新回复

现在的各种插件挺方便的,还可以查看休眠在哪个锁上,以前做RTOS是没有这种待遇的。   详情 回复 发表于 2024-7-16 13:37
点赞 关注
个人签名模电临时工
 

回复
举报

6813

帖子

11

TA的资源

版主

沙发
 

我感觉如果不考虑运行功耗,最好是往大了调吧。不用白不用。

此帖出自stm32/stm8论坛

点评

MCU的功耗只和运行频率和外设工作状态有关,和RAM占用没有关系的  详情 回复 发表于 2024-7-14 10:47
 
 

回复

221

帖子

2

TA的资源

纯净的硅(初级)

板凳
 
lugl4313820 发表于 2024-7-14 06:56 我感觉如果不考虑运行功耗,最好是往大了调吧。不用白不用。

MCU的功耗只和运行频率和外设工作状态有关,和RAM占用没有关系的

此帖出自stm32/stm8论坛
 
 

回复

221

帖子

2

TA的资源

纯净的硅(初级)

4
 

FreeRTOS自己就有堆栈占用和CPU占用分析,好好用工具也容易发现问题

此帖出自stm32/stm8论坛

点评

这种的需要在软件运行以后串口打印出来吧?如果发生堆栈溢出程序就进入HardFault了你这个工具就失去作用了吧? Static Stack Analyzer工具不需要debug也不需要把程序烧写进MCU,只要编译完了就可以直接看到每个任  详情 回复 发表于 2024-7-14 14:06
 
 
 

回复

321

帖子

1

TA的资源

一粒金砂(高级)

5
 
walker2048 发表于 2024-7-14 10:48 FreeRTOS自己就有堆栈占用和CPU占用分析,好好用工具也容易发现问题

这种的需要在软件运行以后串口打印出来吧?如果发生堆栈溢出程序就进入HardFault了你这个工具就失去作用了吧?

Static Stack Analyzer工具不需要debug也不需要把程序烧写进MCU,只要编译完了就可以直接看到每个任务的堆栈需求大小

此帖出自stm32/stm8论坛

点评

首先、你可以定期打印堆栈大小和占用比例,设置超过80%或者多少就打印错误。 其次、Static Stack Analyzer这个工具,不管是按名称还是按你的描述,都只是静态堆栈分析,在真正代码运行的时候,线程堆栈是动态变化  详情 回复 发表于 2024-7-14 22:25
 
个人签名模电临时工
 
 

回复

221

帖子

2

TA的资源

纯净的硅(初级)

6
 
shipeng 发表于 2024-7-14 14:06 这种的需要在软件运行以后串口打印出来吧?如果发生堆栈溢出程序就进入HardFault了你这个工具就失去作用 ...

首先、你可以定期打印堆栈大小和占用比例,设置超过80%或者多少就打印错误。

其次、Static Stack Analyzer这个工具,不管是按名称还是按你的描述,都只是静态堆栈分析,在真正代码运行的时候,线程堆栈是动态变化的,使用静态工具并不能保证分析出内存泄露,或者一些特殊运行状态下的爆栈情况。

人是活的,程序是死的。工具只是工具,好好利用才是关键。

此帖出自stm32/stm8论坛

点评

我觉得定期打印的办法有很高的局限性,没有出现堆栈溢出的时候还能看一下堆栈的使用情况,如果真出现堆栈溢出了定期打印根本来不及反应就进入HardFault了  详情 回复 发表于 2024-7-15 19:12
 
 
 

回复

7421

帖子

2

TA的资源

五彩晶圆(高级)

7
 

现在的IDE对freertos支持挺好的,你翻翻应该还有线程插件

此帖出自stm32/stm8论坛

点评

这个有,之前用TI的CCS有用过,调试的时候可以发挥大用,STM32CubeIDE找了一下也有不过还没使用过  详情 回复 发表于 2024-7-15 19:16
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

321

帖子

1

TA的资源

一粒金砂(高级)

8
 
walker2048 发表于 2024-7-14 22:25 首先、你可以定期打印堆栈大小和占用比例,设置超过80%或者多少就打印错误。 其次、Static Stack Anal ...

我觉得定期打印的办法有很高的局限性,没有出现堆栈溢出的时候还能看一下堆栈的使用情况,如果真出现堆栈溢出了定期打印根本来不及反应就进入HardFault了

此帖出自stm32/stm8论坛
 
个人签名模电临时工
 
 

回复

321

帖子

1

TA的资源

一粒金砂(高级)

9
 
freebsder 发表于 2024-7-15 18:50 现在的IDE对freertos支持挺好的,你翻翻应该还有线程插件

这个有,之前用TI的CCS有用过,调试的时候可以发挥大用,STM32CubeIDE找了一下也有不过还没使用过

此帖出自stm32/stm8论坛

点评

现在的各种插件挺方便的,还可以查看休眠在哪个锁上,以前做RTOS是没有这种待遇的。  详情 回复 发表于 2024-7-16 13:37
 
个人签名模电临时工
 
 

回复

7421

帖子

2

TA的资源

五彩晶圆(高级)

10
 
shipeng 发表于 2024-7-15 19:16 这个有,之前用TI的CCS有用过,调试的时候可以发挥大用,STM32CubeIDE找了一下也有不过还没使用过

现在的各种插件挺方便的,还可以查看休眠在哪个锁上,以前做RTOS是没有这种待遇的。

此帖出自stm32/stm8论坛
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表