硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4462|回复: 2
收起左侧

[FreeRTOS] 看门狗复位

[复制链接]

29

主题

101

回帖

188

积分

初级会员

积分
188
发表于 2016-12-19 15:34:34 | 显示全部楼层 |阅读模式
OS Heap Min 13656
Task Name    Status  ID  Priority  Heap Min   CPU usage
DBG_Task       R        7       5         144        0%
IDLE                R       2       0         105        0%
tcpip_thread    B       4       5         884        0%
tcp_client         B      10      3         765        0%
CH_PRO         B     12      3         541        0%
CH_PRO         B     13      3         549        0%
CH_PRO         B     15      3         541        0%
CH_PRO         B     14      3         549        0%
CH_PRO         B     17      3         541        0%
CH_PRO         B     16      3         541        0%
CH_PRO         B     18      3         541        0%
CH_PRO         B     19      3         541        0%
CH_PRO         B     21      3         541        0%
CH_PRO         B     23      3         541        0%
CH_PRO         B     22      3         541        0%
CH_PRO         B     24      3         541        0%
CH_PRO         B     25      3         541        0%
CH_PRO         B     26      3         541        0%
CH_PRO         B     27      3         541        0%
WD_Task        B      6       6         183        0%
CH_PRO         B     20      3         541        0%
CFG_Task0      S     8       4         69         0%
tcp_server        B     9       4         913        0%
EthIf                 B     5       6         305        0%
Tmr Svc           B     3       3         229        0%

看门狗任务

void WatchDog_Task(void const * argument)
{
    UNUSED(argument);
    static uint32_t to = 0;
    osEvent ret;
    HAL_IWDG_Refresh(&hiwdg);
    for(;;)
    {
        ret = osSignalWait(0x0, 6000);
        if(osEventTimeout==ret.status)
        {
            to++;
        }
        else
        {
            to = 0;
        }
        if(to < 300)    //1800 seconds
        {
            log_printf(LOG_INFO,"Refresh watchdog,%u!\r\n",to);
            HAL_IWDG_Refresh(&hiwdg);
        }
        else
        {
            log_printf(LOG_CRIT,"Long time disconnect from server,watchdog bite later!\r\n");
        }
    }
}
看门狗超时26秒。
正常情况下,系统心跳任务每3秒连接一次服务器,成功后发信号给看门狗任务,喂狗,如果心跳任务连接服务器失败,则看门狗任务超时6秒一次喂狗,超时1800秒,后系统复位。
系统有时会莫名奇妙的复位,WD_Task任务和EthIf任务的优先级最高,都为6,有没有可能是EthIf占用系统时间太长导致看门狗任务挂起超过了看门狗周期?
回复

使用道具 举报

29

主题

101

回帖

188

积分

初级会员

积分
188
 楼主| 发表于 2016-12-19 16:09:27 | 显示全部楼层
  1. void ethernetif_input( void const * argument )
  2. {
  3.   struct pbuf *p;
  4.   struct netif *netif = (struct netif *) argument;
  5.   
  6.   for( ;; )
  7.   {
  8.     if (osSemaphoreWait( s_xSemaphore, TIME_WAITING_FOR_INPUT)==osOK)
  9.     {
  10.       do
  11.       {   
  12.         p = low_level_input( netif );
  13.         if   (p != NULL)
  14.         {
  15.           if (netif->input( p, netif) != ERR_OK )
  16.           {
  17.             pbuf_free(p);
  18.           }
  19.         }
  20.       } while(p!=NULL);
  21.     }
  22.   }
  23. }
复制代码
EthIf任务是等待信号量,处理Eth收到的数据
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2016-12-20 08:24:37 | 显示全部楼层
把看门狗喂狗任务设置为最高试试,FreeRTOS的同优先级任务仅支持一个时间片大小,也就是每个时间片后都进行切换。

如果不行的话,只能排查了。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 16:24 , Processed in 0.284148 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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