📄 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 + -