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.

[参考译文] MSP430F5249:在计时器 ISR 中设置断点时、程序计数器损坏

Guru**** 665180 points
Other Parts Discussed in Thread: MSP430F5249, MSP430F5529, MSP430F5244, MSP-TS430RGC64C
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1000714/msp430f5249-program-counter-is-corrupted-when-setting-breakpoint-in-timer-isr

主题中讨论的其他器件:MSP430F5249MSP430F5529MSP430F5244MSP-TS430RGC64C

您好!

我正在使用 MSP430F5249进行调试。

我对断点有疑问。

1.在计时器中断的开头设置断点。
2.执行代码,代码将在计时器中断的开始处停止(在该断点被设定的位置)。
3.我在定时器中断内执行"单步进入"。
执行3次后、程序计数器会指出代码。

我 已确认流程1至4多次发生。

请告诉我 为什么在计时器中断执行"步入"时会发生4种现象。

谢谢、

科基

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

    您好、Koki、

    您是否降低了 CCS 中的优化设置? 反汇编屏幕截图是否显示了 PC 的最终位置?  是否启用了任何其他中断?

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

    >在计时器中断的开头设置断点。

    →优化设置如下。

     

     

    >反汇编屏幕截图是否显示了 PC 的最终位置?  

    → .map 文件中闪存的代码区域最大为0xFF80。

    PC 是指组 B 的存储器值(代码外)。

     

    >是否启用了任何其他中断?

    μ→对于中断、仅使用计时器。

    在定时器中断中、定时器中断不被禁用。

    "进入"在定时器中断被启用时执行。

    谢谢、

    科基

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

    您好、Koki、

    很遗憾、您的优化设置图片未显示。 此外、您的代码中是否使用了任何低功耗模式(LPMx)? 这可能会导致 CCS 中的调试问题、其中器件进入睡眠状态、CCS 可能会错误地读取 PC。 我建议在调试时以活动模式使用器件。 此外、为了验证计时器代码是否正常工作、我建议在代码的不同部分切换 IO。

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

    您好!  

    >很遗憾,您的优化设置图片未显示。

    →抱歉、优化设置如下。

    >您的代码中是否使用了任何低功耗模式(LPMx)?

    →是的、我在项目中使用 LPM3。

    1.在 main (主函数)中输入 LPM3 ()

    2.在定时器中断开始时从 LPM3更改为激活模式

    3.在定时器中断中执行"单步进入"

    4.当从定时器中断返回到主器件时、PC 显示的值不正确()

    PC 显示的值不正确是否与 LPMx 相关?

     

    >这可能会导致 CCS 中的调试问题,在这种情况下,器件进入睡眠状态,CCS 可能会错误地读取 PC。

    >我建议在调试时以活动模式使用设备。

    →是否有任何描述上述描述的文档?

    如果没有、请告诉我有关上述内容的更多信息。

     

    谢谢、

    科基

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

    您好、Koki、

    您的答复的格式很难区分您的评论和我以前的评论。 请使用线程中的报价功能、以使所有内容更易于阅读。 单击"答复"后、突出显示上方的文本、此时将弹出一个"报价"图标。 单击该选项可插入突出显示的任何内容以插入报价。 我已经用您的最新评论完成了这项工作。

    [引用 userid="465179" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1000714/breakpoint-in-timer-interrupt/3701119 #3701119"]抱歉,优化设置如下所示。

    很抱歉、您的图片未显示。 单击"答复"后、转到"插入">"图像/视频/文件">"上载">"(选择图像、最好是.jpg 或.png)">"确定"。

    [引用 userid="465179" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1000714/breakpoint-in-timer-interrupt/3701119 #3701119"]它是否与 LPMx 相关,PC 显示的值不正确?[/quot]

    最有可能。 我强烈建议在一个激活的调试会话期间使用激活模式或者最坏情况、LPM0。  如果您使用的是 LPM3、则 SMCLK 将被禁用。 对于 LPM0、SMCLK 是可选的激活状态、这意味着如果有一个时钟请求、它将保持激活状态。

    [引用 userid="465179" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1000714/breakpoint-in-timer-interrupt/3701119 #3701119"]

    是否有描述上述描述的文档?

    如果没有、请告诉我有关上述内容的更多信息。

    [/报价]

    您可以在用户指南的表1-2中找到操作模式。 了解工作模式非常重要、因为它们会影响系统时钟、这会影响调试。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="216616" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1000714/breakpoint-in-timer-interrupt/3701285 #3701285">抱歉,您的图片未显示。 单击"答复"后、转到"插入">"图像/视频/文件">"上载">"(选择图像、最好是.jpg 或.png)">"确定"。

    抱歉、优化设置如下所示。

    [引用 userid="216616" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1000714/breakpoint-in-timer-interrupt/3701285 #3701285">最有可能。 我强烈建议在一个激活的调试会话期间使用激活模式或者最坏情况、LPM0。  如果您使用的是 LPM3、则 SMCLK 将被禁用。 对于 LPM0、SMCLK 是可选的激活状态、这意味着如果有时钟请求、它将保持激活状态。[/引用]

    当前 TimerB0时钟源为 ACLK。

    从下表中可以看到、ACLK 在 LPM3模式下处于激活状态。


    因此、我认为这次你说的不是真的。

    就在这种情况下、我将 TimerB0的时钟源设置为 SMCLK、并使用 LPM0操作它、但发生了相同的现象(PC 显示的值不正确)。

    我当前正在运行的程序的详细信息 如下

    整个程序由主程序()和定时器 B0中断组成。

     ■主()

    重复 while (1)

    进入 LPM3→无操作→ 进入 LPM3→无操作→……

     μ■Timer_B0中断

    进入激活模式 →将偏移添加到 TBCCR0→无操作→ 返回主()寄存器

    它是重复 main ()→timerB0→main ()→timerB0 ()→....的源代码

    这次、在转换到定时器 B0的时序上设置一个断点并执行"单步进入"。

    然后、当从 Timer_B0 ()返回到 main ()时、PC 将显示一个不正确的值。

    如果我不执行"step into (单步进入)"(按"恢复"按钮重新启动程序)、PC 将显示正确的值、程序将继续运行。

    它与器件和程序无关、我认为这是 CCS 调试方法的问题、但我不确定原因。

    最棒的

     

    科基

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

    优化看起来不错。 这可能是 CCS 问题或限制。 如果在 CCS 中禁用汇编步进时禁用中断、会发生什么情况? 此外、他们使用的是哪个版本的 CCS?

    http://software-dl.ti.com/ccs/esd/documents/users_guide/ccs_debug-main.html#program-memory-load-options

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

    您好、James

    [引用 userid="216616" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1000714/breakpoint-in-timer-interrupt/3703164 #3703164">如果在 CCS 中禁用汇编步进时禁用中断、会发生什么情况? [/报价]

    我在 CCS 设置中禁用了中断、但 PC 显示的值不正确(0x1C0B0)。

     在正确的行为中、PC 返回到0x17f10。

     

    [引用 userid="216616" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1000714/breakpoint-in-timer-interrupt/3703164 #3703164"]他们使用的是哪个版本的 CCS?

    CCS 版本:10.2.0.00009。

    谢谢、

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

    感谢您提供这些详细信息。 我尝试使用 CCS v10.3和 MSP430F5529 LaunchPad 重复此问题。 我导入了 MSP430F55xx_TB_05.c 代码示例、该示例使用 ACLK 作为 Timer B 时钟源。 我在计时器 B0中断服务例程(ISR)的开头设置一个断点、然后运行代码。 在断点处、我单击"Step into (步入)"。 然后、我再次单击"Run"。 我反复地这样做、从未出现过问题。

    我没有 MSP430F5249 器件、但请分享您的代码、以便尝试在 MSP430F5529上重现问题。

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

    您好、James

    我还有一个 MSP430F5529 LaunchPad。

    因此、我使用 MSP430F5529 LaunchPad 验证了操作。

    [引用 userid="216616" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1000714/breakpoint-in-timer-interrupt/3705373 #3705373 "]请共享您的代码,以便我可以尝试复制 MSP430F5529上的问题。

    这种情况并不总是发生、但当我多次验证操作时、出现了"PC 显示的值不正确"的现象。

    我将附加源代码。

    e2e.ti.com/.../3201.main.c

    谢谢、

    科基

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

    您好、Koki、

    此问题是由尝试单步执行 main()中的 LPM 条目(不是 exit)引起的。 如果您不这样做、则可以在代码的其余部分中单步执行、而不会出现任何问题。 相反,当到达 LPM 条目函数 SET_LPM_Mode()时,单击绿色和黄色的“运行”按钮进入 LPMx。

    如果您遇到程序计数器指向未知或不需要的位置的情况、只需单击 Run 按钮、它应正确返回并继续。 这似乎表明当 CPU 进入睡眠状态时 JTAG 通信被中断或破坏。

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

    您好、James

    这只是调试方法的问题,对吧?

    [引用 userid="216616" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1000714/breakpoint-in-timer-interrupt/3708432 #370842"]这似乎表示 CPU 进入睡眠状态时 JTAG 通信中断或损坏。

    如果您想了解有关上述内容的更多信息、如果有任何适用的文档、请告诉我。

    谢谢、

    科基

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="465179" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1000714/msp430f5249-program-counter-is-corrupted-when-setting-breakpoint-in-timer-isr/3708740 #3708740"]这只是调试方法的问题,对吗?

    没错。 如果您删除了 LPM 并仅使用了活动模式、则不应出现此问题。

    [引用 userid="465179" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1000714/msp430f5249-program-counter-is-corrupted-when-setting-breakpoint-in-timer-isr/3708740 #3708740"]如果您想了解有关上述内容的更多信息,并且如果有任何适用的文档,请告诉我。

    此行为看起来与 MSP430F5529器件的 EM13勘误表非常相似。 我将检查该勘误表是否适用于 MSP430F5249。 同时、我只需使用前面介绍的权变措施、或者在调试时切换到工作模式。

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

    您好、James

    [引用 userid="216616" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1000714/msp430f5249-program-counter-is-corrupted-when-setting-breakpoint-in-timer-isr/3709728 #3709728"]。 我将检查该勘误表是否适用于 MSP430F5249。

    实际上、要商业化的器件是 MSP430F5244。

    在详细解释当前情况时、MSP430F5249和 MSP430F5244中会出现相同的现象。

    因此、如果您不仅可以检查 MSP430F5249、还可以检查 MSP430F5244的勘误表、我将不胜感激。

    谢谢、

    科基

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="465179" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1000714/msp430f5249-program-counter-is-corrupted-when-setting-breakpoint-in-timer-isr/3710264 #3710264"]

    在详细解释当前情况时、MSP430F5249和 MSP430F5244中会出现相同的现象。

    因此、如果您不仅可以检查 MSP430F5249、还可以检查 MSP430F5244的勘误表、我将不胜感激。

    [/报价]

    是的、这并不奇怪、因为它们只是存储器变体。

    我可以验证 F5529上是否存在 EEM13。 在具有 LPM3进入和退出的 CCS 项目中、我运行了代码、在 ISR 中放置了一个断点、代码在那里暂停、删除了断点、运行了代码、然后单击暂停。 PC 丢失。

    他们可以在 F524x 上尝试此过程吗? 如果发生同样的情况、那么我怀疑这是同一个勘误表。 无论如何、我会鼓励您的客户继续进行软件开发、并且在调试时可能不使用 LPM。

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

    您好!

    [引用 userid="216616" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1000714/msp430f5249-program-counter-is-corrupted-when-setting-breakpoint-in-timer-isr/3711395 #3711395"]他们是否可以在 F524x 上尝试此过程? [/报价]

    是的、我们已确认。

    F524x (F5244和 F5249)上的上述代码也证实了这一现象。

    [引用 userid="216616" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1000714/msp430f5249-program-counter-is-corrupted-when-setting-breakpoint-in-timer-isr/3711395 #3711395"]我怀疑它是同一个勘误表。

    如果您可以确认该现象、是否计划发布勘误表?

    [引用 userid="216616" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1000714/msp430f5249-program-counter-is-corrupted-when-setting-breakpoint-in-timer-isr/3711395 #3711395"]我鼓励您的客户继续进行软件开发,并且在调试时可能不使用 LPM。

    是的、我会告诉我的客户。

    谢谢、

     

    科基

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

    感谢您的确认。 在更新或发布勘误表之前、我们需要在一侧进行验证。 在即将到来的美国假期中、这可能需要一两周时间。 如果您在两周后没有收到我的回复、请回复此主题、要求更新。

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

    您好、Koki、

    我想用最新状态更新您。 我仍在等待要交付的样片、因此我可以验证这种行为。 感谢您的耐心等待、我将在收到样片后或下周向您更新、如果届时尚未收到样片。

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

    您好!

    谢谢! 我正在等待您的联系。

    如果您能获得有关 MSP430F5244是否会首先应用勘误表的信息、我将不胜感激。 (这是因为我的客户使用的器件是 MSP430F5244。)

    此外、在我们的结果中、它只会多次出现一次、因此请多次验证。

    最棒的

    科基

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

    您好、Koki、

    感谢您的耐心等待。 我终于收到了 F5249样片、并找到了相应 的 MSP-TS430RGC64C 目标板。

    最初、我能够使用客户的代码复制此问题。 但是、该行为与 F5529器件上的 EEM13勘误表相关的行为不一致。

    深入了解、我 发现此问题的根本原因与 用于内在函数的预处理器宏有关。

    #define set_LPM_Mode(x) __bis_SR_register(x)
    static const unsigned short SET_LP_MODE[5]={GIE, LPM0_bits|GIE, LPM1_bits|GIE, LPM2_bits|GIE, LPM3_bits|GIE};
    #define LPM3_CLR() __bic_SR_register_on_exit( LPM3_bits )

    在我删除这些宏并直接在代码中使用内在函数之后、我无法重现此问题。 如上所述、此问题的触发器是单步进入 LPM3进入功能、但现在可以完成此操作并且 PC 未损坏。 这里是我使用的代码。

    #include <msp430.h>
    
    #define TB0_CNT (8192)       /* 0.5sec = 8192 / 16384 */
    
    int main(void)
    {
    
        WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
        TB0CCTL0 = CCIE;                                            // TBCCR0 interrupt enabled
        TB0CCR0 = TB0_CNT;                                          // TB0_CNT / 32768Hz
        TB0CTL = TBSSEL__ACLK | MC__CONTINOUS | ID_1 | TBCLR;       // ACLK, continuous mode
    
        while(1)
        {
            __bis_SR_register(LPM3_bits + GIE);       // Enter LPM3, enable interrupts
            __no_operation();                         // For debugger
        }
    }
    
    /* Timer0_B0 interrupt service routine */
    #pragma vector = TIMER0_B0_VECTOR
    __interrupt void INT_Timer0B0ISR (void)
    {
        __bic_SR_register_on_exit(LPM3_bits);   // Exit LPM3
        TB0CCR0 += TB0_CNT;                     /* Add Offset to TBCCR0 */
        __no_operation();                       // For debugger
        return;
    }
    

    此外、ISR 结束时不需要"返回"。

    /* Timer0_B0 interrupt service routine */
    #pragma vector = TIMER0_B0_VECTOR
    __interrupt void INT_Timer0B0ISR (void)
    {
        __bic_SR_register_on_exit(LPM3_bits);   // Exit LPM3
        TB0CCR0 += TB0_CNT;                     /* Add Offset to TBCCR0 */
        __no_operation();                       // For debugger
        return;
    }

    请让您的客户在其设备上尝试此操作。 此外、请注意、由于没有支持该器件的目标板、我无法在 F5244上对此进行测试。 但是、由于这些器件非常相似(基本上是存储器变体)、因此两种器件的根本原因很可能相同。

    请告诉我这是否能解决他们的问题。

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

    您好!

    感谢您的检查。

    由于更改了程序描述方法、不再出现"将 PC 设置为不正确的位置"的现象。

    是否有任何其他内在函数需要小心处理、包括此现象(_bis_SR_register)?

    谢谢、

    科基

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

    您好、Koki、

    感谢您确认这解决了他们的问题。 我不建议重新定义或重新声明任何原始内在函数。 您可以在《MSP430优化 C/C++编译器用户指南》的表6-5中找到所有 MSP430内在函数。

    请将此主题标记为已解决。