linux从内核2.6.16开始引入了高精度定时器,达到ns级别。自此,内核拥有两套并行计时器,低精度和高精度。如果高精度没有开启,即使使用高精度函数,默认使用的仍旧是低精度。
高精度:
虽然内核已经支持高精度,但是对于不少产品而言,由于内核是裁剪的,配置的时候并没有加入编译进去,虽然对应的内核源码中有相关代码。如果想支持,那么可以进入内核源码,执行make menuconfig。去查看当前系统是否支持高精度,(备注:因为里面选项比较多,还可以直接去查看编译好的.config文件,看里面是否有config_high_res_timers,如果有,就通过make menuconfig开启,没有的话,就是不支持),是否真正启用,可以在内核中对相应宏进行打印。
低精度:
(定时精度和频率hz相关,精度为(1000/hz ) ms)
#include
void do_gettimeofday(struct timeval *tv);//获取精确时间函数
//内核相关定义
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
#define timer_total_num 2 //定义定时器总数
struct timeval tv;
struct timer_list funtimer[timer_total_num ]; //定义定时器相关结构体数组
short int sitimeinitflag[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].expires = 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 main(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级别
智能机器人将成为未来世界的主流
什么样式的耳机适合跑步,运动耳机品牌推荐
食品重金属检测仪的功能特点是怎样的
骁龙845加持美图V7硬件升级 麒麟980拍照怎么样
沃尔沃将要把混合充电系统用于电动汽车上
LINUX内核定时器(高精度&低精度)
在扣除非经常性损益的净利润之后,A股半导体公司业绩表现如何?
外媒建议:5G频谱资源限制,Verizon用户在非必要时禁用iPhone 12的5G功能
人工智能与用户隐私从不矛盾,解读华为隐私保护举措 只为树立坚不可摧的的安全城堡
德国SycoTec高速主轴电机:陶瓷劈刀内孔研磨(外研磨)技术
摆脱传统拖把的清洁困扰,UONI由利蒸汽拖把实现深度清洁
智慧交通的下一个十年会是怎样的
人机交互从哪些方面来改变人类生活
一种针对钢轨缺陷的高精度、分布式、在线检测方法
升特发布buck控制器平台最新器件-SC197
网上报警平台
农机是否能在未来几年内普及自动化驾驶?
!供/求hp8508a矢量电压表HP 8508A 小兵/李S
每日一课 | 智慧灯杆之市场规模与发展分析
热缩管在线缆保护中的作用