linux内核定时器编程
来源:互联网 发布:皮卡刻字机端口设置 编辑:程序博客网 时间:2024/06/04 00:06
1.linux内核定时器基本结构和函数
1)struct timer_list 一个struct timer_list对应了一个定时器。
#include <linux/timer.h>
以下列出常用的接口:
struct timer_list
{
/*....*/
unsigned long expires;//定时器服务函数开始执行时间
void (*function)(unsigned long);//定义一个指向定时器服务函数的指针function,服务函数有一个 unsigned long的参数,并且返回void
unsigned long data;//定时时间到时,data参数会传入服务函数
}
void init_timer(struct timer_list* timer)//初始化一个定时器
-----------使用定时器的步骤--------------
struct timer_list my_timer_list;//定义一个定时器,可以把它放在你的设备结构中
init_timer(&my_timer_list);//初始化一个定时器
my_timer_list.expire=jiffies+HZ;//定时器1s后运行服务程序
my_timer_list.function=timer_function;//定时器服务函数
add_timer(&my_timer_list);//添加定时器
void timer_function(unsigned long)//写定时器服务函数
del_timer(&my_timer_list);//当定时器不再需要时删除定时器
del_timer_sync(&my_timer_list);//基本和del_timer一样,比较适合在多核处理器使用,一般推荐使用del_timer_sync
-------------------------------------------------
2.以下是一个定时1s的驱动程序,直接上代码
点击(此处)折叠或打开
- #include <linux/miscdevice.h>
- #include <linux/delay.h>
- #include <asm/irq.h>
- //#include <mach/regs-gpio.h>
- //#include <mach/hardware.h>
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/mm.h>
- #include <linux/fs.h>
- #include <linux/types.h>
- #include <linux/delay.h>
- #include <linux/moduleparam.h>
- #include <linux/slab.h>
- #include <linux/errno.h>
- #include <linux/ioctl.h>
- #include <linux/cdev.h>
- #include <linux/string.h>
- #include <linux/list.h>
- #include <linux/pci.h>
- #include <asm/uaccess.h>
- #include <asm/atomic.h>
- #include <asm/unistd.h>
- #include <asm/io.h>
- #include <asm/system.h>
- #include <asm/uaccess.h>
- #define TIMER_MAJOR 300
- #define TIMER_MINOR 0
- dev_t timer_dev_t;//设备号
- dev_t timer_dev_major=TIMER_MAJOR;
- dev_t timer_dev_minor=TIMER_MINOR;
- struct TIMER_DEV
- {
- struct cdev cdev;
- atomic_t count;
- struct timer_list timer_list;
- };
- struct TIMER_DEV* timer_dev;
- //---------timer interrupt function----------------
- static void timer_function(unsigned long data)
- {
- mod_timer(&(timer_dev->timer_list),jiffies+HZ);//重新设置时间
- printk("current jiffies is %ld,count=%d\n",jiffies,timer_dev->count);
- //(timer_dev->count)++;
- atomic_inc(&(timer_dev->count));
- }
- //--------timer release function--------------------
- static int timer_release(struct inode* inode, struct file* filp)
- {
- del_timer_sync(&(timer_dev->timer_list));
- return 0;
- }
- //----------------file open function-----------------
- static int timer_open(struct inode* inode,struct file* filp)
- {
- init_timer(&(timer_dev->timer_list));//初始化定时器
- timer_dev->timer_list.function=timer_function;//设置定时器处理函数
- timer_dev->timer_list.expires=jiffies+HZ;//处理函数1s后运行
- add_timer(&timer_dev->timer_list);//添加定时器
- atomic_set(&(timer_dev->count),0);
- return 0;
- }
- //--------------------------------------
- //----------------timer_read function---------------
- static int timer_read(struct file* filp,char __user *buf,size_t count,loff_t* f_pos)
- {
- unsigned int counter=atomic_read(&(timer_dev->count));
- if(copy_to_user(buf,(unsigned int*)&counter,sizeof(unsigned int)))
- {
- printk("copy to user error\n");
- goto out;
- }
- return (sizeof(unsigned int));
- out:
- return (-EFAULT);
- }
- struct file_operations timer_ops={
- .owner=THIS_MODULE,
- .open=timer_open,
- .read=timer_read,
- .release=timer_release,
- };
- static int __init timer_init(void)
- {
- int ret;
-
- if(TIMER_MAJOR)//主设备号大于0,静态申请设备号
- {
- timer_dev_t=MKDEV(TIMER_MAJOR,TIMER_MINOR);
- ret=register_chrdev_region(TIMER_MAJOR,1,"timer_dev");//first,count,name
- }
- else
- {
- ret=alloc_chrdev_region(&timer_dev_t,0,1,"time_dev");
- timer_dev_major=MAJOR(timer_dev_t);
- }
- if(ret<0)
- {
- printk("can't get major %d\n",timer_dev_major);
- return ret;
- }
- //-----------------------------------------------------------
- timer_dev=kmalloc(sizeof(struct TIMER_DEV),GFP_KERNEL);
- memset(timer_dev,0,sizeof(struct TIMER_DEV));
- cdev_init(&(timer_dev->cdev),&timer_ops);
- cdev_add(&(timer_dev->cdev),timer_dev_t,1);
- printk("init timer_dev success\n");
- return 0;
- }
- static void __exit timer_exit(void)
- {
- kfree(timer_dev);
- cdev_del(&(timer_dev->cdev));
- unregister_chrdev_region(MKDEV(TIMER_MAJOR,0),1);
- }
- module_init(timer_init);
- module_exit(timer_exit);
0
上一篇:C语言符号优先级
下一篇:linux 等待队列
相关热门文章
- SQLPLUS与PL/SQL区别与联系Det...
- 公司兼并重组、风险投资与私募...
- 利用libpcap库编程
- Intel 平台编程总结----缓存...
- Intel 平台编程总结----SIMD技...
- linux 常见服务端口
- 【ROOTFS搭建】busybox的httpd...
- xmanager 2.0 for linux配置
- 什么是shell
- linux socket的bug??
- 现在的博客积分不会更新了吗?...
- shell怎么读取网页内容...
- ssh等待连接的超时问题...
- curl: (56) Recv failure: Con...
- CACTI 不能安装WINE,怎么办?...
给主人留下些什么吧!~~
评论热议
0 0
- linux内核定时器编程
- linux 内核定时器编程
- linux 内核定时器编程
- linux内核定时器编程
- linux内核定时器编程
- linux 内核定时器编程
- linux内核定时器编程
- linux内核定时器编程
- linux内核定时器编程
- linux内核编程之内核定时器
- linux内核定时器编程测试代码
- linux-内核-内核定时器
- 内核定时器编程
- Linux嵌入式 -- 内核 - 内核定时器
- Linux 内核开发 - 内核定时器
- Linux内核定时器
- linux 内核定时器
- linux内核定时器分析
- MT7620交换机框架图
- 如何配置防火墙 - OpenWrt Wiki
- Timezone database is corrupt -this should *never* happen解决方法
- arm-linux-gcc 编译
- C语言符号优先级
- linux内核定时器编程
- linux 等待队列
- linux bus总线
- 关于cdev platform以及class的一点见解
- linux cdev详解
- linux bus总线
- linux class device
- linux device注册
- 学习git笔记,git,最强大的版本管理工具,没有之一。
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
煤矿安全标志牌
煤矿皮带运输机
煤矿工作服厂家
煤矿开采许可证
煤矿自动化公司
煤矿机电安装工程
煤矿井下照明灯
煤矿监测监控系统
露天煤矿实习报告
煤矿自救器数量
煤矿设备展览会
煤矿通风工作计划
煤矿工人工资多少
煤矿自救器型号
煤矿安全月活动
煤矿事故应急管理
煤矿安全现状评价
煤矿安全考试题
煤矿安全个人总结
煤矿瓦斯监测系统
煤矿安全生产监控系统
煤矿工人工资高吗
煤矿工业洗衣机
煤矿调度员工资
煤矿设备管理软件
煤矿标准化管理
煤矿安全生产网
煤矿机电考试题库
煤矿通信与信息化
煤矿电工基础知识
煤矿电工考试题
煤矿风井防爆门
煤矿安全管理标准
煤矿生产许可证
煤矿局部通风机
煤矿机电个人总结
煤矿设备经销商
煤矿工人多少岁退休
煤矿用电缆型号
煤矿设备有限公司
煤矿安全生产费用