工具与软件:
你好。 我正在摆弄看门狗设置、发现它根本不起作用。 我已经浏览了其他主题、我的看门狗配置似乎是正确的:
Watchdog_init(); Watchdog_Params_init(&wdgParams); wdgParams.callbackFxn = (Watchdog_Callback) wdgCallback; wdgParams.resetMode = Watchdog_RESET_ON; wdgParams.debugStallMode = Watchdog_DEBUG_STALL_ON; wdgHandle = Watchdog_open(CONFIG_WATCHDOG_0, &wdgParams); if (!wdgHandle) { while (1) ; } uint32_t tickValue = Watchdog_convertMsToTicks(wdgHandle, 10000); Watchdog_setReload(wdgHandle, tickValue);
Void wdgCallback(UArg handle) { SysCtrlSystemReset(); }
据我从文档中了解到的、看门狗会首先计数到零、然后重新加载计数器值、并在第二次倒计时到零时、MCU 应该会重新启动。 但是、这似乎没有任何效果。 我在回调中放置了一个断点、并使用"Memory"视图检查了 WDT 寄存器。 看门狗的寄存器似乎设置正确:控制寄存器的值为0x07 (NMI、复位启用、中断启用)、RIS 为0x01 (发生了超时事件)、MIS 为0x01 (发生了超时事件)。 即使这样、也不会发生我期望的电路板复位和代码重新启动。 如果我在调试时发生这种情况、我收到一个调试器断开连接的错误、但似乎不是真正的复位。
我还读到、在 NMI 上下文中调用 OS API 是不安全的、所以我在看门狗回调中尝试了另外两件事:while (1)循环和手动写入复位寄存器、如 SysCtrlSystemReset (HWREGBITW (AON_PMCTL_BASE + AON_PMCTL_O_RESETTL、AON_PMCTL_RESTL_SYSRN)= 1)。 这两种方法都不起作用。
我有一个两线程的程序、一个是 ZigBee 堆栈、另一个是我自己的线程、我在其上进行传感器测量并保持活动的 LED。 我可以告诉看门狗无法正常工作、因为我有一个 LED 在启动电路板时闪烁几次、还有一个活动 LED 每10秒闪烁一次。 启动指示灯不会亮起。 我从不复位看门狗、因此我希望电路板能够按照看门狗初始化过程中的配置每隔10秒进行一次自我复位。
我尝试了提供的看门狗示例、它能按预期正常运行、但那是一个单线程程序。 从 sys cfg 激活 watchdog0时、ZigBee 堆栈是否会检测它并自行清除看门狗?
目前、我希望能够强制以固定的间隔执行电路板复位、但似乎不清除看门狗还不够。 使用 util_timer 调用 SysCtrlSystemReset 也不起作用。
在特定情况下、如何强制进行电路板复位?