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.

[参考译文] MSP430FR2153:一般的 MSP430调试问题;跟踪代码曾经的位置?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1406342/msp430fr2153-general-msp430-debugging-question-tracking-where-code-has-been

器件型号:MSP430FR2153
Thread 中讨论的其他器件:MSP-FET

工具与软件:

我要尝试调试一个系统问题、但在确定它如何进入我们看到失败的状态时遇到了问题。  我有一个中断、被设置为最高优先级、但根据我所能知、它将随机错过该中断-我有一个"去抖"检查线路是否仍然为高电平、如果不是高电平、我会设置一个标志。  所以我已经找到了一种方法来抓住它发生的时候,但是,据我所知,这是没有理由发生的。  

过去、我使用逻辑分析仪来查看在故障发生之前运行的内存地址、但我不相信 MSP-FET 具有该特性。  我曾尝试通过堆栈指针沿着堆栈返回、但这似乎没有意义。  是否有任何方法可以查看"过去"并查看代码从何处跳转到中断... 看到中断触发之前正在运行哪些线路?  此外、它是非常随机的、所以我还没有在正常操作代码中找到断点、这个断点只在发生故障时停止、而不是在每次正常操作期间停止。

TIA

Justin

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

    我对您的断言感到困惑、其中中断已设置为最高优先级。 由于 MSP430具有固定的中断优先级、实现此目的的唯一方法就是不启用具有更高优先级的中断。 有些器件有一个中断比较控制器、它可以提供一些非常有限的方法来改变优先级。

    看起来您正在问如何分辨在进入 ISR 之前执行了什么代码。 的堆栈是实现该目的的唯一方法。 多数情况下。

    EEM 提供的跟踪缓冲器非常有限、可能会有所帮助。 见 slaa393

    如果提供更多有关中断源的信息将会很有帮助。 源、频率甚至 ISR 代码。

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

    我将使用 ICC 来设置优先级。  唯一激活的较高优先级的中断是 WDT、但该器件不会复位、因此我认为这不是触发的。  

       //设置中断优先级
       // 1. 相负载
       // 2. UART RX
       // 3. 检测信号
       // p2是相位加载中断、ILSR2是 ICCILSR0的位[5:4]、零(0b00)是最高优先级
       ICCIRSR0 = 0xFFCF;
       // eUSCI_A1针对 UART 通信的接收或发送中断、ILSR10是 ICCILSR1的 B[5:4]、1 (0b01)是中等优先级
       ICCILSR1 = 0xFFDF;
       //计时器 B0 (心跳)、ILSR21是 ICCILRS2的位[10:11]、3 (0b11)是最低优先级
       ICCILSR2 = 0xFFFF;
       //启用 ICC 模块
       ICCSC |= ICCEN;

    现在、我正在运行一个外部测试脚本、该脚本会发送一个脉冲以每大约100ms 触发一次中断。  脉冲宽度为~150us (我使用的是24MHz 时钟、因此这是一个长脉冲)。  在脉冲之间、脚本正在请求值、因此代码将通过其他函数运行。  脚本将在故障发生前运行数秒至数分钟。

    要明确的是、我看到的是、当中断被触发时、与中断关联的端口引脚有时不为高电平(使用示波器查看发生了什么)。

    下面是代码片段:

    #if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
    #pragma vector=port2_vector
    _interrupt
    #elif defined (_GNUC__)
    __attribute__((interrupt (port2_vector)))
    #endif
    空 P2_ISR (空)
    //#endif //#if GPIO_PORT_S1

       中频(P2IFG 和 PS_LOAD_BIT)
       {
           //相位加载中断
           __delay_cycles (100);
           if (! (P2IN 和 PS_LOAD_BIT)){
               ___ no_operation();
               POWER_GPIO_POUT |= POWER_FLAG;
               P2IFG 且=~(PS_LOAD_BIT);
               返回;
           }

    …………

    我正在使用该"电源标志"作为测试点、当这触发示波器时、PS_LOAD 引脚为低电平(已经有很长时间了)。  当发生这种情况时、代码不会处理中断、事件会失去序列。  也许我不需要去抖、但我不确定代码在做什么、以便它无法立即处理该中断。  代码中还有一些其他随机问题、我希望解决这些问题可以让大家了解其他问题。

    我来看看应用手册、看看是否可以提供一些选项、谢谢。

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

    鉴于此、您的代码中的其他情况会阻止对端口中断提供及时服务。 最有可能出现另一个 ISR。 (请记住、在进入 ISR 时禁用 MSP430中断。) 如果您不明白它是什么、请尝试禁用代码块。

    不确定为什么需要去抖。 数据表指定了50ns 的最小脉冲持续时间来触发端口中断。

    噢、我会使用 P2IV 寄存器、因为这会自动清除 IFG 位。 比显式清除它更容易和安全。

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

    "最有可能出现另一个 ISR。"  这也是我的想法。  考虑到我们正在运行的脚本、除了在通信期间(这是我最可能怀疑的)外、其他 ISR 不应处于活动状态。  我试图在禁用函数之前找到一种跟踪代码的方法、我过去曾看到过一次或两次、简单地更改代码组织会导致代码行为不同(很少见)。

    去抖只是我一直在做的事情,作为一个"以防万一"。  我现在似乎没有噪声问题、一直在考虑消除该问题。  谢谢、我很可能会在下一个版本中为所有人提供支持。

    我将尝试 IV 寄存器。  与去抖一样、手动清除标志只是一个"以防万一"、目的是确保没有其他中断将指针拉开(我知道、不应该发生这种情况)。

    感谢您的帮助。