查看: 1734|回复: 6

[求助] 【LPC55S6X】FreeRTOS中喂狗就复位

[复制链接]
  • TA的每日心情
    擦汗
    2020-1-10 11:05
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    13

    主题

    49

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    382
    最后登录
    2020-11-12
    发表于 2019-9-4 14:24:46 | 显示全部楼层 |阅读模式
    问题: LPC55S6X跑FreeRTOS,开启了看门狗,只要一喂狗就复位???
    void watchdog_init(void)
    {
            wwdt_config_t config;
        uint32_t wdtFreq;
       
            /* Enable FRO 1M clock for WWDT module. */
        SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_FRO1MHZ_CLK_ENA_MASK;
        /* Set clock divider for WWDT clock source. */
        CLOCK_SetClkDiv(kCLOCK_DivWdtClk, 1U, true);
            /* The WDT divides the input frequency into it by 4 */
        wdtFreq = CLOCK_GetFreq(kCLOCK_WdtClk) / 4;
       
            NVIC_EnableIRQ(WDT_BOD_IRQHandler);
            WWDT_GetDefaultConfig(&config);
            /*
         * Set watchdog feed time constant to approximately 4s
         * Set watchdog warning time to 512 ticks after feed time constant
         * Set watchdog window time to 1s
         */
            config.timeoutValue = wdtFreq * 4;
        config.warningValue = 512;
        config.windowValue  = wdtFreq * 1;
        /* Configure WWDT to reset on timeout */
        config.enableWatchdogReset = true;
        /* Setup watchdog clock frequency(Hz). */
        config.clockFreq_Hz = CLOCK_GetFreq(kCLOCK_WdtClk);
            WWDT_Init(WWDT, &config);
            
    }

    int main(void)
    {
        CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
        BOARD_InitPins();
        BOARD_BootClockFROHF96M();
        BOARD_InitDebugConsole();
        PRINTF("Hello world.\r\n");
        watchdog_init();
        WWDT_Refresh(WWDT);
        if (xTaskCreate(hello_task, "Hello_task", configMINIMAL_STACK_SIZE + 10, NULL, hello_task_PRIORITY, NULL) != pdPASS)
        {
            PRINTF("Task creation failed!.\r\n");
            while (1)
                ;
        }
        vTaskStartScheduler();
        for (;;)
            ;
    }
    static void hello_task(void *pvParameters)
    {
        for (;;)
        {
            WWDT_Refresh(WWDT);
            PRINTF("Hello task.\r\n");
            vTaskDelay(1000);
        }
    }


    最佳答案

    你这是开启了窗口看门狗1-4s,然后1s没到就去喂狗了?
    哈哈哈哈哈哈哈啊哈哈哈
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-2-4 16:14
  • 签到天数: 139 天

    [LV.7]常住居民III

    14

    主题

    212

    帖子

    0

    高级会员

    Rank: 4

    积分
    881
    最后登录
    2021-2-4
    发表于 2019-9-5 08:55:07 | 显示全部楼层
    你把hello_task里面的延迟去掉,打印也去掉,试试
    今天天气不错!签到!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2020-1-10 11:05
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    13

    主题

    49

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    382
    最后登录
    2020-11-12
     楼主| 发表于 2019-9-5 09:08:05 | 显示全部楼层
    l546863256 发表于 2019-9-5 08:55
    你把hello_task里面的延迟去掉,打印也去掉,试试

    程序跑到喂狗WWDT_Refresh(WWDT)这里就被复位了,还没有跑到 延迟函数这里。然而在裸机中喂狗正常。
    int main(void)
    {
        /* Init board hardware. */
        /* attach main clock divide to FLEXCOMM0 (debug console) */
        CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);

        BOARD_InitPins();
        BOARD_BootClockFROHF96M();
        BOARD_InitDebugConsole();
                    PRINTF("Hello world.\r\n");
           
        LED_RED_INIT(LOGIC_LED_OFF);
        APP_LED_INIT;
                    watchdog_init(5);
    #if 0
        if (xTaskCreate(hello_task, "Hello_task", configMINIMAL_STACK_SIZE + 10, NULL, hello_task_PRIORITY, NULL) != pdPASS)
        {
            PRINTF("Task creation failed!.\r\n");
            while (1)
                ;
        }
        vTaskStartScheduler();
        for (;;)
            ;
    #else
            while(1)
            {
                            WWDT_Refresh(WWDT);
          PRINTF("Hello task.\r\n");
                   
                            delay();
            }
    #endif
                   
    }
    哈哈哈哈哈哈哈啊哈哈哈
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20030
    最后登录
    2024-4-26
    发表于 2019-9-5 09:24:52 | 显示全部楼层
    可能是RTOS重新schedule的task运行的时候,打断了WWDT_Refresh(WWDT);的执行过程引发,你可以顺着这个思路检查一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-2-4 16:14
  • 签到天数: 139 天

    [LV.7]常住居民III

    14

    主题

    212

    帖子

    0

    高级会员

    Rank: 4

    积分
    881
    最后登录
    2021-2-4
    发表于 2019-9-5 15:16:55 | 显示全部楼层
    meteorego 发表于 2019-9-5 09:08
    程序跑到喂狗WWDT_Refresh(WWDT)这里就被复位了,还没有跑到 延迟函数这里。然而在裸机中喂狗正常。
    int  ...

    初始化开门狗喂狗的时间:config.timeoutValue = wdtFreq * x;其中这个x是控制时间的,例程中给的默认值先不要改,你说的重启和这个给的时间有关。在调试过程中找出一个合适值就行了
    今天天气不错!签到!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2020-1-10 11:05
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    13

    主题

    49

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    382
    最后登录
    2020-11-12
     楼主| 发表于 2019-9-5 15:36:17 | 显示全部楼层
    l546863256 发表于 2019-9-5 15:16
    初始化开门狗喂狗的时间:config.timeoutValue = wdtFreq * x;其中这个x是控制时间的,例程中给的默认值 ...

    跟超时时间没有关系;应该是喂狗被打断了导致复位。
    哈哈哈哈哈哈哈啊哈哈哈
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-10-21 09:49
  • 签到天数: 177 天

    [LV.7]常住居民III

    1

    主题

    244

    帖子

    0

    高级会员

    Rank: 4

    积分
    753
    最后登录
    2021-10-21
    发表于 2019-9-5 15:41:58 | 显示全部楼层
    你这是开启了窗口看门狗1-4s,然后1s没到就去喂狗了?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-27 00:52 , Processed in 0.133668 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表