1、裸机喂狗。
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "timer.h"
#include "global.h"
int main(void)
{
SystemInit(); // STM32系统时钟初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置系统中断优先级分组2
Hardware_initialization(); //外设初始化
IWDG_Init(4,625*4); //与分频数为64,重载值为625,溢出时间为4s
while(1)
{
//主循环代码……
IWDG_Feed();
}
}
在主函数中开头开启看门狗,在主循环中不断喂狗即可。
2、UCOSII多任务喂狗
void task1_task(void *p_arg)//task1任务函数
{
OS_ERR err;
while(1)
{
IWDG_Feed();
LED0 = ~LED0;
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
}
}
void task2_task(void *p_arg) //task2任务函数
{
OS_ERR err;
while(1)
{
IWDG_Feed();
LED1 = ~LED1;
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
}
}
如果在任务中增加喂狗函数没有任何意义,因为即使任务1没有执行,任务2执行也会喂狗,看门狗无法监测任务1的运行。
建立一个特殊的喂狗任务,结合软件定时器完成对所有任务的监视。
喂狗标志位DogFlag初始值为0,软件定时器1、2为时长1S的单次定时器。
看门狗任务运行时,开启定时器1、2,系统会正常喂狗;
任务1超过1S未运行,定时器1中断时间到,喂狗标志位DogFlag置位,看门狗任务无法喂狗,系统重启。
任务2超过1S未运行,定时器1中断时间到,喂狗标志位DogFlag置位,看门狗任务无法喂狗,系统重启。
任务3不运行则无法喂狗,系统重启。
//任务1的任务函数
void task1_task(void *p_arg)
{
OS_ERR err;
OSTmrStop(&tmr1,OS_OPT_TMR_NONE,0,&err); //关闭定时器1
while(1)
{
OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC,&err); //延时10ms
}
}
//任务2的任务函数
void task2_task(void *p_arg)
{
OS_ERR err;
OSTmrStop(&tmr2,OS_OPT_TMR_NONE,0,&err);
while(1)
{
OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC,&err); //延时10ms
}
}
//监视任务函数
void dog_task(void *p_arg)
{
OS_ERR err;
while(1)
{
if(DogFlag==0)
{
OSTmrStart(&tmr1,&err); //开启定时器1
OSTmrStart(&tmr2,&err); //开启定时器2
IWDG_Feed();
}
else
{
printf("存在任务1S超时未运行,2S后系统复位\r\n");
}
OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC,&err); //延时10ms
}
//定时器1的回调函数
void tmr1_callback(void *p_tmr, void *p_arg)
{
DogFlag=1;
}
//定时器2的回调函数
void tmr2_callback(void *p_tmr,void *p_arg)
{
DogFlag=1;
}