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.

[参考译文] 编译器/MSP432P401R:堆栈使用情况

Guru**** 2606355 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/653059/compiler-msp432p401r-stack-usage

器件型号:MSP432P401R

工具/软件:TI C/C++编译器

我希望在代码中"监控"堆栈使用情况、以便确保分配了足够的堆栈大小。   我的项目有一个显示屏、因此这个堆栈的最大使用量是我诊断显示屏的一部分。

在 MSP430中、在引导时、我用"0xAAAAAAA"填充堆栈、然后从堆栈末尾定期回读、直到内容不是0xAAAA。

我没有找到访问 MSP432中的堆栈的读取/写入方法。

如果有人已经找到了一种在 MSP432中监控堆栈使用情况的方法、我想听听您的意见。

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    链接器会创建两个符号:__STACK_END 和__STACK_SIZE。 堆栈向下增长。

    当前 SP (R13)可使用__get_msp ()检索,该函数似乎返回 uint32_t

    您的项目将获得 startup_msp432p401r_ccs.c 的专用副本、这似乎是执行初始化的好地方(小心看门狗)。

    几年前、我在[其他人]的 Cortex 上进行过这种操作、我记得这并不是太困难。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    几年前、我跳过了一个程序(脚本?) 可能执行静态堆栈分析的位置。 我将其用于 MSP430、但我记得它是从 C 源代码开始的、因此它可能也适用于 MSP432。 它做得相当好--它主要是函数指针问题(printf 很重要)。

    我刚通过粗略的搜索无法找到它。 我提到这一点是为了希望有比我更好的记忆的人能够发言。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="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;