如何使用C++确定ARM Cortex的适当堆栈和堆大小

rma*_*aVT 12 c++ embedded arm cortex-m3

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

Cli*_*ord 16

cortex M3处理器启动文件允许您指定专用于堆栈和堆的RAM量.

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

如果你正在使用的Keil ARM-MDK,连接选项--info =堆栈和--callgraph信息添加到艾滋病堆栈需求分析映射文件.这里描述这些和其他技术.

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

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

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

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