📄 smctimer.c
字号:
#include "vscp_os.h"
#include "smctimer.h"
#define TIMER_QUEUE_NUM (2)
#define TIMER_EXPIRE_FUN_NUM (128)
#define MAX_EXPIRE_TIMER_NUM (100)
static TIMER_QUEUE_T TimerQueue[TIMER_QUEUE_NUM];
extern void SysTExpire(void *para,void *para1);
extern void SysTestResExpire(void *para,void *para1);
extern void IsmgMsgExpire(void *para,void *para1);
TimerExpireFun SysTimerExpireFun[] =
{
NULL,
SysTExpire,
SysTestResExpire,
IsmgMsgExpire,
};
#define CheckTimerQueueType(q) ((unsigned int)q < TIMER_QUEUE_NUM)
int TimerQueueInit(TIMER_QUEUE_E q)
{
if (!CheckTimerQueueType(q))
return (-1);
memset(&TimerQueue[q],0,sizeof(TIMER_QUEUE_T));
TimerQueue[q].head.pre = &TimerQueue[q].head;
TimerQueue[q].head.suc = &TimerQueue[q].head;
TimerQueue[q].head.TimerTime = 0x7FFFFFFF;
TimerQueue[q].count = 0x00;
if (TIMER_QUEUE_SYS == q)
{
TimerQueue[q].expirefun = SysTimerExpireFun;
TimerQueue[q].funcount = sizeof(SysTimerExpireFun) / sizeof(TimerExpireFun);
TimerQueue[q].scancount = 1;
}
CriticalSectionInit(&TimerQueue[q].cs);
return (0);
}
int TimerQueueFindMember(TIMER_QUEUE_E q, TIMER_T *timer)
{
unsigned int i;
TIMER_T *tmp = NULL;
if (NULL == timer || !CheckTimerQueueType(q)) {
return (0);
}
CriticalSectionEnter(&TimerQueue[q].cs);
for (i = 0, tmp = TimerQueue[q].head.suc;
i < TimerQueue[q].count && tmp != &TimerQueue[q].head;
i++, tmp = tmp->suc) {
if (tmp == timer) {
CriticalSectionLeave(&TimerQueue[q].cs);
return (1);
}
}
CriticalSectionLeave(&TimerQueue[q].cs);
return (0);
}
int TimerQueueSetMember(TIMER_QUEUE_E q, TIMER_T *timer)
{
TIMER_T *temptimer = NULL;
if (timer == NULL) return (-1);
if (!CheckTimerQueueType(q))
return (-1);
TimerQueueReleaseMember(q, timer);
CriticalSectionEnter(&TimerQueue[q].cs);
timer->TimerTime = timer->Value + GetSysTimeByMilliSecond();
for (temptimer = TimerQueue[q].head.suc;
temptimer != &TimerQueue[q].head;
temptimer = temptimer->suc)
{
if (TimerAfter(temptimer->TimerTime, timer->TimerTime))
break;
}
temptimer->pre->suc = timer;
timer->pre = temptimer->pre;
temptimer->pre = timer;
timer->suc = temptimer;
TimerQueue[q].count ++;
CriticalSectionLeave(&TimerQueue[q].cs);
return (0);
}
int TimerQueueReleaseMember(TIMER_QUEUE_E q, TIMER_T *timer)
{
if (timer == NULL) return (-1);
if (!CheckTimerQueueType(q))
return (-1);
CriticalSectionEnter(&TimerQueue[q].cs);
if (0 == TimerQueueFindMember(q, timer)) {
CriticalSectionLeave(&TimerQueue[q].cs);
return (-1);
}
timer->pre->suc = timer->suc;
timer->suc->pre = timer->pre;
TimerQueue[q].count --;
timer->pre = NULL;
timer->suc = NULL;
timer->TimerTime = 0;
CriticalSectionLeave(&TimerQueue[q].cs);
return (0);
}
/********************************************************************
created: 2008/06/19
created: 19:6:2008 14:33
author: lhz
funName: TimerQueueCheck
parameters: TIMER_QUEUE_E q 定时器对了
return:
purpose: 扫描定时器队列,将超时的定时器出队
*********************************************************************/
void TimerQueueCheck(TIMER_QUEUE_E q)
{
TIMER_T *temptimer;
int count;
if (!CheckTimerQueueType(q))
return;
CriticalSectionEnter(&TimerQueue[q].cs);
count = 0;
for ( count = 0;
(count < TimerQueue[q].scancount) &&
(TimerQueue[q].count > 0) &&
(IsTimerExpire(TimerQueue[q].head.suc->TimerTime));
count ++
)
{
temptimer = TimerQueue[q].head.suc;
temptimer->suc->pre = temptimer->pre;
TimerQueue[q].head.suc = temptimer->suc;
TimerQueue[q].count --;
temptimer->pre = temptimer->suc = NULL;
temptimer->TimerTime = 0;
if ((temptimer->TimeType >= TimerQueue[q].funcount)
|| (TimerQueue[q].expirefun[temptimer->TimeType] == NULL))
{
continue;
}
TimerQueue[q].expirefun[temptimer->TimeType](temptimer->para,temptimer) ;
}
CriticalSectionLeave(&TimerQueue[q].cs);
return;
}
/********************************************************************
created: 2008/06/19
created: 19:6:2008 14:22
author: spirit
funName: CheckTimerQueueStatus
parameters: TIMER_QUEUE_E q 定时器队列
return: char 定时器状态0正常工作,-1不正常工作
purpose: 查看定时器队列中的定时器的状态是否正常
*********************************************************************/
char CheckTimerQueueStatus(TIMER_QUEUE_E q)
{
TIMER_T *temptimer = NULL;
int rel = 0;
int count = 0;
if (!CheckTimerQueueType(q))
return (-1);
CriticalSectionEnter(&TimerQueue[q].cs);
for ( count = 0;
(count < TimerQueue[q].scancount) &&
(TimerQueue[q].count > 0) &&
(IsTimerExpire(TimerQueue[q].head.suc->TimerTime));
count ++
)
{
if (count >= MAX_EXPIRE_TIMER_NUM || count >= TimerQueue[q].count)
{
rel = -1;
break;
}
}
CriticalSectionLeave(&TimerQueue[q].cs);
return rel;
}
int TimerQueueLen(TIMER_QUEUE_E q)
{
int rel = 0;
if (!CheckTimerQueueType(q))
{
return MAX_SMC_MSGLEN;
}
CriticalSectionEnter(&TimerQueue[q].cs);
rel = TimerQueue[q].count;
CriticalSectionLeave(&TimerQueue[q].cs);
return rel;
}
int TimerQueueIsNull(TIMER_QUEUE_E q)
{
int rel = 0;
if (!CheckTimerQueueType(q))
{
return -1;
}
CriticalSectionEnter(&TimerQueue[q].cs);
if(0 == TimerQueue[q].count)
{
rel = 0;
}
CriticalSectionLeave(&TimerQueue[q].cs);
return rel;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -