Linux内核定时器
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内核定时器的更多相关文章
- 芯灵思Sinlinx A64开发板Linux内核定时器编程
开发平台 芯灵思Sinlinx A64 内存: 1GB 存储: 4GB 开发板详细参数 https://m.tb.cn/h.3wMaSKm 开发板交流群 641395230 Linux 内核定时器是内 ...
- 全志A33开发板Linux内核定时器编程
开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 Linux 内核定时器是内核 ...
- 芯灵思SinlinxA33开发板Linux内核定时器编程
开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 Linux 内核定时器是内核 ...
- 模仿linux内核定时器代码,用python语言实现定时器
大学无聊的时候看过linux内核的定时器,如今已经想不起来了,也不知道当时有没有看懂,如今想要模仿linux内核的定时器.用python写一个定时器,已经想不起来它的设计原理了.找了一篇blog,li ...
- Linux内核——定时器和时间管理
定时器和时间管理 系统定时器是一种可编程硬件芯片.它能以固定频率产生中断.该中断就是所谓的定时器中断.它所相应的中断处理程序负责更新系统时间,还负责执行须要周期性执行的任务. 系统定时器和时钟中断处理 ...
- Linux内核 - 定时器
#include <linux/timer.h> //头文件 struct timer_list mytimer; //定义变量 static void my_timer(unsigned ...
- Linux内核定时器struct timer_list
1.前言 Linux内核中的定时器是一个很常用的功能,某些需要周期性处理的工作都需要用到定时器.在Linux内核中,使用定时器功能比较简单,需要提供定时器的超时时间和超时后需要执行的处理函数. 2.常 ...
- linux 内核定时器
无论何时你需要调度一个动作以后发生, 而不阻塞当前进程直到到时, 内核定时器是给你 的工具. 这些定时器用来调度一个函数在将来一个特定的时间执行, 基于时钟嘀哒, 并且 可用作各类任务; 例如, 当硬 ...
- linux 内核定时器的实现
为了使用它们, 尽管你不会需要知道内核定时器如何实现, 这个实现是有趣的, 并且值得 看一下它们的内部. 定时器的实现被设计来符合下列要求和假设: 定时器管理必须尽可能简化. 设计应当随着激活的定时器 ...
- linux内核--定时器API
/**<linux/timer.h> 定时器结构体 struct timer_list { ........ unsigned long expires; --内核希望定时器执行的jiff ...
随机推荐
- 使用symbolicatecrash分析crash文件
对于我们iOS开发者来说,最心碎的事莫过于苹果审核一个星期后上架app store,而第二天就报出闪退bug.一周前我刚经历过,而且最坑的是由于第一次做个人开发,经验不足,没有集成友盟的分析SDK,还 ...
- Asp.Net MVC 页面代码压缩筛选器-自定义删除无效内容
Asp.Net MVC 页面代码压缩筛选器 首先定义以下筛选器,用于代码压缩. /*页面压缩 筛选器*/ public class WhiteSpaceFilter : Stream { privat ...
- DataGrid 使用模型列后实现点击列名称排序
DataGrid 使用模型列后实现点击列名称排序 代码如下: <DataGridTemplateColumn Header="型 号" SortMemberPath=&quo ...
- php获取某个目录下面文件的内容
if(!defined('PATH'))define('PATH', dirname(dirname(__FILE__)).'/');ini_set ( 'include_path', '.:' . ...
- 运维监控利器smokeping 500报错处理
检查apache日志发现有以下错误: No such file or directory: exec of '/usr/local/smokeping/htdocs/smokeping.cgi' fa ...
- java之NIO编程
所谓行文如编程,随笔好比java文件,文章好比类,参考文献是import,那么目录就是方法定义. 本篇文章处在分析thrift的nonblocking server之前,因为后者要依赖该篇文章的知识. ...
- 3D dungeon
算法:广搜: 描述 You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is comp ...
- ubuntu11.10(TQ210)下移植boa服务器
平台:ubuntu11.10 一.下载源码包www.boa.org boa-0.94.13.tar.gz 二.解压,在其src目录下生产makefile #tar xvfz boa-0.94.1 ...
- golang byte转string 字节数组转字符串的问题
golang语言本身就是c的工具集,开发c的程序用到的大部分结构体,内存管理,携程等,golang基本都有,他只是在这个基础上又加了一些概念这里说一个很小的问题,就是字节数组转string的问题,网上 ...
- 常用CSS代码片断
单行文本截字 .nowrap { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; word-break: normal; ...