⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 callbacktimerfunction.c

📁 AVR2560 Sample C Code (CallBack)
💻 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 + -