欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Linux 内核驱动程序开发-006 内核计时器

最编程 2024-04-30 11:42:10
...
/************************************************************************* > File Name: timer.c > Author: yas > Mail: rage_yas@hotmail.com > Created Time: 2024年04月23日 星期二 19时20分42秒 ************************************************************************/ #if 1 /*=========================The timer driver=========================*/ /*==========头文件包含==========*/ #include <linux/init.h> #include <linux/module.h> #include <linux/timer.h> /*==========驱动函数声明==========*/ static int __init timer_driver_init(void); static void __exit timer_driver_exit(void); static void timer_out(unsigned long n); /*==========全局变量==========*/ /* 1 定义内核定时器*/ static struct timer_list timer; /******************************************************************************* * 函 数 名 : timer_out * 函数功能 : * 输 入 : * 输 出 : *******************************************************************************/ static void timer_out(unsigned long n) { printk("%lu\n",n); //timer.data = jiffies; /*修改定时器的超时时间*/ mod_timer(&timer,jiffies+3*HZ);//【目标定时器】【新的到期时间】 } /******************************************************************************* * 函 数 名 : timer_driver_init * 函数功能 : * 输 入 : * 输 出 : *******************************************************************************/ static int __init timer_driver_init(void) { /* 2 初始化内核定时器*/ init_timer(&timer); /* 3个定时器成员变量初始化*/ timer.function=timer_out;//回调函数,定时期满需要执行的代码 timer.expires=jiffies+3*HZ;//定时期满=节拍初值+节拍增量(时间*节拍频率) timer.data=jiffies;//function成员的参数 /* 3 启动定时器*/ add_timer(&timer); return 0; } /******************************************************************************* * 函 数 名 : timer_driver_exit * 函数功能 : * 输 入 : * 输 出 : *******************************************************************************/ static void __exit timer_driver_exit(void) { del_timer(&timer);//删除定时器 } module_init(timer_driver_init); module_exit(timer_driver_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("XXX"); /*=========================The timer driver=========================*/ #endif /*=========================定时器========================*/ /* 1 基本概念: * [HZ]: 计数频率 - 每秒几个节拍 - [include/asm-generic/param.h] * [jiffies]: 本质上就是一个计数器,从系统启动开始计数,计数的周期系统默认配置为[1/200] * 所以定时精度是5ms * 2 定时原理: * 启动内核定时器后,从系统计数器当前状态开始,到达指定时间后,系统调用回调函数。 * 3 补充: * (1)提高[HZ]就可以获得更高的精度->高节拍率 * (2)高节拍率->中断频繁->不如不中断 * * (3)linux的几个延时函数: * void ndelay(unsigned long nsecs);纳秒延时函数 * void udelay(unsigned long usecs);微秒延时函数 * void mdelay(unsigned long mseces);毫秒延时函数 *********************************************************/