易截截图软件、单文件、免安装、纯绿色、仅160KB

Linux设备驱动编程之定时器

Linux设备驱动编程之定时器
2006-10-26 13:34
作者:
出处:Linux
责任编辑:方舟
    相关专题:
Linux设备驱动程序开发入门

  Linux内核中定义了一个timer_list结构,我们在驱动程序中可以利用之:
struct timer_list {
 struct list_head list;
 unsigned long expires; //定时器到期时间
 unsigned long data; //作为参数被传入定时器处理函数
 void (*function)(unsigned long);
};
  下面是关于timer的API函数:
  增加定时器
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。
  我们可以参考drivers\char\keyboard.c中键盘的驱动中关于timer的部分:

#include <linux/timer.h>

static struct timer_list key_autorepeat_timer =
{
 function: key_callback
};
static void
kbd_processkeycode(unsigned char keycode, char up_flag, int autorepeat)
{
 char raw_mode = (kbd->kbdmode == VC_RAW);
 if (up_flag) {
  rep = 0;
  if(!test_and_clear_bit(keycode, key_down))
   up_flag = kbd_unexpected_up(keycode);
 } else {
  rep = test_and_set_bit(keycode, key_down);
  /* If the keyboard autorepeated for us, ignore it.
  * We do our own autorepeat processing.
  */
  if (rep && !autorepeat)
   return;
 }
 if (kbd_repeatkeycode == keycode || !up_flag || raw_mode) {
  kbd_repeatkeycode = -1;
  del_timer(&key_autorepeat_timer);
 }
 …
 /*
 * Calculate the next time when we have to do some autorepeat
 * processing. Note that we do not do autorepeat processing
 * while in raw mode but we do do autorepeat processing in
 * medium raw mode.


相关文档:

Linux根文件系统介绍

什么是根文件系统
根文件系统首先是一种文件系统,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。
我们首先从主机上所安装的Linux操作系统 ......

Linux开机启动Oracle

在/etc/rc.local中添加
su - oracle "-c dbstart"
在此之前你要确保该命令可以启动你需要的数据库, 需要测试一下
su - oracle "-c dbstart"
dbstart命令正常运行需要配置/etc/oratab,里面可以配置多个数据库实例,每个的格式:
$ORACLE_SID:$ORACLE_HOME:<N|Y>
正常情况下配置好/etc/oratab, dbstart命令就可以正 ......

Linux 内核配置及编译简介

1.为什么要编译Linux 内核
  众所周知,Linux是开放源码的操作系统,开放源码软件带给我们这计算机水平相对落后的人群的最大好处,就是可以快速学习世界高水平的程序(体系结构及编程方法等等),从而快速提高自身水平。然而这本身,也使多数开放源码软件在编码易用性、针对性方面比不上Microsoft等专业软件公司的产品。使用开 ......

Linux 编程段错误(segmentation error)总结

   最近一段时间在linux下用C做一些学习和开发,但是由于经验不足,问题多多。而段错误就是让我非常头痛的一个问题。不过,目前写一个一千行左右的代码,也很少出现段错误,或者是即使出现了,也很容易找出来,并且处理掉。
    那什么是段错误?段错误为什么是个麻烦事?以及怎么发现程序中的段 ......

linux svn命令大全

1、
将文件checkout到本地目录
svn
checkout
path(path是服务器上的目录)
例如:svn
checkout svn
://192.168
.1.1
/pro/domain
简写:svn
co
2、
往版本库中添加新的文件
svn

add
file
例如:svn
add test.php(添加test.php)
svn
add *.php(添加当前目录下所有的php文件)

3、
将改动 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号