?? callbacktimerfunction.c
字號:
//###
//###
//### Callback Timer Function.
//###
//### 訣眉疙: 茄憊哪腔磐厚憐
//### 老 磊: 2009斥 2巋
//### 俺 慣: 扁賤評厘 炔犁籃(biometric@naver.com)
//### 汲 疙: CallBack Timer Function 薦青闌 困秦 Timer3甫 泅犁 葷儈竅絆 樂瀾.
//###
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdio.h>
#include "uart.h"
#include "global.h"
#include "callbacktimerfunction.h"
#include "../../avrlib/buffer.h"
#include "../../avrlib/rprintf.h"
#define __CB_DELETE 2
#define __CB_RUN 1
#define __CB_PAUSE 0
struct __tag_CallBack
{
unsigned short uHandler;
unsigned short uTimeOut;
unsigned short uBKTimeOut;
unsigned short bIsState;
CallBackFunc pFunc;
struct __tag_CallBack* pNext;
};
typedef struct __tag_CallBack stCB;
stCB* G_CallBackHead;
//###
//### CallBack Function扁瓷 葷儈闌 困茄 檬扁拳 竊薦.
//###
void InitCallBack(unsigned short uGenTime)
{
cli();
TCCR3B&=~0x07;
TCCR3B|=0x01;
TIMSK3|=(0x01<<TOIE3);
TIFR3|=(0x01<<TOV2);
//F_CPU
TCNT3H=0x00;
TCNT3L=0xFF;
G_CallBackHead=NULL;
sei();
}
//###
//### Create CallBack Function.
//### 薦青且 CallBack Function闌 Linked List肺 備己茄促.
//###
//### 傈崔牢磊:
//### pFunc: CallBack Function Point.
//### uTimeOut: CallBack Function甫 薦青且 Time 埃拜 1ms竄困.
//### uHandler: CallBack Function俊 何咯且 Handler 鍋齲.
//### 府畔藹:
//### 積己 角菩矯: -1
//### 己傍矯: 積己茄 Handler藹闌 登倒赴促.
//###
unsigned short CreateCallBackFunc(CallBackFunc pFunc, unsigned short uTimeOut,unsigned short uHandler)
{
stCB* newCB;
stCB* prevCB;
if(G_CallBackHead == NULL)
{
newCB = (stCB*)malloc(sizeof(stCB));
if(newCB==NULL) return -1;
newCB->pFunc = pFunc;
newCB->uBKTimeOut=newCB->uTimeOut = uTimeOut;
newCB->uHandler = uHandler;
newCB->bIsState=__CB_RUN;
newCB->pNext = NULL;
G_CallBackHead = newCB;
}
else
{
newCB = G_CallBackHead;
while(newCB)
{
//###
//### Handler啊 吝汗登絆 昏力 夸沒撈 等巴撈 酒聰扼擱 扁糧 瀝焊甫 Update.
//###
if(newCB->uHandler == uHandler && newCB->bIsState!=__CB_DELETE)
{
newCB->pFunc = pFunc;
newCB->uBKTimeOut=newCB->uTimeOut = uTimeOut;
newCB->uHandler = uHandler;
break;
}
else
{
prevCB=newCB;
newCB=newCB->pNext;
}
}
if(newCB == NULL)
{
newCB=(stCB*)malloc(sizeof(stCB));
if(newCB==NULL) return -1;
newCB->pFunc = pFunc;
newCB->uBKTimeOut=newCB->uTimeOut = uTimeOut;
newCB->uHandler = uHandler;
newCB->bIsState=__CB_RUN;
newCB->pNext = NULL;
prevCB->pNext=newCB;
}
}
return uHandler;
}
//###
//### 瘤瀝茄 CallBack Function闌 Delete茄促.
//###
//### 傈崔牢磊:
//### uHandler: 昏力且 CallBack Function Handler.
//###
int DeleteCallBackFunc(unsigned short uHandler)
{
stCB* delCB;
stCB* prevCB;
if(G_CallBackHead != NULL)
{
prevCB=G_CallBackHead;
delCB=G_CallBackHead;
while(delCB)
{
//###
//### 昏力 夸沒撈 登瘤臼籃巴俊 茄秦 薦青茄促.
//###
if(delCB->uHandler==uHandler && delCB->bIsState!=__CB_DELETE) { delCB->bIsState=__CB_DELETE; return 0; }
prevCB = delCB;
delCB=delCB->pNext;
}
}
return -1;
}
//###
//### 瘤瀝茄 CallBack Function闌 淚矯 瀝瘤 矯挪促.
//###
//### 傈崔牢磊:
//### uHandler: 悼累闌 烙矯 瀝瘤矯懦 CallBack Function Handler.
//###
void PauseCallBackFunc(unsigned short uHandler)
{
stCB* nextCB;
if(G_CallBackHead != NULL)
{
nextCB=G_CallBackHead;
while(nextCB)
{
//###
//### 昏力 夸沒撈 登瘤臼籃巴俊 茄秦 薦青茄促.
//###
if(nextCB->uHandler==uHandler && nextCB->bIsState!=__CB_DELETE) { nextCB->bIsState=__CB_PAUSE; break; }
nextCB=nextCB->pNext;
}
}
}
//###
//### 瘤瀝茄 CallBack Function闌 悼累矯挪促.
//###
//### 傈崔牢磊:
//### uHandler: 悼累闌 犁扁且 CallBack Function Handler.
//###
void RunCallBackFunc(unsigned short uHandler)
{
stCB* nextCB;
if(G_CallBackHead != NULL)
{
nextCB=G_CallBackHead;
while(nextCB)
{
//###
//### 昏力 夸沒撈 登瘤臼籃巴俊 茄秦 薦青茄促.
//###
if(nextCB->uHandler==uHandler && nextCB->bIsState!=__CB_DELETE) { nextCB->bIsState=__CB_RUN; break; }
nextCB=nextCB->pNext;
}
}
}
//###
//### CallBack竊薦 膠納臨傅儈 Timer3 Interrupt.
//###
SIGNAL(SIG_OVERFLOW3)
{
static stCB* prevCB;
static stCB* nextCB;
if(G_CallBackHead != NULL)
{
prevCB=nextCB=G_CallBackHead;
while(nextCB)
{
if(nextCB->bIsState==__CB_RUN)
{
if(nextCB->uTimeOut==0)
{
//###
//### 秦寸 CallBack竊薦甫 角青茄促.
//###
nextCB->pFunc();
nextCB->uTimeOut=nextCB->uBKTimeOut;
}
else nextCB->uTimeOut--;
}
else if(nextCB->bIsState==__CB_DELETE)
{
//###
//### 昏力甫 夸沒茄巴撈骨肺 昏力茄促.
//###
if(nextCB==G_CallBackHead) G_CallBackHead=nextCB->pNext;
else prevCB->pNext=nextCB->pNext;
free(nextCB);
}
prevCB=nextCB;
nextCB=nextCB->pNext;
}
}
TCNT3H=0x00;
TCNT3L=0xFF;
TIFR3|=(0x01<<TOV2);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -