文档介绍:探讨多任务F喂狗的方式一育•以來,我不断的探索RTOS的使用方法,以UC/OS-II为基础。当然努力的结果是逐渐形成了一个可以使用的软件平台。但我意识到如果没有相应文档的支持或许这个东西也许只有我自己能使用了。另外提高的空间有限。所以今天就从这个困扰我许久的问题入手,慢慢的介绍我这两年來努力的成果。关于多任务下如何才能有效的使用看门狗这个问题其实也不是很难。关键是在于喂狗的策略。你没办法像以前一样。在程序的开头初始化看门狗,然后在程序屮的某一点调用喂狗指令,清除看门狗计数器。因为你要明口,你想要清楚的知道每一个任务都必需有条不紊的丁•作的。任何一个任务死掉就得停止喂狗。这就是问题的关键了。所以你不可以在毎个任务里直接调用喂狗指令。那是混乱的没有实际意义。那么不能宜接喂狗,自然就想到间接喂狗的方式了。如何才能做到间接喂狗。我使用了软件看门狗的方式。给每个任务一个软件模拟出来的看门狗计数器。然后在适当的时候定时的查询毎一个软件看门狗的喂狗情况,山此决定是否调用喂狗指令,清除看门狗计数器。如果发现有任何一个软件看门狗溢出,就停止喂狗,让系统复位。如何定时查询软件看门狗的喂狗情况?UC/OS-II系统时间节拍钩子函数是个不错的选择。随后再给出具有体的实现。voidOSTimcTickHook(void)(SoftWdtlSRO;〃定时查询毎一个软件看门狗喂狗状况。}软件看门狗是一个什么样的东西??从数据结构上來说,它是这样子的:typcdcfstructsoft_wach_dog_timcr(uintl6watchDogTimeOut;〃看门狗计数超时初值uinl16walchDogTime;//看门狗定时器uintSwatchDogCountBack;//.上一次看门喂狗计数器uint8watchDogCount;//看];//ft门狗定时器状态uint8NOUSE8;};好吧,我來一个个介绍,才几个变量而以,很容易的。先讲第二个成员吧,uintl6watchDogTimc;这个就是软件看门狗的定时器了,每当调用SoftWdtTSR的时候如果相应看门狗没有喂狗操作该值会被减去1,否则将从第一个成员uint16watchDogTimcOut复制一份拷贝。所以第一个成员变量叫做看门狗计数超时初值。那么第三个和第四个成员变戢是干吗用的呢,这两个就是用來判断是否有喂狗操作。第五个成员是表示软件看门狗状态的。总共有三种状态。um(SWDT_STAT_TDLE,〃软件看门狗空闲SWDT_STAT_SUSPEN,〃软件看门狗挂起SWDT_STAT_RUN〃软件看门狗运行)SWDT_STAT;接卜•來看看SoftWdtlSR的实现吧。voidSoftWdtISR(void){SOFT_WATCH_DOG_TIMER*SoftWatchDogTimcrPtr=SoftWatchDogTimcrList;uint8i=0;if(StopWDTFedMake==TRUE){return;)for(i=0;i<MAX_SWDT_ID;i++)(〃対挂起和空闲的看门狗定时器不进行检查获if(SoftWatchDogTimerPtr->watchDogState==SWDT_STAT_RU