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.

[参考译文] CCS/MSP430F5342:WDT ISR 持续运行时变量损坏

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/873175/ccs-msp430f5342-variable-corruption-when-wdt-isr-running-continuosly

器件型号:MSP430F5342

工具/软件:Code Composer Studio

您好!

我已修改了一些代码以增强产品功能。  部分修改是将 WDT (处于计数器模式)从一个定时周期内被调用(以唤醒处理器)更改为连续运行并使用一个计数器来唤醒处理器。 更改的原因是允许将2ms 时间计数用于计时目的。

 

但是、在代码的主要部分、我调用一个函数从外部 RTC 读取(紫色下方、未返回错误)。 没有 I2C 总线错误、子函数中的数据返回正确的值。 但是、在调用函数中、数据结构(rtcInput.DateTimeYear)中的一个变量现在为0而不是20 -数据结构中很少有其他元素被破坏。 这是一个不规则的偶然错误、假设在 ISR 在此期间执行操作时发生。

 

如果我停止 ISR (或者在调用之前禁用 ISR、之后重新启用 ISR)、则没有错误。

我无法理解 WDT ISR 为何会破坏数据。

谢谢
Mike

bool RTC_GetDateTime (DateTimer_MS * dataTimePtr)
{
bool retval = STATUS_SUCCESS;
volatile DateTime_MS rtcInput ={0};

//读取日期和时间寄存器
if (!USCI_B1_I2C_READ (RTC_SLAVE_ADD、RTC_seconds、sizeof (DateTimer_t)、(uint8_t*)&rtcInput)) retval = STATUS_FAIL; 

//此行允许断点捕获偶尔出现的日期错误,直到原因得到解决。
if (rtcInput.DateTime.Year =0)
rtcInput.DateTime.Year = 0;

//其他代码后跟…

//*********

//这是导致损坏的 ISR ...
#pragma vector=WDT_Vector
_INTERRUPT void WDT_A_ISR (void)
{
如果(!- timeoutWDT)
{
if (!contRunning) WDT_Stop ();
LPM3_EXIT;
}
mSeconds += WDT_INTERVE_MS;
如果(mSeconds >999) mSeconds = 999;

if (控制运行)
{
loopTime += WDT_INTERVE_MS;
if (loopTime > MAIN_LOOP_TIME)
{
LPM3_EXIT;
loopTime = 0;
}
}

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

    我的第一个猜测是 I2C 读取从 rtcInput 的末尾运行到调用方的堆栈框中(堆栈向下增长)。 也许这种危险总是存在的,而更频繁的 ISR "blip"已经将其推向了开放的状态。

    I2C 单元与时序有关、因此预测事件顺序并不总是那么容易。 我通过制作反缓冲区溢出防弹来获得。

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

    您好!

    I2C 似乎正在读取损坏的日期、并且正在读取该日期(学校男孩错误地使用指针来查看读取值!)。  无论如何、I2C 不会超时、但会读取并返回错误的值。

    在某些情况下(使用示波器并切换中断中的备用处理器引脚)、 虽然数据寄存器是读取序列中的第6个寄存器、并且是从 ReceiveByteFinish 函数读取的、这会终止读取周期、但在 I2C 正在进行过程中偶尔会发生中断、这会导致读取错误的值 (使用 ReadByteNext 函数读取其他值)。

    我很惊讶、如果 I2C 在中断期间暂停(需要~100us 才能完成)、作为由主代码控制的 I2C 时序、会出现错误。

    总之、我在使用 I2C 时禁用了中断、这似乎解决了这个问题。

    此致

    Mike

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

    尊敬的 Mike:

    感谢您关注我们的这一问题! 很高兴听到正在工作的消息。  

    Mitch