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