多任务下看门狗程序实现

探讨多任务下喂狗的方式

一直以来,我不断的探索RTOS的使用方法,以UC/OS-II为基础。当然努力的结果是逐渐形成了一个可以使用的软件平台。但我意识到如果没有相应文档的支持或许这个东西也许只有我自己能使用了。另外提高的空间有限。所以今天就从这个困扰我许久的问题入手,慢慢的介绍我这两年来努力的成果。
关于多任务下如何才能有效的使用看门狗这个问题其实也不是很难。关键是在于喂狗的策略。你没办法像以前一样。在程序的开头初始化看门狗,然后在程序中的某一点调用喂狗指令,清除看门狗计数器。因为你要明白,你想要清楚的知道每一个任务都必需有条不紊的工作的。任何一个任务死掉就得停止喂狗。这就是问题的关键了。所以你不可以在每个任务里直接调用喂狗指令。那是混乱的没有实际意义。
那么不能直接喂狗,自然就想到间接喂狗的方式了。如何才能做到间接喂狗。我使用了软件看门狗的方式。给每个任务一个软件模拟出来的看门狗计数器。然后在适当的时候定时的查询每一个软件看门狗的喂狗情况,由此决定是否调用喂狗指令,清除看门狗计数器。如果发现有任何一个软件看门狗溢出,就停止喂狗,让系统复位。


如何定时查询软件看门狗的喂狗情况? UC/OS-II系统时间节拍钩子函数是个不错的选择。随后再给出具有体的实现。
void OSTimeTickHook (void)
{
 
      SoftWdtISR();         //定时查询每一个软件看门狗喂狗状况。
}
软件看门狗是一个什么样的东西??从数据结构上来说,它是这样子的:

typedef struct soft_wach_dog_timer{
        uint16 watchDogTimeOut;                //看门狗计数超时初值
        uint16 watchDogTime;                //看门狗定时器
        uint8  watchDogCountBack;        //上一次看门喂狗计数器
        uint8  watchDogCount;                //看门狗喂狗计数器
        SWDT_STAT  watchDogState;        //看门狗定时器状态
        uint8  NOUSE8;
}SOFT_WATCH_DOG_TIMER;
好吧,我来一个个介绍,才几个变量而以,很容易的。
先讲第二个成员吧,uint16 watchDogTime; 这个就是软件看门狗的定时器了,每当调用SoftWdtISR的时候如果相应看门狗没有喂狗操作该值会被减去1,否则将从第一个成员uint16 watchDogTimeOut复制一份拷贝。
所以第一个成员变量叫做看门狗计数超时初值。
那么第三个和第四个成员变量是干吗用的呢,这两个就是用来判断是否有喂狗操作。
第五个成员是表示软件看门狗状态的。总共有三种状态。
typedef enum{
        SWDT_STAT_IDLE,                                //软件看门狗空闲
        SWDT_STAT_SUSPEN,                        //软件看门狗挂起
        SWDT_STAT_RUN                                //软件看门狗运行
}SWDT_STAT;

接下来看看SoftWdtISR的实现吧。
void SoftWdtISR(void){

        SOFT_WATCH_DOG_TIMER *SoftWatchDogTimerPtr = SoftWatchDogTimerList;
        uint8 i = 0;
       
        if(StopWDTFedMake == TRUE){
                return;
        }
        for(i=0; i                 //对挂起和空闲的看门狗定时器不进行检查获
                if(SoftWatchDogTimerPtr->watchDogState == SWDT_STAT_RUN){
                        //软件看门狗有喂食,重装看门狗计数上限
                        if(SoftWatchDogTimerPtr->watchDogCount != SoftWatchDogTimerPtr->watchDogCountBack){
                               
                           SoftWatchDogTimerPtr->watchDogCountBack = SoftWatchDogTimerPtr->watchDogCount;
                           SoftWatchDogTimerPtr->watchDogTime = SoftWatchDogTimerPtr->watchDogTimeOut;
                   

你可能感兴趣的:(软件看门狗设计)