linux2.4.18内核定时器的使用
Linux2.4下驱动中定时器的应用
我的内核是2.4.18的。Linux的内核中定义了一个定时器的结构:
#include<linux/timer.h>
struct timer_list
{
struct list_head list;
unsigned long expires; //定时器到期时间
unsigned long data; //作为参数被传入定时器处理函数
void (*function)(unsigned long);
};
利用这个结构我们可以在驱动中很方便的使用定时器。
一: timer的API函数:
初始化定时器:
void init_timer(struct timer_list * timer);
增加定时器:
void add_timer(struct timer_list * timer);
删除定时器:
int del_timer(struct timer_list * timer);
修改定时器的expire:
int mod_timer(struct timer_list *timer, unsigned long expires);
二:使用定时器的一般流程为:
(1)创建timer、编写超时定时器处理函数function;
(2)为timer的expires、data、function赋值;
(3)调用add_timer将timer加入列表;
(4)在定时器到期时,function被执行;
(5)在程序中涉及timer控制的地方适当地调用del_timer、mod_timer删除timer或修改timer的expires。
三:一个简单的实例(timer.c):
/****************************************
* 作者:蔡肖飞 *
* 时间:2008年11月27日 *
* 名称:timer.c *
* 说明:本程序用于学习linux内核 *
* 中定时器的基本使用 *
*****************************************/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>//jiffies在此头文件中定义
#include <linux/init.h>
#include <linux/timer.h>
struct timer_list mytimer;//定义一个定时器
void mytimer_ok(unsigned long arg)
{
printk("Mytimer is ok\n");
printk("receive data from timer: %d\n",arg);
}
static int __init hello_init (void)
{
printk("hello,world\n");
init_timer(&mytimer); //初始化定时器
mytimer.expires = jiffies+100;//设定超时时间,100代表1秒
mytimer.data = 250; //传递给定时器超时函数的值
mytimer.function = mytimer_ok;//设置定时器超时函数
add_timer(&mytimer); //添加定时器,定时器开始生效
return 0;
}
static void __exit hello_exit (void)
{
del_timer(&mytimer);//卸载模块时,删除定时器
printk("Hello module exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("CXF");
MODULE_LICENSE("Dual BSD/GPL");
四:交叉编译后,放到开发板上:
#insmod timer.o
可以发现过一秒后定时器过期函数被执行了,打印出了信息,250也被正确传递
了,呵呵!
#rmmod timer
实验完成。
五:进一步理解定时器:
在上面的定时器超时函数mytimer_ok(unsigned long arg)中,添加如下
代码:
mytimer.expires = jiffies+100;//设定超时时间,100代表1秒
mytimer.function = mytimer_ok;//设置定时器超时函数
add_timer(&mytimer); //添加定时器,定时器开始生效
交叉编译后,放到开发板上
#insmod timer.o
发现每隔一秒,mytimer_ok函数就执行一次,这是因为每次定时器到期后,都
又重新给它设置了一个新的超时时间,并且新的超时函数指向自己,形成一个递
归,所以就会一直执行下去。
#rmmod timer
可以卸载模块,当然打印也就结束了,注意因为定时器超时函数不停的打印信息
,导致输入上面的命令时会被定时器超时函数不停的打印信息淹没,不用管他,
耐心的把上面的命令输完就可以成功卸载。
转载自:http://www.cnblogs.com/leaven/archive/2010/07/09/1774456.html
linux2.4.18内核定时器的使用的更多相关文章
- Davinci DM6446开发攻略——linux-2.6.18移植
TI DAVINCI 使用最新的内核是montavista linux-2.6.18,之前说过,国内很多公司,包括开发板的软件包,一直在使用montavista linux-2.6.10,这个版本准 ...
- linux-2.6.26内核中ARM中断实现详解(转)
转载:http://www.cnblogs.com/leaven/archive/2010/08/06/1794293.html 更多文档参见:http://pan.baidu.com/s/1dDvJ ...
- 【内核】linux2.6版本内核编译配置选项(二)
目录 Linux2.6版本内核编译配置选项(一):http://infohacker.blog.51cto.com/6751239/1203633 Linux2.6版本内核编译配置选项(二):http ...
- 【内核】linux2.6版本内核编译配置选项(一)
Linux 2.6.19.x 内核编译配置选项简介 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布.任何人都可以自由使用.转载.复制和再分发, ...
- 【Linux开发】linux设备驱动归纳总结(七):2.内核定时器
linux设备驱动归纳总结(七):2.内核定时器 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- 【整理】--【KERNEL】内核定时器
一.LINUX内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 <linux/timer.h> 和 kernel/timer.c 文件中 ...
- Linux设备驱动——内核定时器
内核定时器使用 内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 <Linux/timer.h> 和 kernel/timer.c 文件 ...
- Linux内核——定时器和时间管理
定时器和时间管理 系统定时器是一种可编程硬件芯片.它能以固定频率产生中断.该中断就是所谓的定时器中断.它所相应的中断处理程序负责更新系统时间,还负责执行须要周期性执行的任务. 系统定时器和时钟中断处理 ...
- Linux驱动技术(七) _内核定时器与延迟工作
内核定时器 软件上的定时器最终要依靠硬件时钟来实现,简单的说,内核会在时钟中断发生后检测各个注册到内核的定时器是否到期,如果到期,就回调相应的注册函数,将其作为中断底半部来执行.实际上,时钟中断处理程 ...
随机推荐
- 15.6.8-sql小技巧
取月头月尾: declare @someDay datetime,@firstDay datetime,@endDay datetime set @someDay='2015.2.2' ,) ,) s ...
- MiniCrowler
MiniCrawler Github Path : https://github.com/LixinZhang/miniCrowler Introduction: MiniCrawler is a s ...
- SQLServer 获得所有表结构(包括表名及字段)
then d.name else null end) 表名, a.colorder 字段序号,a.name 字段名, ( then '√'else '' end) 标识, (case when (SE ...
- UML2
UML中有3种构造块:事物.关系和图,事物是对模型中最具有代表性的成分的抽象:关系是把事物结合在一起:图聚集了相关的的事物.具体关系图标如下 说明:构件事物是名词,是模型的静态部分.行为事物是动态部分 ...
- 查询修改linux 打开文件句柄数量
查询系统支持最大可打开文件句柄数量: #vi /proc/sys/fs/file-max 查询当前连接用户最大可打开文件句柄数量: #ulimit -a 修改当前连接用户最大可打开文件句柄数量: #u ...
- java--遍历自定义数组
比如像下面这样 for (int i : new int[]{1,4,8}){ System.out.println(i); } 或者这样: for (String i : new String[]{ ...
- java-Filter
java-Filter 过滤器是小型的Web组件,它们负责拦截请求以及响应,以便查看.提取或以某种方式操作正在客户机和服务器之间交换的数据.简单的说,过滤器就类似于客户端发送的web请求与服务器之间的 ...
- SQL优化方案
1:建立中间表,将步骤分解. 2:避免全字段查询,只查需要的字段 3:限定条件查询,避免先关联后写条件, --优化交货数据 --建临时表T_JHinfo select A.VBELN,C.VBEL ...
- 自定义ISPF面板
1)登录的时候可以看到登录执行的PROCEDURE,此处为DBSPROC 2.登录后,进入SDSF,再进入LOG,输入命令TOP,再输入命令F JOB,按F11把屏幕向右翻页,看到哪下界面 找到//I ...
- Lambda动态创建
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...