请选择 进入手机版 | 继续访问电脑版
查看: 57|回复: 6

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

[复制链接]
  • TA的每日心情
    开心
    2019-9-5 09:09
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    5

    主题

    27

    帖子

    0

    金豆

    注册会员

    Rank: 2

    积分
    192
    最后登录
    2019-9-20
    发表于 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的每日心情
    奋斗
    11 小时前
  • 签到天数: 61 天

    [LV.6]常住居民II

    11

    主题

    122

    帖子

    0

    金豆

    高级会员

    Rank: 4

    积分
    503
    最后登录
    2019-9-20
    发表于 2019-9-5 08:55:07 | 显示全部楼层
    你把hello_task里面的延迟去掉,打印也去掉,试试
    哈哈!开心!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-9-5 09:09
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    5

    主题

    27

    帖子

    0

    金豆

    注册会员

    Rank: 2

    积分
    192
    最后登录
    2019-9-20
     楼主| 发表于 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
                   
    }
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    216

    主题

    4466

    帖子

    0

    金豆

    超级版主

    Rank: 8Rank: 8

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

    使用道具 举报

  • TA的每日心情
    奋斗
    11 小时前
  • 签到天数: 61 天

    [LV.6]常住居民II

    11

    主题

    122

    帖子

    0

    金豆

    高级会员

    Rank: 4

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

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

    使用道具 举报

  • TA的每日心情
    开心
    2019-9-5 09:09
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    5

    主题

    27

    帖子

    0

    金豆

    注册会员

    Rank: 2

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

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

    使用道具 举报

  • TA的每日心情
    擦汗
    12 小时前
  • 签到天数: 50 天

    [LV.5]常住居民I

    1

    主题

    83

    帖子

    0

    金豆

    中级会员

    Rank: 3Rank: 3

    积分
    298
    最后登录
    2019-9-20
    发表于 2019-9-5 15:41:58 | 显示全部楼层
    你这是开启了窗口看门狗1-4s,然后1s没到就去喂狗了?
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

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

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

    GMT+8, 2019-9-20 22:43 , Processed in 0.148977 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

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