linux 定时器2

原创 2016年08月29日 10:17:57



int TimerTaskCreate(int interval_timer,int task_no)  // 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 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;
                task_num --;
                printf(RED"[Info]:timer task %d regesiter success \n"NONE,task_no);
               // printf("i->%d %d %d %d\n",i,Timer_Task[i].task_no,Timer_Task[i].Timer.occupyed,Timer_Task[i].Timer.left_time);
                return 1;
            }

        }

   // printf("%d %d %d \n",Timer_Task[i].task_no,Timer_Task[i].Timer.occupyed,Timer_Task[i].Timer.left_time);
    }
return 0;
}
上面是注册定时器任务函数

下面是删除定时器任务函数

int TimerTaskDelete(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(RED"[Info]:timer task %d is deleted \n"NONE,task_no);
            task_num --;
            return 1;;
        }
    }
}

下面的是利用信号的原理去轮询检测每个被创建的任务触发时间。

void * Timer_Task_Func(void *param)
{
    TimerTaskCreate(6500,1);
    TimerTaskCreate(500,2);
    TimerTaskCreate(200,3);
    TimerTaskCreate(1000,4);
   // TimerTaskCreate(2000,9);
    int pid = getpid();
    signal(SIGALRM,Task_Timer);  //接到SIGALRM信号,则执行timeout函数
    while(1)
    {
        kill(pid,SIGALRM);
        usleep(1000*0.9); //精度1ms
    }
}

typedef struct timer        //Timer结构体,用来保存一个定时器的信息
{
    int total_time; //每隔total_time秒
    int left_time;  //还剩left_time秒
   // int func;       //该定时器超时,要执行的代码的标志
    unsigned char  occupyed;
}TIMER;


typedef struct
{
    TIMER Timer;
    int task_no;

}TIMER_TASK;


下面的是每个任务的执行逻辑代码部分,该部分的case里的执行代码程序部分也可以通过在上述结构体里添加一个函数指针的方式来实现,例如在创建任务的时候,同时把要执行的函数的的地址指向该结构体里的函数指针即可。


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
        {
            switch(Timer_Task[j].task_no)
            {
                case 1:
                   // Qx_Log_ptr->Log_Buffer_Cache_Store("this is test !\n",8);
                    break;
                case 2:

                    break;
                case 3:
                    
                    break;
                case 4:
                   
                    break;
                case 5:
                    break;
                case 6:
                    break;
                case 7:
                    break;
                case 8:
                    break;
                case 9:

                    break;
                case 10:

                
                    break;

                default:
                    break;

            }
            Timer_Task[j].Timer.left_time=Timer_Task[j].Timer.total_time;     //循环计时
        }
    }
}

TIMER_TASK Timer_Task[TASKMAX]={0}; //申明
static int task_num = TASKMAX;//注册任务的最大个数

#define  TASKMAX 12 


目前最大的精度是到1ms

STC89c51单片机的定时器2

定时器T2的功能比T1、T0都强大,但描述它的资料不多,可能是使用得比较少的缘故吧。它是一个16位的具有自动重装和捕获能力的定时/计数器,它的计数时钟源可以是内部的机器周期,也可以是P1.0输入的外部...
  • u011046042
  • u011046042
  • 2016年07月01日 09:02
  • 3762

AT89S52之(定时器2)Timer2

UR:http://blog.csdn.net/liming0931/article/details/7517747?userName=wanruoqingkong&userInfo=7Y2WES7s...
  • wanruoqingkong
  • wanruoqingkong
  • 2014年04月20日 20:10
  • 2004

STM32F4 开发笔记3: 定时器2-5的使用方法

STM32F4有多种定时器,其中TIM2-TIM5称为通用定时器,具有相似的软件设置及使用方法。在这里还需要注意的是TIM3和TIM4为16位定时器,TIM2和TIM5为32位定时器。     使用...
  • qingwufeiyang12346
  • qingwufeiyang12346
  • 2015年12月21日 16:39
  • 1833

定时器0工作方式2,定时1s

定时器0工作方式2,定时1s
  • euxnijuoh
  • euxnijuoh
  • 2017年01月11日 12:27
  • 576

STC89C52单片机定时器2详细整理

51单片机是我自学的第一款单片机,那时正好是过春节,想起那个寒假,外面下着大雪,有时还会传来一两声爆竹的炸响,而我一个人在房间里摆弄单片机开发板,反复调试程序的时光,真是难忘! 我自认为单片机所有的...
  • u013020969
  • u013020969
  • 2014年09月26日 22:31
  • 6534

linux下的实时定时器

上一篇文章介绍了rdtsc指令的精确计时,不过由于CPU的频率不能保证是固定的,所以这样的方式还是有限制。其实linux下还有一种高精度的定时器,那就是posix_timer。我记得以前看代码的时候C...
  • x86
  • x86
  • 2008年04月08日 12:24
  • 5372

关于Linux的应用层定时器

使用定时器的目的无非是为了周期性的执行某一任务,或者是到了一个指定时间去执行某一个任务。要达到这一目的,一般有两个常见的比较有效的方法。一个是用 Linux 内部的三个定时器;另一个是用 sleep ...
  • luckydarcy
  • luckydarcy
  • 2016年11月08日 11:22
  • 4459

Linux 定时器alarm()

系统中的每个进程都有一个私有的闹钟。这个闹钟很像一个计时器,可以设置在一定秒数后闹钟。时间一到,时钟就发送一个信号SIGALRM到进程。   函数原型:unsigned int alarm(unsig...
  • Lina_ACM
  • Lina_ACM
  • 2016年07月23日 21:20
  • 559

linux配置定时器crontab

基本格式 : *  *  *  *  *  command 分 时 日 月 周 命令 第1列表示分钟1~59 每分钟用*或者 */1表示 第2列表示小时1~23(0表示0点) 第3列表示日期...
  • yangyun_1999
  • yangyun_1999
  • 2014年09月30日 10:42
  • 817

网狐荣耀版"定时器异常:TimerID=2“错误

在网狐荣耀版进行机器人操作或其它操作时,经常会出现"定时器异常:TimerID=2“错误,这个错误怎么处理呢? 这里提示其实已经很明白了,就是定时器错误。 一和运行库有关系,二和操作有关。 ...
  • qq_40543207
  • qq_40543207
  • 2017年11月07日 10:00
  • 273
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux 定时器2
举报原因:
原因补充:

(最多只允许输入30个字)