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内核定时器的使用的更多相关文章

  1. Davinci DM6446开发攻略——linux-2.6.18移植

     TI DAVINCI 使用最新的内核是montavista linux-2.6.18,之前说过,国内很多公司,包括开发板的软件包,一直在使用montavista linux-2.6.10,这个版本准 ...

  2. linux-2.6.26内核中ARM中断实现详解(转)

    转载:http://www.cnblogs.com/leaven/archive/2010/08/06/1794293.html 更多文档参见:http://pan.baidu.com/s/1dDvJ ...

  3. 【内核】linux2.6版本内核编译配置选项(二)

    目录 Linux2.6版本内核编译配置选项(一):http://infohacker.blog.51cto.com/6751239/1203633 Linux2.6版本内核编译配置选项(二):http ...

  4. 【内核】linux2.6版本内核编译配置选项(一)

    Linux 2.6.19.x 内核编译配置选项简介 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布.任何人都可以自由使用.转载.复制和再分发, ...

  5. 【Linux开发】linux设备驱动归纳总结(七):2.内核定时器

    linux设备驱动归纳总结(七):2.内核定时器 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  6. 【整理】--【KERNEL】内核定时器

    一.LINUX内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 <linux/timer.h> 和 kernel/timer.c 文件中 ...

  7. Linux设备驱动——内核定时器

    内核定时器使用 内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 <Linux/timer.h> 和 kernel/timer.c 文件 ...

  8. Linux内核——定时器和时间管理

    定时器和时间管理 系统定时器是一种可编程硬件芯片.它能以固定频率产生中断.该中断就是所谓的定时器中断.它所相应的中断处理程序负责更新系统时间,还负责执行须要周期性执行的任务. 系统定时器和时钟中断处理 ...

  9. Linux驱动技术(七) _内核定时器与延迟工作

    内核定时器 软件上的定时器最终要依靠硬件时钟来实现,简单的说,内核会在时钟中断发生后检测各个注册到内核的定时器是否到期,如果到期,就回调相应的注册函数,将其作为中断底半部来执行.实际上,时钟中断处理程 ...

随机推荐

  1. Linux 导入epel源

    rpm -ivh  http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm rpm -ivh http:// ...

  2. 在线读取office 文件(Word excel 等)

    https://view.officeapps.live.com/op/view.aspx?src=http://www.xxx.com/uploadfile/app/11.xls src 后面的网址 ...

  3. WinStore开发知识导航集锦

    1.页面导航与页面传值:http://blog.csdn.net/tcjiaan/article/details/7895487

  4. RDLC报表 在WinForm里运行出现 未能加载文件或程序集microsoft.reportviewer.winforms

    做一下记录顺便帮助一下遇到问题的朋友. 做RDLC报表在WinForm运行,在VS里面调试引用了“Microsoft.ReportViewer.Common.dll”和“Microsoft.Repor ...

  5. python 字符串替换

    字符串替换可以用内置的方法和正则表达式完成.1用字符串本身的replace方法: a = 'hello word'b = a.replace('word','python')print b 2用正则表 ...

  6. net组件转化成COM组件

    第一步:生成秘钥文件 强名称工具 (Sn.exe) 有助于使用强名称对程序集进行签名.Sn.exe 提供了用于密钥管理.签名生成和签名验证的选项. 1.使用Visual Studio 命令 Visua ...

  7. 【转】Velocity模板(VM)语言介绍

    http://www.blogjava.net/caizh2009/archive/2010/08/20/329495.html Velocity是什么? Velocity是一个基于java的模板引擎 ...

  8. 【转】在web 项目使用了ReportViewer时出错

    ”应用程序中的服务器错误. -------------------------------------------------------------------------------- 分析器错误 ...

  9. 如何在mac os中安装gdb及为gdb进行代码签名

    1. 安装gdb GDB作为一个强大的c/c++调试工具,一直是程序猿们的良好伴侣,但转到Mac os才发现竟然没有默认安装,所幸还有强大的homebrew工具: brew install homeb ...

  10. 自己动手搭建 CAS(Central Authentication Service) 环境,为了单点登录(Single Sign On , 简称 SSO )

    介绍 刚刚搭建 CAS 成功了,现在记录下来,怕以后忘记,同时也给需要帮助的人.CAS 搭建需要服务端和客户端,服务端是 Java 写的,如果自己搭建则需要安装与配置 Java 环境.客户端可以是多种 ...