博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux 驱动之内核定时器
阅读量:4470 次
发布时间:2019-06-08

本文共 1895 字,大约阅读时间需要 6 分钟。

1、定时器

之前说过两类跟时间相关的内核结构。

1、延时:通过忙等待或者睡眠机制实现延时。

2tasklet和工作队列,通过某种机制使工作推后运行,但不知道运行的详细时间。

接下来要介绍的定时器,可以使工作在指定的时间点上运行。并且不须要使用忙等待这类的延时方法。

通过定义一个定时器,告之内核在哪个时间须要运行什么函数就行了。等时间一到,内核会就运行指定的函数。

2、使用定时器

定时器的使用非常easy,仅仅须要三部:

1、定义定时器结构体timer_list

2、设置超时时间,定义定时器处理函数和传參。

3、激活定时器

代码

#include 
#include
#include
#include
#if 0 //定义并初始化定时器结构体timer_list。/*include/linux/timer.h*/struct timer_list { struct list_head entry; unsigned long expires; //设置在运行定时器处理函数的时间 void (*function)(unsigned long); //定时器处理函数 unsigned long data; //处理函数的传參 struct tvec_base *base; #ifdef CONFIG_TIMER_STATS void *start_site; char start_comm[16]; int start_pid; #endif };#endifstruct timer_list my_timer; //1.定义定时器结构体timer_listvoid timer_func(unsigned long data) //2.定义定时器处理函数{ printk("time out![%d] [%s]\n", (int)data, current->comm); //打印当前进程}static int __init test_init(void) //模块初始化函数{ init_timer(&my_timer); //1.初始化timer_list结构 my_timer.expires = jiffies + 5*HZ; //2.设定定时器处理函数触发时间为5秒 my_timer.function = timer_func; //2.给结构体指定定时器处理函数 my_timer.data = (unsigned long)99; //2.设定定时器处理函数的传參 add_timer(&my_timer); //3.激活定时器 printk("hello timer,current->comm[%s]\n", current->comm); return 0; }static void __exit test_exit(void) //模块卸载函数{ printk("good bye timer\n");}

三、定时器的删除和改动

上面说了。激活定时器后仅仅能运行一遍。假设要实现隔指定时间又反复运行,那就要改动一下代码。

在定时器处理函数中加上两条代码:

my_timer.expires = jiffies + 2*HZ; //又一次设定时间,在两秒后再运行

add_timer(&my_timer); //再次激活定时器

这种话,每一个2秒就会再次运行定时器处理函数。

这两条代码也相当与一下的函数:

 mod_timer(&my_timer, jiffies + 2*HZ);

/*kernel/timer.c*/

int mod_timer(struct timer_list *timer, unsigned long expires)

这是改变定时器超时时间的函数,假设在指定的定时器(timer)没超时前调用,超时时间会更新为新的新的超时时间(expires)。假设在定时器超时后调用。那就相当于又一次指定超时时间并再次激活定时器。

假设想在定时器没有超时前取消定时器,能够调用下面函数:

/*kernel/timer.c*/

 int del_timer(struct timer_list *timer)

该函数用来删除还没超时的定时器。

转载于:https://www.cnblogs.com/yfceshi/p/6743755.html

你可能感兴趣的文章
链表_leetcode203
查看>>
基于ajax 的 几个例子 session ,ajax 实现登录,验证码 ,实现ajax表单展示
查看>>
连接不上sql server服务器的解决方案
查看>>
记录安装oracle的那些事(二)之双系统安装
查看>>
c3po数据库连接池中取出连接
查看>>
bootstrap-table 分页
查看>>
使用本机IP调试web项目
查看>>
【Java面试题】58 char型变量中能不能存贮一个中文汉字?为什么?
查看>>
C++ Primer 第六章 函数
查看>>
交互设计算法基础(3) - Quick Sort
查看>>
Ubuntu各种软件的安装
查看>>
java开发环境搭建-慕课网
查看>>
NOIP2015-D2T3运输计划
查看>>
Z :彻底了解指针数组,数组指针以及函数指针 [复
查看>>
2013年终总结
查看>>
Start to study Introduction to Algorithms
查看>>
AE常见接口之间的关系(较笼统)+arcgis常见概念
查看>>
正则表达式
查看>>
Mysql的DATE_FORMAT()日期格式转换
查看>>
vue实战教程
查看>>