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.

[参考译文] TMS570LC4357:采用 FreeRTOS 的配置看门狗示例

Guru**** 2460010 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1165710/tms570lc4357-example-of-configuration-watchdog-with-freertos

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

您好!

我目前 正在通过 FreeRTOS 系统使用看门狗模块。 在 main 中、我使用 dwInit()和 dwdCounterEnable 来初始化和启用看门狗。 然后、在任务中、我重置看门狗、但当我在另一个任务中使用无穷大环路对此进行测试时 、看门狗不起作用。 是否有任何将看门狗与 FreeRTOS 配合使用的示例?

提前感谢。

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

    您好、Pablo、

    当选择 FreeRTOS 时、HALCoGen 不会生成 RTI 驱动程序和 DWD AP。

    RTI 看门狗密钥寄存器应在特权模式下编程。  MCU 可以在特权模式或用户(非特权)模式下执行代码。 在用户模式下执行的代码不能写入受保护的寄存器、也不能访问其自身堆栈和为其配置的 MPU 区域之外的 RAM。

    在 xTaskCreate()中,uxPriority 用于设置初始创建任务的优先级。 在 xTaskCreateRestricted()中,它还用于将任务设置为特权模式或用户模式。  要使用 portPRIVILEGE_BIT 创建特权模式任务、按位或所需的任务优先级。

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

    尊敬的 QJ Wan:

    非常感谢您的回复。
    我将 xTaskCreateStactic 与 portPRIVELGE_BIT 参数一起使用、现在它可以使用、 但 由于 MCU 复位后的某些原因 、这会导致中止。 由于我使用 FreeRTOS、因此程序中的 MPU 已禁用。
        // Create FreeRTOS watchdogTask
        watchdogTaskHandle = xTaskCreateStatic(watchdogTask, "watchdogTask", EC_WATCHDOG_TASK_STACK_SIZE, NULL, (3 | portPRIVILEGE_BIT), watchdogStackBuffer, &watchdogTCB);
        appAssert(watchdogTaskHandle != NULL, "### ERROR ### when trying to create watchdog task");
    
    看门狗初始化
    int main(void)
    {
        dwdInit(rtiREG1,4095);
    
        epic_common_Init();
        epic_protocol_Init();
        PCU_init();
    
        vTaskStartScheduler();
    
        return 0;
    }
    然后、我使用 FreeRTOS 并尝试从任务中"触发狗"。  当另一个任务设置标志 Wtd = 1且计数器 的看门狗未复位时、这会导致 MCU 复位。
    static void watchdogTask(void *arg)
    {
    
        dwdCounterEnable(rtiREG1);
    
        for(;;)
        {
              vTaskDelay( (TickType_t) (10/portTICK_RATE_MS));
    
              if(wtd == 0)
                  dwdReset(rtiREG1);
    
    //          if( !(EC_WATCHDOG_CHECK_PATTERN ^ watchdogFlags) ) dwdReset(rtiREG1);
    //            watchdogFlags = 0;
        }
    }
    我看不出我做了什么错。

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="520997" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1165710/tms570lc4357-example-of-configuration-watchdog-with-freertos/4386409 #4386409"]但 由于某种原因、MCU 复位后 会导致中止。

    什么类型的中止? 中止有多种类型:数据中止、预取中止和未定义中止。

    请参阅此常见问题解答:

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1029488/faq-tms570lc4357-troubleshooting-the-abort-exceptions-on-hercules-devices?tisearch=e2e-sitesearch&keymatch=FAQ%252520AND%252520abort#

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

    您好!

    感谢您提供常见问题解答。 中止类型是 数据中止异常。  当看门狗进入 dwInit()调用并退出时、在第一个看门狗复位时、几个指令随后捕获异常。

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

    您好!

    请告诉我 数据故障状态寄存器(DFSR)和 R14_abt 寄存器的值。

    下面是状态说明:

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

    你好!

      很抱歉 、我在请求的寄存器中附加了两个映像。  

     数据故障状态寄存器(DFSR):

    和 R14_abt:

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

    从 DFSR=0x1008可以看出、数据中止是由存储器接口或高速缓存中的 ECC 错误引起的、这是异步中止、这意味着很难使用 DFAR 寄存器中的地址跟踪中止位置。 根据  ADFSR (0x0050000)的值、我们可以确认访问是通过 AXI 外设端口进行的、

    R14_abt =  0xD0CC-0x8、 r14_abt - 0x8 = 0xD0C4、这是导致数据中止的指令附近的地址。 请检查0xD0C4周围是否有 str 说明。

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

    校正:

    R14_abt =  0xD0CC