使用一个线程维护该软定时器,满足一般软件需求:
ret = pthread_create(&threadid_timer,NULL,timer_task_func,NULL);
if(ret != 0) perror("threadid_timer err: \n");
相关源码:
#define TASKMAX 12
TIMER_TASK Timer_Task[TASKMAX]={0};
static int task_num = TASKMAX;
TIMER_PROCESS TimerTask = {NULL,NULL,NULL,NULL,NULL};
/*****************************************************************************
功 能: 控制器定时器,供外部所有模块使用
参 数:定时器间隔时间、定时器序号,定时器注册回调函数,回调函数参数
返回值:正确:返回
错误:
*****************************************************************************/
int timer_task_create(int interval_timer,int task_no,Timer_Call_Back_Function func,void *param) // ms 单位 1000ms = 1sec
{
TIMER a;
if(interval_timer < 0)
return -1;
a.total_time = interval_timer;
a.left_time = interval_timer;
a.occupyed = 1;
if(task_num > TASKMAX||task_no < 0)
{
printf(RED"[Info]:timer task %d regesiter failed ,because max timer task is limted 10\n"NONE,task_no);
return -1;
}
for(int i =0 ; i < TASKMAX; i++)
{
if(Timer_Task[i].task_no == task_no)
{
printf(RED"[Info]:timer task %d regesiter failed ,because the timer task_no is used\n"NONE,task_no);
return -1;
}
else
{
if(Timer_Task[i].Timer.occupyed == 0)
{
Timer_Task[i].Timer = a;
Timer_Task[i].task_no = task_no;
Timer_Task[i].Timer.callback = func;
Timer_Task[i].Timer.param = param;
task_num --;
printf("[Info]:timer task %d callback addr =%p regesiter success\n",task_no,func);
return 1;
}
}
}
return 0;
}
int timer_task_delete(int task_no)
{
for( int i =0;i< TASKMAX ; i++ )
{
if(Timer_Task[i].task_no == task_no)
{
memset(&Timer_Task[i],0x00,sizeof(TIMER_TASK));
printf("[Info]:timer task %d is deleted \n",task_no);
task_num --;
return 1;;
}
}
}
void * timer_task_func(void *param)
{
int pid = getpid();
signal(SIGALRM,task_timer); //接到SIGALRM信号,则执行timeout函数
while(1)
{
kill(pid,SIGALRM);
usleep(1000*0.9);
}
}
void task_timer( int sig)
{
for(int j=0; j < TASKMAX; j++)
{
if(Timer_Task[j].Timer.left_time!=0)
Timer_Task[j].Timer.left_time--;
else
{
if(Timer_Task[j].Timer.callback != NULL)
{
Timer_Task[j].Timer.callback(Timer_Task[j].Timer.param);
}
Timer_Task[j].Timer.left_time=Timer_Task[j].Timer.total_time; //循环计时
}
}
}
相关头文件:其他一些 需要的系统库头文件使用时自己添加,编译的时候自己根据提示添加一下,编译时 -L pthread 上面printf 打印的颜色宏可以自己去掉,因为该部分是从其他部分获取的,该部分放在其他地方,我获取不到就不一一添加上去了。。
#ifndef _QX_TIMER_H
#define _QX_TIMER_H
typedef int (*Timer_Call_Back_Function) (void* param);/*返回任意类型,传入任意类型参数*/
typedef struct timer //Timer结构体,用来保存一个定时器的信息
{
int total_time; //每隔total_time秒
int left_time; //还剩left_time秒
int (*callback)(void *param);/*返回任意类型,传入任意类型参数*/
void *param;
unsigned char occupyed;
}TIMER;
typedef struct
{
TIMER Timer;
int task_no;
}TIMER_TASK;
typedef struct
{
int Counter;
char Clear;
}TIME3COUNTER;
typedef int (callback_function_timer)();
int timer_task_create(int interval_timer,int task_no,Timer_Call_Back_Function func,void *param);
int timer_task_delete(int task_no);
void * timer_task_func(void *param);
void task_timer( int sig);
#endif // _QX_TIMER_H