尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

喂狗在操作系统(rtos)上面的正确用法

喂狗在操作系统(rtos)上面的正确用法 喂狗在操作系统(rtos)上面的正确用法。不能在定时器喂狗也不能在idle任务喂狗也不能用定时任务去喂狗。因为会出现其他任务都卡死了但喂狗还在执行。应该检查所有任务都没有卡死才能喂狗。示例程序如下。//不能在定时器喂狗也不能在idle任务喂狗也不能用定时任务去喂狗。因为会出现其他任务都卡死了但喂狗还在执行。//默认1s1000 tick hz。如果要用ms延时请加上对应的宏。//假设tick类型为32位。//如果某个任务卡死。那么会出现不喂狗。长时间不喂狗会硬件重启。//如果某些出现死锁现象。也就是执行不到最后心跳停止。那么也会检测到心跳异常出现不喂狗。长时间不喂狗会硬件重启。//演示值实际值为除喂狗任务外所有任务的数量值。#defineN8//心跳数组。除喂狗任务外所有任务。volatileuint32_ttaskHeartBeat[N]{0};//具体任务1任务优先级1。voidtaskXXX(void*pv){while(1){//判断是否需要执行功能。if(flag){//执行完所需的操作就设置心跳。//由于是示例程序只有一个任务所以下标是0。每一个任务都有一个对应的下标。taskHeartBeat[0]xTaskGetTickCount();xTaskDelay(10);}else{//只设置心跳taskHeartBeat[0]xTaskGetTickCount();//由于是示例程序只有一个任务所以下标是0。每一个任务都有一个对应的下标。xTaskDelay(10);}}}//喂狗任务任务优先级1。voidtaskWatchDog(void*pv){//这个只是示例具体请参考看门狗超时时间的设置和手册。constuint32_ttimeOut1000;//uint32_ti0;while(1){//uint32_ttickxTaskGetTickCount();//loop全部任务除喂狗任务外。// 用临界区防止检查过程中被高优先级任务抢占更新心跳taskENTER_CRITICAL();// 或 vTaskSuspendAll() / xTaskResumeAll()for(i0;iN;i){if(tick-taskHeartBeat[i]timeOut)break;}taskEXIT_CRITICAL();//全部检查完没有一个任务出现超时或卡死。if(iN){//喂狗freeDog();}//如果i!N不喂狗。多次后自动触发硬件复位。//这个时间要比超时时间要小一般是超时时间的/2或/3。xTaskDelay(300);}}
返回列表