Linux驱动中动态定时器的使用
2020-04-07 12:30
1461 查看
动态定时器被动态的创建和撤销,使用Linux提供的一组函数与数据结构进行Timer的编程。
定时器数据结构:
time_list { struct list_head entry; unsigned long expires; unsigned long data; void (*function)(unsigned long); }
expires: 定时器到期时间
function(): 定时器到期后执行函的数
data: 传入function()的参数
Linux提供的一组定时器函数
初始化定时器
void init_timer(struct timer_list *timer);
将定时器加入到内核定时器链表中
void add_timer(struct timer_list *timer);
修改定时器的expires
int mod_timer(struct timer_list *timer, unsigned long expires);
删除定时器
del_timer(struct timer_list *timer)
下面看一个例子:
1.创建两个结构体dev1,dev2, dev1每隔10s打印一次,dev2每隔20s打印一次。
2. 两个设备定时器,使用相同的定时器处理函数,在处理函数中再分别处理每个隔定时器。
#include <linux/module.h> #include <linux/init.h> MODULE_LICENSE("GPL v2"); typedef void (*fn_timer)(unsigned long); typedef struct dev { char name[10]; struct timer_list dev_timer; fn_timer fn; }dev_tt; dev_tt dev1 = {"dev1"}; dev_tt dev2 = {"dev2"}; static void dev_timer(unsigned long arg) { dev_tt *dev = (dev_tt *)arg; if(strcmp(dev->name,"dev1") == 0) dev->dev_timer.expires = jiffies + 10 * HZ; if(strcmp(dev->name,"dev2") == 0) dev->dev_timer.expires = jiffies + 20 * HZ; (dev->fn)(arg); add_timer(&dev->dev_timer); } static void dev1_timer(unsigned long arg) { dev_tt *dev = (dev_tt *)arg; printk("dev: %s\n",dev->name); } static void dev2_timer(unsigned long arg) { dev_tt *dev = (dev_tt *)arg; printk("dev: %s\n",dev->name); } static int init_dev_timer(dev_tt* dev,fn_timer fn,int delay) { if(dev == NULL) return -1; init_timer(&dev->dev_timer); dev->dev_timer.data = (unsigned long)dev; dev->dev_timer.function = dev_timer; dev->dev_timer.expires = jiffies + delay; dev->fn = fn; add_timer(&dev->dev_timer); return 0; } static int __init dev_init(void) { init_dev_timer(&dev1, dev1_timer,5 * HZ); init_dev_timer(&dev2, dev2_timer,10 * HZ); printk(KERN_EMERG"init all timers......\n"); return 0; } module_init(dev_init); static void __exit dev_exit(void) { del_timer(&dev1.dev_timer); del_timer(&dev2.dev_timer); printk("delete all timers......\n"); } module_exit(dev_exit);
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- Linux yum日常操作
- 【Linux】Linux日常操作命令
- Linux查看程序被Killed原因
- Linux虚拟机(CentOS5)学习笔记(一)之基本命令
- Linux虚拟机(CentOS5)学习笔记(二)之基本命令
- Linux虚拟机(CentOS5)学习笔记(三)之Vim
- Linux虚拟机(CentOS5)学习笔记(四)之自有服务
- Linux虚拟机(CentOS5)学习笔记(五)之自有服务
- linux spark连接MySQL数据库并打印到控制台上
- 【华为云技术分享】Linux软件安装的几种方法 (一)—— apt-get
- Centos7设置静态IP后无法上网的解决方法
- CentOS7没有telnet命令的解决方法
- CentOS7没有ftp命令的解决方法
- CentOS7没有ifconfig命令的解决方法
- CentOS7配置samba共享文件系统
- CentOS7配置rsync实现文件同步
- freecplus框架,Linux平台下C/C++程序员提高开发效率的利器
- Linux Yum安装mysql的数据库迁移目录
- Linux文本处理三剑客之sed
- clickhouse安装和入门