LINUX内核定时器(高精度&低精度)

    linux      从内核2.6.16开始引入了高精度     定时器      ,达到ns级别。自此,内核拥有两套并行计时器,低精度和高精度。如果高精度没有开启,即使使用高精度函数,默认使用的仍旧是低精度。

高精度:

虽然内核已经支持高精度,但是对于不少产品而言,由于内核是裁剪的,配置的时候并没有加入编译进去,虽然对应的内核源码中有相关代码。如果想支持,那么可以进入内核源码,执行make menuconfig。去查看当前系统是否支持高精度,(备注:因为里面选项比较多,还可以直接去查看编译好的.config文件,看里面是否有CONFIG_HIGH_RES_     TI   ME     RS   ,如果有,就通过make menuconfig开启,没有的话,就是不支持),是否真正启用,可以在内核中对相应宏进行打印。

低精度:

(定时精度和频率HZ相关,精度为(1000/HZ ) ms)

#include

void do_get  TI meofday(struct  TI meval *tv);//获取精确时间函数

//内核相关定义

struct  TI meval {

 TI me_t tv_sec;       /* seconds */

suseconds_t tv_usec; /*     mi   croseconds */

};

#define TIMER_TOTAL_NUM  2   //定义定时器总数

struct  timeval   tv;

struct  timer_list  funTimer[TIMER_TOTAL_NUM ]; //定义定时器相关结构体数组

short int     siTime   InitFlag[TIMER_TOTAL_NUM  ]; //定时器初始化标志

short int siTimeoutFlag[TIMER_TOTAL_NUM  ];//定时器启动标志

typedef void (*pfTimerFunction)(unsigned long ulData);  //定义定时器处理函数指针,方便处理多个定时器

//定时器初始化

void timer_init(int iIndex, int iMs, pfTimerFunction pTimerFunction)

{

init_timer(&funTimer[iIndex]);//初始化

funTimer[iIndex].function = pTimerFunction;//处理函数

funTimer[iIndex].data = (unsigned long)iMs;//参数传递,在处理函数中可以不使用

funTimer[iIndex].ex     pi   res = jiffies + HZ; //定时时长设置为1s

add_timer(&funTimer[iIndex]);//开启定时器

siTimeInitFlag[iIndex] = 1;//初始标志置为1

siTimeoutFlag[iIndex] = 1;//定时器启动标志

}

//定时器处理函数

static void timer_function(unsigned long ulData)

{

/*

这里写自己需要执行的功能.........

.................

//定时是否准确     测试  

do_gettimeofday(&tv);//获取时间

printk("time------%d:%d\n", tv.tv_sec, tv.tv_usec);//查看间隔,看定时时间是否精准

*/

//循环定时器实现,如果不实现循环,可执行自己要实现的,再进行定时器删除,也可以不删除,到时后自动删除

if(1 == siTimeoutFlag[0])

{

del_timer_sync(&funTimer[0]);//用del_timer_sync代替了del_timer

}

funTimer[0].function = timer_function;

funTimer[0].expires = jiffies + HZ;//重新设置定时时间

add_timer(&funTimer[0]);//启动定时器

siTimeoutFlag[0] = 1;

}

//简单例子调用

int m     ai   n(void)

{

timer_init(0, 3, timer_function);

return 0;

}

使用注意:

1、加入初始化标志siTimeInitFlag[iIndex] 是防止定时器在运行时,再次初始化,这样会导致内核崩溃;

2、使用循环定时器时, funTimer[0].expires = jiffies + HZ; funTimer的成员expires 必须重新赋值,且要执行 ,

add_timer(&funTimer[0]);

3、定时时长funTimer[iIndex].expires = jiffies + HZ; //宏定义HZ可以查看源码,或者打印出来,jiffies 为节拍数,系统最高

精度为(1000/HZ)ms。

jiffies + HZ————-设置定时时长为1s;

jiffies + 1—————设置定时时长为(1000/HZ)ms,是系统最高精度

4、内核添加printk后,由于打印函数耗时,会导致执行时间延长,一个打印延长一般为ms级别



LINUX内核定时器(高精度&低精度)_设计制作_处理器/DSP
32
108
0
47

相关资讯

  1. 1、Win10专业版如何提升游戏流畅度?Win10游戏流畅度的三种提升方法2567
  2. 2、烧狗刻录怎么刻录光盘?烧狗刻录使用方法5226
  3. 3、ps怎么修改GIF动图使用PS修改GIF动图的具体教程299
  4. 4、怎么关闭win10自带杀毒软件2848
  5. 5、XP系统oracle无法使用,教你轻松开启oracle服务2200
  6. 6、GoldWave怎么合并音频文件GoldWave合并音频文件的教程4693
  7. 7、Win11开始菜单怎么设置靠左?Win11任务栏开始菜单靠左设置教程2533
  8. 8、Win8系统开机蓝屏错误代码0xc000000f如何修复?664
  9. 9、Win10怎么恢复输入法的位置?Win10恢复输入法的位置的方法2930
  10. 10、电脑上每次登录QQ弹出的腾讯网新闻怎么关闭?腾讯网新闻关闭教程分享4862
全部评论(0)
我也有话说
0
收藏
点赞
顶部