4

我将 MSP430F2013 处理器用于没有 UART 的应用程序。我需要一个 UART,因此我使用了 TI 的示例代码“msp430x20x3_ta_uart2400.c”来模拟一个使用 Timer 模块的代码。这一切都很好(使用 IAR Embedded Workbench 编译),使用 PuTTY 将字符传输到开发板并使用环回将它们回显到终端对其进行了测试。

这是一个降低风险的练习,现在我已经将该代码移植到我的应用程序的状态机中。完成此操作后,我遇到了有关定时器中断和低功耗睡眠模式的问题。这是我进入低功耗(睡眠)模式的代码片段:

// Prepare the UART to receive one byte.
prepare_receiver();

// Enter low power mode 1.
__bis_SR_register(LPM1_bits + GIE);

// Check whether the full message has been received.
if(true == get_message_complete())
{
    process_event(e_euart_message_received, NULL);
}

我在调试器 (C-Spy) 上看到的是,有时它会bis_SR_register()在第一次进入时执行该行,然后转到if语句,即忽略我已要求它进入睡眠状态的事实。在其他情况下,当它应该进入睡眠状态时,ISR 会正确触发并最终将我带回if语句以继续程序执行(正如我所期望的那样)。但是,如果我尝试跳到下一条语句,应用程序会在第一行冻结,即我无法前进。

我想不出与我正在做的 TI 示例在功能上有何不同,所以我认为我的问题一定与我如何移植它有关。例如,我的 Timer ISR 和我在此处发布的代码位于不同的编译单元中 - 这种决定会对事情产生任何影响吗?我知道我的问题可能有点含糊,但不幸的是我不能发布我的所有代码,所以我正在寻找具有 MSP 经验的人,他们可能能够提出一些值得关注的事情或一些潜在的陷阱我可能陷入了。

4

2 回答 2

5

在低功耗模式下使用 C-Spy 调试中断会很棘手。根据第 A.3 节调试 (C-Spy) - IAR 用户指南

5) C-SPY 可以调试利用中断和低功耗模式的应用程序

但是您应该注意一些“陷阱”,这可能会导致您的头痛。

尤其:

14)当 C-SPY 控制了设备时,无论状态寄存器中低功耗模式位的设置如何,CPU 都处于开启状态(即不处于低功耗模式)。任何低功耗模式条件都会在 Step 或 Go 之前恢复。因此,当 C-SPY 控制设备时,不要测量设备消耗的功率。相反,使用发布了 JTAG 的 Go 运行您的应用程序

19) C-SPY 在调试过程中利用系统时钟来控制器件。因此,当 C-SPY 控制设备时,由主系统时钟 (MCLK) 计时的设备计数器等会受到影响。采取了特殊的预防措施,以尽量减少对看门狗定时器的影响。CPU 内核寄存器被保留。所有其他时钟源(SMCLK、ACLK)和外设在仿真期间继续正常运行。换句话说,Flash Emulation Tool 是一种部分侵入式工具

支持时钟控制(仿真器 → 高级 → 时钟控制)的设备可以通过在调试期间选择停止时钟来进一步减少这些影响

24)正常程序执行期间读取时清除的外设位(即中断标志)在调试时读取时清除(即内存转储、外设寄存器)。

使用某些 MSP430 器件(例如 MSP430F15x、MSP430F16x、MSP430F43x 和 MSP430F44x 器件)时,位不会以这种方式运行(即,位不会被 C-SPY 读取操作清除)。

26)当单步激活并启用中断时,可能会出现只有中断服务程序 (ISR) 处于活动状态(即,非 ISR 代码永远不会执行,单步操作总是在第一行停止的 ISR)。但是,这种行为是正确的,因为设备总是在处理非 ISR(即主线)代码之前处理一个活动且已启用的中断。此行为的解决方法是在 ISR 中禁用堆栈上的 GIE 位,以便在退出 ISR 后禁用中断。这允许调试非 ISR 代码(但没有中断)。稍后可以通过在寄存器窗口的状态寄存器中设置 GIE 来重新启用中断。

在具有时钟控制仿真功能的设备上,可以在单步之间暂停时钟并延迟中断请求(仿真器 → 高级 → 时钟控制)。

要尝试的一件事是注释掉所有低功耗代码并查看您的 UART 代码是否可以这样工作。然后返回并尝试重新启用低功耗模式。

于 2012-09-17T19:04:02.380 回答
4

这个问题的答案在于调试设置,更具体地说,在于使用了哪些类型的断点。我有一系列非常复杂的宏,它们在程序上传时运行,它们将各种挂钩设置到内存中以进行测试。这些钩子依赖于软件创建断点,然后调用应用程序外部的函数。我发现在正常使用中使用这些断点没有问题,但是它们的存在意味着调试会话不会实时运行(即,设备受主机 PC 的控制)。由于我尚未完全了解的原因,这在尝试调试中断和低功耗模式时引起了问题。(我怀疑如果我再深入一点,我会发现在调试时需要使用时钟控制,但我会留到另一天)。

因此,为了解决这个问题并允许我调试我的中断和低功耗模式繁重的代码,我已经将它们移植到我的更大的应用程序状态机中,我必须执行以下操作:

  1. Disable software breakpoints within IAR.
    They're not actually enabled by default, but if you've been doing clever things with macros like I had, you probably would've needed to enable them, since there just aren't enough hardware breakpoints available in most MSP430s (for instance, I only have two in the MSP430F2013, and C-SPY more often than not hogs one of those!). The obvious downside to this is that debugging becomes a bit more laborious, but at least it's reliable.
  2. Remove links to .mac Macro files.
    In other words, if you're using macros, don't. In my case, this meant that I had to hack some state machine logic in order to force myself down a certain route (that previously the macro had been doing for me). This clearly isn't ideal, but it will allow you to debug the interrupt/low power mode code. The macros can then be re-enabled afterwards.

So it turned out that there wasn't a problem with my port after all. I'm not particularly happy with this hacky solution, but at least it's a step forward. If I have the time, I'll investigate to see if I can work out a way of using software breakpoints and add to this answer.

于 2012-09-18T08:45:49.800 回答