Linux使用struct    timer_list来描述一个定时器。
  重要成员:

    expires:定时时长
    *function:超时执行函数名
使用流程:
  1、定义定时器变量

/*定义定时器变量结构体*/
struct timer_list key_timer;

  2、初始化定时器
    a、函数init_timer(timer)
      参数:timer:要初始化的定时器的变量名
    b、设置超时函数

  /*初始化定时器*/

    init_timer(&key_timer);

    key_timer.function = key_timer_func;

  3、注册定时器
  void    add_timer(struct timer_list *timer)
  参数:timer:要注册定时器变量的地址

/*注册定时器*/
add_timer(&key_timer);

  4、启动定时器
  int    mod_timer(struct timer_list *timer, unsigned long expires)
  参数:

    timer:要注册定时器变量的地址
    expires:延时时长

/*启动定时器*/
mod_timer(&key_timer,jiffies + (HZ/));

  jiffies:全局变量,当前时间
  HZ是一秒的时间。

  当计时达到后,会执行成员function指定的函数,这里是key_timer_func

这里将定时器应用到键盘中断驱动程序中,用来延时起到消抖的作用

  key.h:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#define GPGCON 0x56000060
#define GPGDAT 0x56000064
unsigned int *gpio_config,*gpio_data;
/*定义工作项结构体*/
struct work_struct *work1; /*定义定时器变量结构体*/
struct timer_list key_timer;

  驱动程序:

#include "key.h"
/********************
函数名:work1_func
参数:无
返回值:无
函数功能:实现工作项
结构体中的func成员
********************/
void work1_func()
{
/*启动定时器*/
mod_timer(&key_timer,jiffies + (HZ/));
} /************************
函数名:que_init
参数:无
返回值:无
函数功能:创建一个工作项
*************************/
int que_init()
{
/*创建工作*/
work1 = kmalloc(sizeof(struct work_struct),GFP_KERNEL); INIT_WORK(work1, work1_func);
} /************************
函数名:key_int
参数:无
返回值:0
函数功能:按键中断处理函数
*************************/
irqreturn_t key_int(int irq, void *dev_id)
{
/*1、检测设备是否产生中断*/ /*2、清除中断产生标志*/ /*3、提交下半部分工作*/
schedule_work(work1); return ;
} /************************
函数名:key_hw_init
参数:无
返回值:无
函数功能:初始化与按键相关
的寄存器
*************************/
void key_hw_init()
{
unsigned int data;
gpio_config = ioremap(GPGCON,);
gpio_data = ioremap(GPGDAT,);
data = readw(gpio_config);
data &= (()|(<<)|(<<)|(<<)|(<<)|(<<));//~(0b11);
data |= (|(<<)|(<<)|(<<)|(<<)|(<<));//0b10;
writew(data,gpio_config);
} /************************
函数名:key_timer_func
参数:无
返回值:无
函数功能:定时器超时处理函
数,达到规定时间执行此函数
*************************/
void key_timer_func()
{
unsigned int key_val,i; for(i = ;i < ;i++)
{
if((i == )||(i == )||(i == )||(i == )||(i == )||(i == ))
{
key_val = readw(gpio_data) & ( << i);
if(key_val == )
printk("press key%d down\n",i);
}
}
} int key_open(struct inode *node, struct file *filp)
{
return ;
} /* 函数映射关系表*/
struct file_operations key_fops =
{
.open = key_open,
//.unlocked_ioctl = key_ioctl,
}; /*字符设备描述结构*/
struct miscdevice key_miscdev =
{
.minor = ,
.name = "key",
.fops = &key_fops,
}; static int key_init()
{
/*注册设备*/
misc_register(&key_miscdev); /*硬件初始化*/
key_hw_init(); /*注册中断*/
request_irq(IRQ_EINT8,key_int,IRQF_TRIGGER_FALLING ,"key", );
request_irq(IRQ_EINT11,key_int,IRQF_TRIGGER_FALLING ,"key", );
request_irq(IRQ_EINT13,key_int,IRQF_TRIGGER_FALLING ,"key", );
request_irq(IRQ_EINT14,key_int,IRQF_TRIGGER_FALLING ,"key", );
request_irq(IRQ_EINT15,key_int,IRQF_TRIGGER_FALLING ,"key", );
request_irq(IRQ_EINT19,key_int,IRQF_TRIGGER_FALLING ,"key", ); /*工作队列初始化*/
que_init(); /*初始化定时器*/ init_timer(&key_timer); key_timer.function = key_timer_func; /*注册定时器*/
add_timer(&key_timer); printk("key.ko is ready\n");
return ;
} static void key_exit()
{
/*注销设备*/
misc_deregister(&key_miscdev);
/*注销中断*/
free_irq(IRQ_EINT8, );
} MODULE_LICENSE("GPL");
module_init(key_init);
module_exit(key_exit);

此代码适用mini2440开发板,不同型号开发板IO口和中断号不同。如果有疑问或建议,欢迎指出。

Linux内核定时器的更多相关文章

  1. 芯灵思Sinlinx A64开发板Linux内核定时器编程

    开发平台 芯灵思Sinlinx A64 内存: 1GB 存储: 4GB 开发板详细参数 https://m.tb.cn/h.3wMaSKm 开发板交流群 641395230 Linux 内核定时器是内 ...

  2. 全志A33开发板Linux内核定时器编程

    开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 Linux 内核定时器是内核 ...

  3. 芯灵思SinlinxA33开发板Linux内核定时器编程

    开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 Linux 内核定时器是内核 ...

  4. 模仿linux内核定时器代码,用python语言实现定时器

    大学无聊的时候看过linux内核的定时器,如今已经想不起来了,也不知道当时有没有看懂,如今想要模仿linux内核的定时器.用python写一个定时器,已经想不起来它的设计原理了.找了一篇blog,li ...

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

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

  6. Linux内核 - 定时器

    #include <linux/timer.h> //头文件 struct timer_list mytimer; //定义变量 static void my_timer(unsigned ...

  7. Linux内核定时器struct timer_list

    1.前言 Linux内核中的定时器是一个很常用的功能,某些需要周期性处理的工作都需要用到定时器.在Linux内核中,使用定时器功能比较简单,需要提供定时器的超时时间和超时后需要执行的处理函数. 2.常 ...

  8. linux 内核定时器

    无论何时你需要调度一个动作以后发生, 而不阻塞当前进程直到到时, 内核定时器是给你 的工具. 这些定时器用来调度一个函数在将来一个特定的时间执行, 基于时钟嘀哒, 并且 可用作各类任务; 例如, 当硬 ...

  9. linux 内核定时器的实现

    为了使用它们, 尽管你不会需要知道内核定时器如何实现, 这个实现是有趣的, 并且值得 看一下它们的内部. 定时器的实现被设计来符合下列要求和假设: 定时器管理必须尽可能简化. 设计应当随着激活的定时器 ...

  10. linux内核--定时器API

    /**<linux/timer.h> 定时器结构体 struct timer_list { ........ unsigned long expires; --内核希望定时器执行的jiff ...

随机推荐

  1. android改动tab 导航 指示器颜色

    我事实上想改动的上面的蓝色条条,改成红色. 这个问题实在是困扰我了太长时间.之前參照google的这个文章: https://developer.android.com/training/basics ...

  2. 安卓kernel自主唤醒系统方法—设置alarm

    我们知道alarm一般是上层设置后.kernel驱动里面将set time写入alarm寄存器,到达时间后trigger,殊不知kernel里面也能够自主设置alarm. 尤其是系统在休眠时驱动nee ...

  3. [转] The Single Biggest Obstacle to Trading Success

    Why do some people succeed spectacularly in the market while others fail? The market is the same for ...

  4. RHEL7和RHEL6的主要变化

    RHEL7和RHEL6的主要变化   RHEL7 RHEL6 文件系统 XFS EXT4 内核版本 3.10.x-x系列 2.6.x-x系列 内核名称 Maipo Santiago 发布时间 2014 ...

  5. linux 管道命令 小记

    管道命令(pipe) 使用“|”界定符号 管道命令必须能够接收来自前一个命令的数据成为standard input才能继续处理 1.选取命令:cut, grep.分析数据,取出我们想要的. -cut ...

  6. 数据库 SQL 外键约束 多表查询

    多表设计与多表查询 1.外键约束        表是用来保存现实生活中的数据的,而现实生活中数据和数据之间往往具有一定的关系,我们在使用表来存储数据时,可以明确的声明表和表之前的依赖关系,命令数据库来 ...

  7. codevs 1269 匈牙利游戏

    /*暴力+乱搞 55分(似乎只有暴力得分了)*/ #include<iostream> #include<cstdio> #include<cstring> #in ...

  8. 关于.net类型转换判断问题

    做项目时,发现这个问题,由于数据库中的字段可能为null,如果在.net程序直接转换时,比如 ltTime.Text =DateTime.Parse(dt.Rows[0]["m_Time&q ...

  9. 关于.NET中的验证码

    常用的生成验证码程序 ,图片效果如下: 源程序如下: 复制代码 代码如下:using System; using System.IO; using System.Drawing; using Syst ...

  10. centos安装vim以及设置

    原文链接:http://www.xiaohuai.com/2884 Centos里的VI只默认安装了vim-minimal-7.x.所以无论是输入vi或者 vim查看文件,syntax功能都无法正常启 ...