请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:CCStudio-MSP 工具/软件:TI C/C++编译器
您好,
我需要一种方法来查看我的MSP应用程序中使用了多少C++堆栈-传统的方法是使用已知模式"毒化"堆栈,然后查看其中多少被烧毁。
所以我写了以下几句--希望人们认为它是有用的:
以下代码允许您执行此操作,并随时检查在高峰使用期间消耗了多少预分配的堆栈,即您的应用程序与堆栈底部的距离有多近,或者实际上是否过度运行。 TI CCS文档为定义堆栈大小和起始点的全局符号提供的名称完全错误-需要更新,
将此代码(或类似代码)粘贴到要报告/检查堆栈使用情况的任何位置<初始化后堆栈上剩余的最小边数>/<堆栈的配置大小>。
#if defined(stack_check)
std::printf("Stack:%d/%d\n", stackMinFreeCount(),stackMaxSize());
#endif
然后,在主代码中,您需要尽早使堆栈中毒,然后定义报告例程:
//定义stack_check以包括堆栈使用诊断
#define stack_check
#if defined (stack_check)
#define stack_init 0xBEEF //模式,用于最初使堆栈
外部中毒uint16_t _stack; //堆栈开始(低地址)
uint16_t stackMinFreeCount(void);
uint16_t stackMaxSize(void);
#endif
#if defined(__cplusplusplusplusplus)
extern "C"
{
#endif
#if defined(__TI_Compiler_version__)||\defined (__gplus_)
#if defined (stack_check)
////
使用定义的模式逐字放置堆栈
////
请注意,_system_pre_init是最早的,我们可以
//执行此操作,并且在TI-RTOS中可能无法执行
此操作
,当我们调用__GET_SP_CCS内在过程时(在IAR和寄存器上相同), 它将返回
此例程调用方RET地址的地址//。 确保我们不会将其丢弃!!
//
register uint16_t *stack =&_stack;//在.stack部分中的最低地址
register uint16_t *stack_top = redefendere_cast<uint16_t *>(__GET_SP_register());
做{*stack++
= stack_init;// poison stack addresses
while (stack <stack_top)
返回<stack_stack_return 1;<1
;要退出堆栈<1
#if defined(__cplusplusplusplusplus)
}
#endif
#if defined(stack_check)
/**
检查堆栈使用的深度
*
*\return \c uint16_t 堆栈底部的最小字节数
*/
extern uint16_t __stack_end; //数据
外部末尾_uint16_t __stack_size; //堆栈
uint16_t stackMinFreeCount(void)
{
const uint16_t *stack =&_stack;
uint16_t freeCount = 0;
while (*stack == stack_init && stack++<=&__stack_end)
{
freeCount++;
链接器返回freeCount+<1;}/+*返回堆栈大小设置为C**的返回堆栈大小 stack_size选项
*
*\return \c uint16_t 已配置堆栈的最大大小(以字节为单位
)*/
uint16_t stackMaxSize (void)
{
return static_cast<uint16_t>(_symval(&__stack_size)));
}
#endif
int main(std)
{...
stackstackf)#if
defined(stackf_check