工具/软件:TI C/C++编译器
我希望在代码中"监控"堆栈使用情况、以便确保分配了足够的堆栈大小。 我的项目有一个显示屏、因此这个堆栈的最大使用量是我诊断显示屏的一部分。
在 MSP430中、在引导时、我用"0xAAAAAAA"填充堆栈、然后从堆栈末尾定期回读、直到内容不是0xAAAA。
我没有找到访问 MSP432中的堆栈的读取/写入方法。
如果有人已经找到了一种在 MSP432中监控堆栈使用情况的方法、我想听听您的意见。
谢谢
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 C/C++编译器
我希望在代码中"监控"堆栈使用情况、以便确保分配了足够的堆栈大小。 我的项目有一个显示屏、因此这个堆栈的最大使用量是我诊断显示屏的一部分。
在 MSP430中、在引导时、我用"0xAAAAAAA"填充堆栈、然后从堆栈末尾定期回读、直到内容不是0xAAAA。
我没有找到访问 MSP432中的堆栈的读取/写入方法。
如果有人已经找到了一种在 MSP432中监控堆栈使用情况的方法、我想听听您的意见。
谢谢
[引用用户="Bruce McKenney47378]几 年前,我跳过了一个程序(脚本?) 埋在 CCS 中的某个位置、该位置可以执行静态堆栈分析。有 一个 call_graph 程序、它是 CG_xml 包的一部分-请参阅 了解静态堆栈使用情况。 这未集成到 CCS 中、但可以从命令行或 CCS 中的编译后规则运行。 call_graph 可用于使用 TI ARM 编译器的 Cortex-M 器件的程序。
从 CCS 6.2开始、有一个"Stack Usage"视图。
我认为 call_graph 优于 CCS Stack 视图、因为:
a) call_graph 允许在文本文件中指定间接调用(函数指针)、 CCS Stack Usage 视图在工作区中存储间接调用的注释、而不是用户指定的文件-请参阅 "="" view="" to="" use="" text="" "indirect"="" files="" like="" the="" cg_xml="" call_graph="" utility?"="">CCS 6.2 "Stack Usage"视图是否可以使用 CG_xml call_graph 实用程序等文本"间接"文件?
b)发现 CCS Stack 视图未报告堆栈使用情况的情况-请参阅 CCS/MSP430FG4618:CCS 7.2堆栈使用情况在发生函数符号混叠时可以不报告堆栈大小要求
感谢您提供信息。 _stack_end 和_stack_size 实现了这一目标。
这是我的代码。
#define STACK_魔术 值0x33445566
#define STACK_TOP_PROTECTED (20*sizeof (uint32_t))
extern unsigned long __stack_end;
extern unsigned long __stack_size;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//我们假设 StackWipe 在引导时被调用,然后从底部开始
//我们搜索它填充的堆栈,直到找到“找不到幻数”
//并假设这是执行期间压入栈的值。
//返回堆栈可用(未使用的字节,255或更少)
uint8_t StackChecker( void )
{
uint32_t 未使用= 0;
uint32_t* pStackBottom =(uint32_t*)(__stack_end -__stack_size);
uint32_t* pFed=pStackBottom +(_stack_size/sizeof (uint32_t)- stack_top_protected);
while (pStackBottom < pFeded)
{
if (*pStackBottom++== stack_magic_value)
未使用+= sizeof (uint32_t);
其他
中断;
}
if (未使用> 255)
未使用= 255;
返回(uint8_t)未使用;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//用魔术值填充堆栈(除了前几个字节)
void StackWipe ( void )
{
uint32_t* pStackBottom =(uint32_t*)(__stack_end -__stack_size);
uint32_t* pFed=pStackBottom +(_stack_size/sizeof (uint32_t)-stack_top_protected);
while (pStackBottom < pFeded)
*pStackBottom++= stack_magic_value;
}