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/CC2650MODA:看门狗根本不起作用。

Guru**** 2540720 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/627975/ccs-cc2650moda-the-watchdog-doesn-t-work-at-all

器件型号:CC2650MODA

工具/软件:Code Composer Studio

大家好、

我尝试在项目中配置看门狗。 我补充了一些示例并阅读了用户指南。 要检查 wotchdog,我从循环中特别注释了过程“Watchdog_clear()”,并将超时配置为15秒。 我在看门狗打开期间检查了参数中给出的所有选项变体、但结果与选项无关。

在测试过程中、我看到了下一个问题:

在第一个超时后的调试期间、程序停止、在相同的超时周期之后、编译器给出了进行复位的错误、但程序不会重新启动并提醒已取消。

2.如果我按下电路板上的 RESET 按钮、程序将从开始启动、但看门狗不再进行任何复位。

3.如果我在没有调试的情况下启动项目,看门狗根本不起作用。

4.我尝试设置选项 WatchDogParams.resetMode = Watch_reset_off 并将断点放置到回调函数中、但程序挂起并且没有进入断点。 当我尝试对断点进行网络化时、同样的问题触觉。 仅当第二次超时后、编译器在重新启动时未给出任何错误时、才会出现问题。

当我尝试将编译器从调试模式切换到实现模式时、也会出现同样的问题。

代码的参数、其中的下一个:

包括:

#include

主函数中的初始化:

Board_initWatchdog();

/*创建看门狗。 *
Watchdog_Params_init (&WatchDogParams);
WatchDogParams.callbackFxn=WatchDogCallBack;             //注释此选项不会改变任何内容。
WatchDogParams.resetMode = Watchdog_reset_on;          //此选项不会改变任何行为,因为在调试选项中不会接收到程序搜索和红色消息。
WatchDogParams.debugStallMode=Watchdog_DEBUG_STALL_ON; //此选项不起作用,因为看门狗超时的传递速度比程序速度快。
WatchDogParams.custom=0;
WatchDogHandle = Watchdog_open (Board_WATCHDOG0、&WatchDogParams);
如果(!WatchDogHandle)

System_printf ("看门狗未打开");

//WatchdogHandle、WatchdogHandle、WatchdogToTicks (WatchDogHandle、15000);
WatchdogHandle;

任务中的循环:

void 心跳 Fxn (UArg arg0、UArg arg1)
{
uint_fast16_t uartTxBufferOffset;
uartTxBufferOffset = System_sprintf (uartTxBuffer、"正在启动... \n\n");
UART_WRITE (UartHandle、uartTxBuffer、uartTxBufferOffset);
while (1)
{
//WatchdogHandle;
Task_sleep ((UINT) arg0);
PIN_setOutputValue (ledPinHandle、Board_LED0、!PIN_getOutputValue (Board_LED0));
T1 =时间(空);
LTM = localtime (&T1);
curTime =上升时间(LTM);
System_printf ("time (GMT):%s\n\r\n、curTime);
system_flush();
uartTxBufferOffset = System_sprintf (uartTxBuffer、"Time (GMT):%s\n\r\n、curTime);
UART_WRITE (UartHandle、uartTxBuffer、uartTxBufferOffset);
}


回调函数:

void WatchDogCallBack (UArg a0)
{
//uint_fast16_t uartTxBufferOffset;
//uartTxBufferOffset = System_sprintf (uartTxBuffer、"正在重新启动... \n\n");
//uart_write (UART、uartTxBuffer、uartTxBufferOffset);
WatchdogHandle (WatchDogHandle);
//SysCtrlSystemReset();
return;
}

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

    根据您当前的代码,看门狗不会复位,因为您在 WatchDogCallback()上清除或复位看门狗。

    -克尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Markel、
    是的、在这个代码中、"WatchdogCallBack (UArg0)"的回调函数中没有注释掉"WatchdogClear ()"、但是我尝试使用空的看门狗功能检查这个代码、而不定义回调以及使用"WatchDogParams.WatchDogParams.Mode = Watchdog_reset_on;"选项、但是测试结果是一样的。 尽管如此、当完全不使用清零命令时、看门狗根本不会重新启动模块。
    其他原因是什么。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Boris、

    看门狗复位会将处理器设置为启动时停止(HIB、请参阅 TRM 第5.6章)、其中启动代码停止 WFI (等待中断)指令。 这是您无法更改的、因此最好确保看门狗在调试模式之外工作。

    2和3。 看门狗取决于 MCU 时钟,当 BEATBEATFxn 命中 Task_sleep()时,处理器进入待机模式,此时钟不运行。 如果您的心跳 Fxn 处于活动状态、我们假设10ms (可能少很多)、则看门狗计时器15/0.010 = 1500秒后过期。 您可以解决此问题(并尝试看门狗按应有的方式过期)、在心跳 fxn 中的某个位置设置 while (1){}、以浪费时钟周期15秒、而不是将其设置为待机。

    4.现在尝试 使用 WatchDogParams.resetMode = Watchdog_reset_on、看看您是否可以使其使用1-3中的信息。

    此致、

    Klas

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

    大家好、Klas、

    感谢您的回答。

    我尝试将 task_sleep()更改为 while (1)、并且重新启动在实际运行中起作用、尽管它不会影响调试模式、但它并不重要。

    但是、尽管如此、我还有其他一些问题:

    1.当我尝试将选项“Watchdog_reset_on”更改为“Watchdog_reset_off”并将命令“System_printf (“watchdog \n\r\n”);”置于调试模式时,算法不会进入此回调函数,并且实际运行程序搜索,并且不会在屏幕上打印任何内容 (如果将回调函数设为空、也会使用相同的程序流明)。 问题可能出在哪呢?

    2.A.是否可以通过特殊命令从算法重新启动处理器?

      B.如果是,它是哪一个命令?

      c.如果将此命令置于安全装置回调函数中,即使在任务循环中使用了命令"task_sleep(),也可以通过安全装置重新启动处理器吗?

    此致

    Boris Fridman

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

    您好、Boris、

    看门狗主函数是在发生意外情况时重新启动处理器。 您似乎正在尝试安排重新启动,在这种情况下,我将使用 Power_shutdown () API。 是这样吗? 您可以在此处阅读更多相关信息(第2.3节和第3.1.2节):  


    此致、

    Klas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Klass、
    我正在开发 LowPower 项目。 它可以在小容量电池上工作、由于等待期间的这种重新启动、我必须将处理器置于睡眠模式(通过提供命令 tasksleep)、而不是在那里放置" wile()"循环。 但是、作为最重要的项目、我必须在那里放置能够与这个低功耗项目一同工作的看门狗。 因此、如果通过写入算法的方式独立搜索处理器、我会搜索集成此片上看门狗的可能性。

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

    您好、Boris、

    设置 while 循环只是为了尝试看门狗按预期工作。 这是一个针对意外情况的仿真。 当您看到看门狗确实起作用时,您必须删除 while 循环,并像往常一样返回使用 task_sleep()。 您可以根据需要使用 Task_sleep、其值也比看门狗超时值高。 对我来说、听起来看门狗确实按预期运行、您可以继续进行项目并在需要时使用 Task_sleep。

    如果我有任何误解、请告诉我。

    此致、

    Klas