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.

[参考译文] 编译器/CC430F5137:如何在一个&quot 之后分析堆栈;运行到文件中"

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/855154/compiler-cc430f5137-how-do-i-analyze-the-stack-after-a-run-into-the-weeds

器件型号:CC430F5137

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

尊敬的专家:

我的嵌入式固件目前有一个程序"运行在杂草中"的案例。 我怀疑函数指针或堆栈本身会以某种方式损坏、但它充其量只是一个猜测。

因此、我的目标是首先确定处理器所使用的最后一段实际合法代码、然后再发生错误。

首先、我可以确认我肯定不会获得堆栈溢出。 我通过在 main()的开头写入已知值的栈,然后在崩溃后检查栈来检查它。

崩溃后、PC 始终指向值0x2B12、该值肯定不是有效的程序存储器位置(对于这个 MSP430、应该高于0x8000)。 该位置实际上是堆栈本身中的一个位置。

当程序崩溃时、我在 CCS (v7.4.0)中看不到调试器的调用跟踪。 此时 SP 的值为0x2B26、仍在堆栈边界内。

我已经尝试过 CCS 在调试视图中提供的特殊断点、例如"程序范围内中断"(低于0x8000)、"程序地址前中断"(0x2B12)"写入时的观察点"(特定的堆栈地址)。 然而,这些办法都不起作用。 我不确定硬件是否确实支持此功能、或者我只是使用了错误的功能。

您能否告知我如何分析堆栈以确定最后执行的函数? 可能有如此具体的提示和技巧?

提前感谢!

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

    您好!

    我不太熟悉 CC430系列器件、因此我不能完全确定它支持哪些类型的高级调试功能、但下一页中提供了一些资源、可帮助您调试这种事后剖析方案。  

    http://processors.wiki.ti.com/index.php/MSP430_Advanced_Debugging_using_CCSv5 

    我会将此主题推迟到器件专家处、因为他们将更加熟悉这些器件。  

    希望这对您有所帮助、

    拉斐尔

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

    您好!

    我已检查 CC430F5137器件勘误表(修订版 AA)、 CPU18存在与 PC/SR 寄存器损坏相关的错误。

    因为您已确认 没有堆栈溢出。 可能是由于错误。 请检查此错误。

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

    您好、冬季、

    非常感谢您的回复!

    所描述的 CPU18行为似乎与我在此期间获得的附加信息非常相关。

    在我的一侧、我进一步进行了调试、我将问题缩小到了 I2C 驱动器、该驱动器精确地使用 LPM 模式来极化 I2C 协议的某些事件。 例如、生成 I2C 启动条件、然后处理器进入 LPM0睡眠模式、直到 ISR 收到事件中断、然后再次唤醒处理器。 我正是这段代码导致了这种损坏、当我更换它和显式轮询循环(例如使用 while ()-loop)时、我不再遇到问题。

    但是、这还不能完全解决问题、因为根据代码、以前的开发人员(不再在这里工作)似乎确实意识到了这个硬件错误、而且似乎仍然出现了问题。 勘误编译器标志也已在 CCS 中设置。

    下面给出了一些示例代码

    在前台 I2C 驱动程序中生成起始条件:

    _generateStartCondition ();
    
    //输入 LPM0、启用中断
    _nop ();
    __bis_SR_register (LPM0_Bits + GIE);
    _nop ();
    




    在发送完所有字节后的 ISR 中:

    UCB0CTL1 |= UCTXSTP; // I2C 停止条件
    UCB0IFG &=~UCTXIFG; //清除 USCI_B0 TX int 标志
    __BIC_SR_REGISTER_ON_EXIT (LPM0_Bits);//退出 LPM0 

    因此,我有两个问题:

    1) 1)这是否是针对 I2C 驱动器的 CPU18权变措施的正确用法? 如果没有、您能给我一个很好的用法示例吗?

    2) 2)实现 I2C 总线同步的首选方法是什么? 如前所述、我在没有针对轮询的 LPM 模式的情况下成功地使其工作、并且看起来工作正常。 我只是不确定这是否会对功耗产生重大影响。 我们只有一个单线程系统、并且我们不使用 I2C 总线进行扩展数据传输、可能每个周期小于~100字节。

    提前感谢!  

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

    您好!

    很抱歉耽误你的回答。

    CPU18错误已由编译器修复。 需要用户添加编译器或汇编器标志选项。 您不需要自己实施变通办法。 请查看下表以了解更多详细信息吗?