timetask.c

来自「在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LE」· C语言 代码 · 共 247 行

C
247
字号
/********************************************
*         TimeTask.C
*         Handl All needed Time Procedure
*
*         cybero   07.08.01
********************************************/
#define TIMETASK_GLOBAL

#include "includes.h"
#include "bsp.h"
#include "errcode.h"
#include "errtask.h"
#include "watchdog.h"
#include "timetask.h"
#include "zprint.h"

static OS_STK TimeTaskStack[STACK_TIMETASK] ;


static TMR_TSK  TmrTCB[MAXTIMETASK];
static TMR_TSK  *TmrList,*TmrFreeList;
static TMR_TSK  *CurExecTmr;

static INT8U    wdgid;


static void  DiagnoseProc(void)
{
     TMR_TSK  *TmrPtr;
     INT32U   TmrCount;

     TmrCount = 0;
     TmrPtr = TmrList;
     while(TmrPtr != NULL){
     	TmrCount++;
     	TmrPtr = TmrPtr->tmr_next;
     }
     TmrPtr = TmrFreeList;
     while(TmrPtr != NULL){
     	TmrCount++;
     	TmrPtr = TmrPtr->tmr_next;
     }
     if(TmrCount != MAXTIMETASK) ErrExit(ERR_TIMETASK_MEM);
}

/*******************************************
*     初始化定时器的任务列表
*
*     NO PARAMETER,NO RETURN
********************************************/

static void InitTmrTsk(void)
{
     INT32U   i;

     for(i=0;i<MAXTIMETASK-1;i++)
     {
        TmrTCB[i].tmr_next =&TmrTCB[i+1];
        TmrTCB[i].TotalTime = 0x0;
        TmrTCB[i].LeftTime = 0x0;
        TmrTCB[i].TmrSwitch = OFF;
        TmrTCB[i].TmrIndex  = 0;
        TmrTCB[i].TmrProc = NULL;
     }
     TmrTCB[i].tmr_next =NULL;
     TmrFreeList = &TmrTCB[0];
     TmrList =NULL;
     InstallDiagProc(DiagnoseProc);
     wdgid = ApplyWatchDogID();
}

static void TimeTaskEntry(void)
{
     void (*FuncPtr)(void);

     if(TmrList == NULL) return;
     CurExecTmr = TmrList;
     do{
         if(CurExecTmr->TmrSwitch == ON){
           if(--CurExecTmr->LeftTime == 0){
              CurExecTmr->LeftTime = CurExecTmr->TotalTime;
              FuncPtr = CurExecTmr->TmrProc;
              if(FuncPtr != NULL) (*FuncPtr)();
           }
         }
         CurExecTmr = CurExecTmr->tmr_next;
     }while(CurExecTmr != NULL);
}


/*******************************************
*     FUNC:创建一个新的定时任务
*     PARAM: 任务函数指针,任务下标索引
*     RETURN: 任务列表的指针
********************************************/

TMR_TSK *CreateTimer(void (*FuncPtr)(void),INT32U index)
{
     TMR_TSK *TmrPtr;

     TmrPtr = TmrFreeList;
     if (TmrPtr != NULL)
     {
     	if (FuncPtr == NULL) {
     	    ErrExit(ERR_TIMETASK_CREATE);
     	    return NULL;
     	} else {
     	   OS_ENTER_CRITICAL();
     	   TmrFreeList =TmrPtr->tmr_next;
     	   TmrPtr->tmr_next =TmrList;
     	   TmrList =TmrPtr;
     	   TmrPtr->TmrProc=FuncPtr;
     	   TmrPtr->TmrSwitch=OFF;
     	   TmrPtr->TmrIndex = index;
     	   OS_EXIT_CRITICAL();
    	   return TmrPtr;
     	}
     } else {
        ErrExit(ERR_TIMETASK_CREATE);
        return NULL;
     }
}

void StartTmr(TMR_TSK *PTmr,INT32U Attrib, INT32U time)
{
     TMR_TSK *TmrPtr;
     if(PTmr==NULL) return;
     if(TmrList==NULL) {
	    Printu("TmrList == null\r\n");
        ErrExit(ERR_TIMETASK_START);
        return;
     }
     TmrPtr=TmrList;
     do{
        if(PTmr==TmrPtr){
           PTmr->TotalTime=Attrib * time;
     	   PTmr->LeftTime=TmrPtr->TotalTime;
           PTmr->TmrSwitch =ON;
           return;
        }
        else TmrPtr =TmrPtr->tmr_next;
     }while(TmrPtr!=NULL);
     Printu("\r\n<PTmr:%lx\tattrib:%lx\ttime:%lx.........>\r\n", PTmr, Attrib, time);
     //ErrExit(ERR_TIMETASK_START);
}

void StopTmr(TMR_TSK *PTmr)
{
     TMR_TSK *TmrPtr;
     if(PTmr==NULL) return;
     if(TmrList==NULL) {
        ErrExit(ERR_TIMETASK_STOP);
        return;
     }
     TmrPtr =TmrList;
     do{
        if(PTmr==TmrPtr){
           PTmr->TmrSwitch =OFF;
           return;
        }
        else TmrPtr =TmrPtr->tmr_next;
     }while(TmrPtr!=NULL);
     ErrExit(ERR_TIMETASK_STOP);
}

void RemoveTmr(TMR_TSK *PTmr)
{
     TMR_TSK *TmrPtr,*PrePtr;
     if(PTmr == NULL) return;
     if(TmrList == NULL) {
        ErrExit(ERR_TIMETASK_REMOVE);
        return;
     }
     if(PTmr == TmrList){
        TmrList = PTmr->tmr_next;
        PTmr->tmr_next = TmrFreeList;
        TmrFreeList = PTmr;
        PTmr->TmrSwitch = OFF;
     } else {
        TmrPtr = TmrList;
        PrePtr = TmrList;
        do{
           if(PTmr == TmrPtr){
             PrePtr->tmr_next = PTmr->tmr_next;
             PTmr->tmr_next = TmrFreeList;
             TmrFreeList = PTmr;
             PTmr->TmrSwitch = OFF;
             return;
           } else {
             PrePtr = TmrPtr;
             TmrPtr = TmrPtr->tmr_next;
           }
        }while(TmrPtr != NULL);
        ErrExit(ERR_TIMETASK_REMOVE);
     }
}

BOOLEAN GetTmrSwitch(TMR_TSK *PTmr)
{
     TMR_TSK *TmrPtr;
     if(PTmr == NULL) return OFF;
     if(TmrList == NULL) {
        ErrExit(ERR_TIMETASK_SWITCH);
        return OFF;
     }
     TmrPtr = TmrList;
     do{
        if(PTmr == TmrPtr)
           return PTmr->TmrSwitch;
        else TmrPtr = TmrPtr->tmr_next;
     }while(TmrPtr!=NULL);

     ErrExit(ERR_TIMETASK_SWITCH);
     return OFF;
}

/*************************************
*     该函数只能在定时器的定时执行函数里调用
*     return:当前定时器的索引值
*
**************************************/
INT32U  GetCurTmrIndex(void)
{
     if(CurExecTmr == NULL) return 0xFF;
     else return CurExecTmr->TmrIndex;
}

static void TimeTask(void *data)
{
     data=data;
#if DEBUG_UARTNo_SYSTEM <=1     
     PrintFromUART(DEBUG_UARTNo_SYSTEM, "启动TimeTask......\n");
#endif
     
     InitTmrTsk();
     while(1){
	   ResetWatchDog(wdgid);       /* clear watch dog */
       TimeTaskEntry();
       OSTimeDly(1);
     }
}

void CreateTimeTask(void)
{
    OSTaskCreate(TimeTask, (void *)0, &TimeTaskStack[STACK_TIMETASK-1], PRIO_TIMETASK);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?