📄 sigtimer.c
字号:
/*
file name:intsignal.c
function:handle the cpu relate signal
author :Einsn
date:2006-12-26
Modify :2007-01-10
*/
#include "sigtimer.h"
#include "avr/interrupt.h"
/*
* User Configuration, Hardware relation
* Can be modify by the specified CPU and application
*
*/
/*
*
* the system Max function can be run in the interrupt
*
*/
#define TIMERHOOKSIZE 5
/*
*
* The CPU related Timer start function
*
*/
#define INITVALUE (((F_CPU/1000)*TIMERINTERVAL)/1024)
inline static void SIGTimerStart(uint16 ms){
uint32 temp=F_CPU/1000;
temp*=ms;
temp=temp/1024;
TCNT0=0;
OCR0=(uint8)temp;
//OCR0=(uint8)INITVALUE;
TIMSK|=(1<<OCIE0);//enalbe the interrupt;
TCCR0=(1<<WGM01)|7;
}
/*
*
* The CPU related Timer stop function
*
*/
inline static void SIGTimerStop(void){
TIMSK&=~(1<<OCIE0);//disable the interrupt
TCCR0=0;//stop the timer;
}
//2007-04-13 add soft timer
#define SOFTTIMERMAXNUM 5
//soft timer
//16bit max time is 32768/10 ms 65s
#define CNTSOFTTIMERLOADDEF(x) (x*(1000/TIMERINTERVAL))
struct SoftTimer{
uint16 InUse:1;
uint16 Cnt:15;
};
typedef struct tagSIGTIMER
{
//uint8 InUse;
#ifdef TIMERHOOK
SIGNALHOOK SignalHook[TIMERHOOKSIZE];
void *pData[TIMERHOOKSIZE];
#endif
unsigned char HookCount;
#ifdef SOFTTIMER
volatile struct SoftTimer SoftTimer[SOFTTIMERMAXNUM];
#endif
unsigned char SoftTimerConut;
}SIGTIMER,*PSIGTIMER;
static SIGTIMER SigTimer;
#ifdef SOFTTIMER
//volatile uint16 SoftTimer[SOFTTIMERMAXNUM];
/*
* Name:SoftTimerStart
* Function:
*
* In:ival unit in second
* Out:
*
* Author:Einsn Liu
* Date:2007-04-11
*
*
*/
timerid SoftTimerAdd(uint16 isec){
uint8 i;
if(SigTimer.SoftTimerConut>SOFTTIMERMAXNUM)return 0;
for(i=0;i<SOFTTIMERMAXNUM;i++){
if(SigTimer.SoftTimer[i].InUse==0){
SigTimer.SoftTimerConut++;
SigTimer.SoftTimer[i].InUse=1;
SigTimer.SoftTimer[i].Cnt=CNTSOFTTIMERLOADDEF(isec);
break;
}
}
if(SigTimer.SoftTimerConut==1&&SigTimer.HookCount==0){
SIGTimerStart(TIMERINTERVAL);
}
if(i<SOFTTIMERMAXNUM) return (i+1);//no free
return 0;
}
/*
* Name:SoftTimerStart
* Function:
*
* In:ival unit in second
* Out:
*
* Author:Einsn Liu
* Date:2007-04-11
*
*
*/
void SoftTimerRestart(timerid id,uint16 isec){
SigTimer.SoftTimer[id-1].Cnt=CNTSOFTTIMERLOADDEF(isec);
}
/*
* Name:SoftTimerStartMS
* Function:
*
* In:ival unit in second
* Out:
*
* Author:Einsn Liu
* Date:2007-04-11
*
*
*/
void SoftTimerRestartMS(timerid id,uint16 ims){
SigTimer.SoftTimer[id-1].Cnt=ims/TIMERINTERVAL;
}
/*
* Name:SoftTimerRemove
* Function:
*
* In:ival unit in second
* Out:
*
* Author:Einsn Liu
* Date:2007-04-11
*
*
*/
void SoftTimerRemove(timerid id){
if(SigTimer.SoftTimer[id-1].InUse==1){
SigTimer.SoftTimer[id-1].InUse=0;
SigTimer.SoftTimer[id-1].Cnt=0;
SigTimer.SoftTimerConut--;
if(SigTimer.SoftTimerConut==0&&SigTimer.HookCount==0){
SIGTimerStop();
}
}
}
/*
* Name:SoftTimerTest
* Function:
*
* In:
* Out:1:is time to ;0 no
*
* Author:Einsn Liu
* Date:2007-04-14
*
*
*/
uint8 SoftTimerTest(timerid id){
if(SigTimer.SoftTimer[id-1].InUse==1)
return SigTimer.SoftTimer[id-1].Cnt==0?1:0;
return 0;
}
#endif
/*
name:SIGTimerInit()
function:
author:einsn
date :2006-12-26
modify :2007-01-10
redesign the timer system
*/
void SIGTimerInit(void){
uint8 i;
#ifdef TIMERHOOK
SigTimer.HookCount=0;
for(i=0;i<TIMERHOOKSIZE;i++){
SigTimer.SignalHook[i]=NULL;
SigTimer.pData[i]=NULL;
}
#endif
#ifdef SOFTTIMER
//initial the soft timer
SigTimer.SoftTimerConut=0;
for(i=0;i<SOFTTIMERMAXNUM;i++){
SigTimer.SoftTimer[i].InUse=0;
SigTimer.SoftTimer[i].Cnt=0;
}
#endif
}
#ifdef TIMERHOOK
/*
file name:SIGTimerLoad.c
function:handle the cpu relate signal
author :Einsn
date:2006-12-26
modify :2007-01-10
redesign the timer system
*/
int8 SIGTimerLoad(SIGNALHOOK SignalHook,void *pdata){
uint8 i;
PSIGTIMER pSIGTimer=(PSIGTIMER)&SigTimer;
if(pSIGTimer->HookCount>=TIMERHOOKSIZE){//not enough buf
return -1;
}
for(i=0;i<TIMERHOOKSIZE;i++){
if((pSIGTimer->SignalHook[i]==SignalHook)&&(pSIGTimer->pData[i]==pdata)){//the hook has already exist
return -1;
}
}
//if not exist.to if have
for(i=0;i<TIMERHOOKSIZE;i++){
if(pSIGTimer->SignalHook[i]==NULL){
pSIGTimer->SignalHook[i]=SignalHook;
pSIGTimer->pData[i]=pdata;
pSIGTimer->HookCount++;
break;
}
}
if(pSIGTimer->SoftTimerConut==0&&pSIGTimer->HookCount==1){
SIGTimerStart(TIMERINTERVAL);
}
return 0;
}
int8 SIGTimerRemove(SIGNALHOOK SignalHook,void *pdata){
uint8 i;
PSIGTIMER pSIGTimer=(PSIGTIMER)&SigTimer;
if(pSIGTimer->HookCount==0){//not enough buf
return -1;
}
for(i=0;i<TIMERHOOKSIZE;i++){
if((pSIGTimer->SignalHook[i]==SignalHook)&&(pSIGTimer->pData[i]==pdata)){
pSIGTimer->SignalHook[i]=NULL;
pSIGTimer->pData[i]=NULL;
pSIGTimer->HookCount--;
break;
}
}
if(i>=TIMERHOOKSIZE){
return -1;
}
if((pSIGTimer->SoftTimerConut==0)&&pSIGTimer->HookCount==0){
SIGTimerStop();
}
return 0;
}
#endif
/***
*
* system timer interrupt function
* 2007-1-10
*
***/
SIGTimerSignal(){
uint8 i;
//sei();//enable the interrupt.
//2007-04-13 add for soft timer
#ifdef SOFTTIMER
for(i=0;i<SOFTTIMERMAXNUM;i++){
if(SigTimer.SoftTimer[i].Cnt>0){
SigTimer.SoftTimer[i].Cnt--;
}
}
#endif
#ifdef TIMERHOOK
for(i=0;i<TIMERHOOKSIZE;i++){
if(SigTimer.SignalHook[i]!=NULL){
SigTimer.SignalHook[i](SigTimer.pData[i]);
}
}
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -