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.

[参考译文] CC3230SF:卡在看门狗 RTOS 任务中

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1591713/cc3230sf-stuck-in-watchdog-rtos-task

器件型号: CC3230SF

以下是与看门狗相关的任务和函数:

void watchdogCallback(uintptr_t watchdogHandle) {
    UART_PRINT("WATCHDOG RESET!!!\n");
}

void initWatchdog(void) {
    Watchdog_Params params;
    Watchdog_Params_init(&params);

    params.callbackFxn = NULL;
    params.debugStallMode = Watchdog_DEBUG_STALL_OFF;
    params.resetMode = Watchdog_RESET_ON;

    watchdogHandle = Watchdog_open(CONFIG_WATCHDOG_0, &params);
    if (watchdogHandle == NULL) {
        UART_PRINT("Error opening Watchdog\n");
        while (1);
    }

    uint32_t reloadValue = Watchdog_convertMsToTicks(watchdogHandle, 12000);
    if (reloadValue != 0) {
        Watchdog_setReload(watchdogHandle, reloadValue);
    }
}


void watchdogTask(void *pvParameters) {
    (void)pvParameters;
    while (1) {
        vTaskDelay(pdMS_TO_TICKS(4000));

        Watchdog_clear(watchdogHandle);
        UART_PRINT("Watchdog fed!\n");
    }
}

以下是在主线程中创建看门狗任务的位置(几乎在线程的开头):

void mainThread(void *pvParameters)
{
    .
    .
    .
    // Creating a task for Watchdog
    if (xTaskCreate(watchdogTask, "WatchdogTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 8, NULL) != pdPASS) {
           UART_PRINT("Failed to create watchdog task\n");
           while (1);
       } else {
           UART_PRINT("Watchdog task created\n");
       }
    .
    .
    .

 

为了测试看门狗复位的实现情况、我尝试了以下方法:

void vMainTask(void *pvParameters) {
        UART_PRINT("STUCK IN WHILE LOOP");
        while (1)
            UART_PRINT(".");
        .
        .
        .

 我也尝试过 sleep () 来获得一个较大的延迟。

 

这是我获得的控制台输出:

image.png


我还尝试了提供看门狗:

  • 最低优先级 — 则只打印“.........."</s>“ “(在循环期间卡在 vMainTask 中)、即使没有狗被“馈送“、系统也不会复位。
  • 最高优先级 — 然后仅打印“Watchdog Feed!“ (如上面的控制台片段中所示“;狗不断被喂食。

即使系统卡在上述情况下、系统也不会复位。

欢迎就此问题提供任何帮助、并提前感谢!

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

    尊敬的:您是否可以参考 CC32xx SDK 中的看门狗驱动程序示例? 它提供了关于看门狗复位的指导、您可以使用  PRCMSysResetCauseGet () 来验证设备是否由于看门狗计时器而复位。

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

    你好 ,刘,谢谢你的答复。

    我已经了解了 CC32xx SDK 中的看门狗驱动程序示例、并发现它使用了心跳方法、但我们的项目执行 OTA 等任务以及需要等待用户响应的其他任务。 由于我们的代码中存在不确定的延迟、心跳方法可能不可行。 我想提供一些建议来修复我们当前实现的看门狗复位(POST 中的代码片段)。  

    此外,我真的没有机会使用 PRCMSysResetCauseGet (),因为它卡在 while 循环中,并且不会重置。

    此外、我想知道看门狗计时器可能的最大超时值。

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

    您好、

    谢谢您让我知道。 我将在本周结束时就此向您回复。

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

    您好、

    只是我在您的代码中注意到的几件事。

    1.你有一个 watchdogCallback 永远不会被调用,因为你将 params.callbackFxn 设置为 NULL(这里应该不重要)

    2.您在哪里调用 initWatchdog ? 假设您在某处操作、如果您不断馈送看门狗、则永远不会复位是合理的、因为 Watchdog_clear 会阻止生成复位信号(请参阅 Watchdog.h)

    3. PRCMSysResetCauseGet () 将是您在主线程中运行的第一行代码,因此每次设备重置时,您都会找出原因。

    4、最大超时时间如下所示

    您能向我展示项目的整个流程吗? 我想排除任何缺失的部分。