有哪些方法可用于确定嵌入式/内存受限系统的最佳堆栈大小?如果它太大那么浪费的内存可以在其他地方使用.但是,如果它太小,那么我们得到这个网站的同名......
为了尝试快速启动:Jack Ganssle在"嵌入式系统设计的艺术"中指出,"凭借经验,人们可以学习标准的,科学的方法来计算堆栈的正确尺寸:随机选择尺寸并希望." 任何人都可以做得更好吗?
要求提供更具体的例子.那么,在没有操作系统的情况下使用IAR Embedded Workbench工具链,针对具有2 kB RAM 的MSP430 MCU的C程序怎么样?使用JTAG调试器时,此IDE可以显示堆栈内容和使用情况.
我正在为嵌入式系统编写启动代码 - 在跳转到main()函数之前加载初始堆栈指针的代码 - 我需要告诉它我的应用程序将使用多少字节的堆栈(或更大的,保守估计).
我被告知gcc编译器现在有一个-fstack-usage选项和-fcallgraph-info选项,它可以以某种方式用于静态计算我的"最大堆栈使用率".(" Botcazou,Comar和Hainque的编译时堆栈需求分析与GCC").
奈杰尔琼斯说,递归在嵌入式系统中是一个非常糟糕的主意("计算你的堆栈大小"2009),所以我一直小心不要在这段代码中做任何相互递归的函数.
另外,我确保我的中断处理程序都没有重新启用中断,直到它们最终从中断返回指令,所以我不需要担心重入中断处理程序.
如果没有递归或重入中断处理程序,则应该可以静态地确定最大堆栈使用情况.(所以大多数答案如何确定最大堆栈使用量?不适用).我的理解是我(或者最好是我的PC上的一些代码在每次重建可执行文件时自动运行)首先找到每个中断处理程序的最大堆栈深度,当它没有被更高优先级的中断中断时,最大值当main()函数没有被中断时,它的堆栈深度.然后我将它们全部添加到找到总(最坏情况)最大堆栈深度.当main()后台任务在被最低优先级中断中断时处于最大深度时发生(在我的嵌入式系统中),并且当中断被下一个最低优先级中断时,该中断处于其最大深度中断,等等.
我正在使用YAGARTO和gcc 4.6.0来编译LM3S1968 ARM Cortex-M3的代码.
那么如何使用-fstack-usage选项和-fcallgraph-info选项与gcc一起计算最大堆栈深度?或者是否有更好的方法来确定最大堆栈使用量?
(有关针对Keil编译器的几乎相同问题,请参阅如何确定嵌入式系统中的最大堆栈使用情况?)
我正在编程一些具有 64 MB SDRAM 的嵌入式设备。(C 用作编程语言)。是否可以猜测(甚至是粗略的猜测)该设备堆栈的可能大小?指的是在我们进行分配时使用的内存,例如,
char s[100];
int t[50];
Run Code Online (Sandbox Code Playgroud)
等等。
例如,它会超过50KB吗?等等,这就是我对粗糙的意思
加上当我在某个函数 f 中有变量时
f()
{
int p;
}
Run Code Online (Sandbox Code Playgroud)
当 f() 存在时,这个变量会消失吗?
所以当我调用 f2() 时:
void f2()
{
char t[100];
}
Run Code Online (Sandbox Code Playgroud)
只有 100 个元素的字符数组的大小才会添加到堆栈大小中,对吗?int p不再考虑先前函数的大小。