cortex M3处理器启动文件允许您指定专用于堆栈和堆的RAM数量。对于C++代码库,是否有一般的经验法则或也许更明确的方法来确定堆栈和堆大小的值?例如,您会计算唯一对象的数量和大小,还是使用编译后的代码大小?

最佳答案



这不是Cortex-M3的功能,而是开发工具链提供的启动代码。这是M3的Keil ARM-MDK默认启动文件的工作方式。这有点不寻常;通常,您将指定堆栈大小,并且链接器分配堆栈和静态内存后的所有剩余内存都将成为堆;可以说这会更好,因为您最终不会遇到无法使用的内存池。您可以修改它并使用其他方案,但是您需要知道自己在做什么。

如果使用的是Keil ARM-MDK,则链接器选项--info = stack和--callgraph会将信息添加到映射文件中,以帮助进行堆栈需求分析。这些技术和其他技术在here中进行了描述。

如果您使用的是RTOS或多任务内核,则每个任务都有自己的堆栈。该操作系统可能提供堆栈分析工具,Keil的RTX内核查看器显示当前堆栈使用情况,但不显示峰值堆栈使用情况(因此大多数情况下是无用的,并且仅在具有默认堆栈长度的任务中可以正常使用)。

如果必须自己实现堆栈检查工具,通常的方法是用一个已知值填充堆栈,然后从高地址开始检查该值,直到找到不是填充字节的第一个值,这将使likley栈的高潮标记。您可以实现代码来执行此操作,也可以从调试器手动填充内存,然后在调试器内存窗口中监视堆栈使用情况。

堆需求将取决于代码的运行时行为。您必须自己分析一下,但是在ARM/Keil Realview中,当C++的new引发异常时,将调用MemManage Exception处理程序;我不确定malloc()是这样做还是返回NULL。您可以在异常处理程序中放置一个断点,或修改处理程序以发出错误消息以检测测试期间的堆耗尽。还有一个__heapstats()函数,可用于输出堆信息。它的界面有点麻烦,因此我将其包装为:

void heapinfo()
{
typedef int (*__heapprt)(void *, char const *, ...);
    __heapstats( (__heapprt)std::fprintf, stdout ) ;
}

08-16 01:30
查看更多