UCOSII多任务喂狗

一、UCOSII多任务喂狗与裸机喂狗的区别

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;
}

你可能感兴趣的:(UCOSII,多任务喂狗)