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.

[参考译文] RTOS/CC2650:看门狗不工作

Guru**** 2473270 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/806189/rtos-cc2650-watchdog-not-working

器件型号:CC2650

工具/软件:TI-RTOS

我尝试将看门狗功能添加到一个经过大量修改的 sensortag 示例中。

软件版本: BLE SDK 2_02_02_25、TI RTOS 2_21_01_08、BLE 堆栈2-2-2和 CCS 7.4

在我的 board.c 中、我有:

#if defined (_TI_Compiler_version__)
#pragma DATA_SECTION (Watchdog_config、".const:Watchdog_config")
#pragma DATA_SECTION (watchdogCC26XHWAXWAttrs、".const:dogDogDogWATTRST")
#endif

WatchDogCC26XX_Object (看门狗 CC26XHWD_TOW26XWCC26XHCC26XHOT_TOWCC26XX_TOWCC26XHOT[CC26XHOT]、"CC26XHOTCC26XDogDog_TOWDOT

= CC26XX_TOWDON)#ENDON_TOW26
{
baseAddr = WDT_BASE、
.intNum = INT_NMI_FAULT、/* INT_WDT_IRQ 或 INT_NMI_FAULT? *
.reloadValue = 3000 /*以毫秒为单位重新加载值*/
}、
};

const Watchdog_Config Watchdog_config[]={
{
fxnTablePtr =&WatchdogCC26XX_fxnTable、
.object =&watchdogCC26XX 对象、// CC2650STK_WATCHDOG0 */
hwAttrs =&watchdogCC26XXHWAttrs /* CC2650STK_WATCHDOG0 *
}、
{NULL、NULL、NULL}、
};

const uint_least8_t Watchdog_count = CC2650STK_WATCHDOGCOUNT; 

在我的应用中:

#define WDT_MS 3000

void watchdog_callback (UArge handle){
Watchdog_clear ((Watchdog_handle) handle);
}


void watchdogtimer_init (){
Watchdog_Params wdParams;
uint32_t tickValue;

//打开看门狗
Watchdog_init();
Watchdog_Params_init (wdParams);

wdParams.resetMode = Watchdog_reset_on;
wdParams.debugStallMode = Watchdog_debug_star_on;
wdParams.callbackFxn =安全装置回调;
wdtHandle = Watchdog_open (Board_watchdog、&wdParams);// CC2650STK_WATCHDOG0
tickValue = Watchdog_convertMsToTicks (wdtHandle、WDT_MS);
Watchdog_setReload (wdtHandle、tickValue);
}

在主任务 init 中,我成功调用了:
watchdogtimer_init (); 

3秒后(WDT_MS 3000)出现硬件异常、操作系统正在旋转:

/*如果没有插入异常处理程序,请在此处旋转*/
while (Hwi_excHandlerFunc = NULL){
;
} 

我已经尝试了 e2e 中的一些东西、但没有一个对我有用:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果我理解正确、我需要在3000ms 超时内调用 Watchdog_clear (wdtHandle)以使器件保持活动状态? 在这种情况下、我可以使它正常工作。 然后、当我感应一个 HW 异常时、该异常由一个带有肮脏递归函数的外部按钮触发、然后器件会自动重新启动。
    不过、我不确定这是不是正确的方法。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sven、

    看门狗的工作方式使得第一个超时不会触发复位、而第二个超时(如果第一个超时未处理)将使器件复位。

    是否在回调函数中调用 Watchdog_clear()? 这将清除该标志并防止第二次超时复位器件。

    有关  更全面的说明、请参阅此处的驾驶员 Doxygen 文档。

    BR、

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

    感谢 Craig 的回复、但我仍然很困惑。

    我的理解如下:

    由于双超时行为、可以从看门狗回调函数内调用 watchdog_clear。 这样做将防止复位。 如果存在严重的软件问题、则不会调用此清除功能、器件将复位。

    但是、这不是我看到的行为。 如上面的代码所示,我确实使用了此回调函数与 watchdog_clear(),但在重新加载值之后,我的设备会进入 HW 异常或立即复位。

    我可以通过在重新加载期间内定期调用一个额外的 watchdog_clear()来解决这个问题,但我不确定这是否会一直按预期工作。

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

    一个简单的尝试就是在.cfg 文件中启用调试功能。

    -如果您有单独的内核项目(例如、TI 驱动程序示例就是这样做的)
    使用 Debug 内核项目(而不是 Release)内核项目。 有关如何更改内核项目的详细信息、请参阅 SimpleLink 用户指南。

    -如果这是一个 BLE 示例,它在应用程序项目中具有.cfg,
    请取消排除 ble_debug.cfg 文件并排除 ble_release.cfg 文件。 然后重新构建并运行、您应该会获得更多信息。

    -如果两者都不是上述两种、请对 debug.cfg 和 release.cfg 文件执行不同的操作、并在.cfg 中进行相应的更改。 注意:由于具有额外的调试功能、占用空间会增加。

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

    尊敬的 Seong:

    额外的调试功能看起来是让我长时间保持忙碌的好方法、但遗憾的是、占用空间太大。 我必须找到另一种方法。

    它实际上看起来好像从未调用过回调函数。 回调肯定不会被触发。 这是否有具体原因?

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

    您好!

    我建议您使用 SDK 中的 WDT 示例进行实验、然后在您的应用中实施该示例。

    另请注意、看门狗在待机期间被禁用、因此如果您的应用中需要看门狗以及低功耗、则使用外部看门狗。

    此致、