您好、TI、
我目前正在项目中使用 MSP430FR5043 MCU。 我想在我的代码中执行运行时堆栈分析。 因此、我使用 IAR 嵌入式工作平台编写了以下代码。
我想填充整个堆栈的一些随机工作、并且需要在 while 循环的末尾进行检查、以确保堆栈内存不应在90%标记后发生变化。
如果有上述任何其他情况、我需要了解更好的实施。 请告诉我 上面的代码是否最合适?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好、TI、
我目前正在项目中使用 MSP430FR5043 MCU。 我想在我的代码中执行运行时堆栈分析。 因此、我使用 IAR 嵌入式工作平台编写了以下代码。
我想填充整个堆栈的一些随机工作、并且需要在 while 循环的末尾进行检查、以确保堆栈内存不应在90%标记后发生变化。
在典型的嵌入式应用中、起始堆栈地址将位于 SRAM 的顶部。 底部由用于管理堆的符号 sbrk 确定。 (malloc()和朋友)您的程序对该堆栈段毫不关心,并且很乐意将数据推送到堆栈外部。 在这种情况下、管理堆的代码将检查分配的内存是否会将 sbrk 扩展到堆栈指针之上、但我不会对其进行计数。
通过检查源代码、您可以公平地了解所需的堆栈空间大小。 计算自动变量所需的空间大小、为每个函数调用添加更多空间(返回地址加上保存的寄存器以及可能不适合寄存器的参数)。 通过代码查找最深的调用树、或者至少查找需要最大空间的树。 (您可以使用类似于 Linux 程序 cflow 的内容来生成调用图。) 如果看起来有问题、请尝试找到可以节省参数空间的位置。 避免递归函数。