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 + -
显示快捷键?