栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Linux内核定时器使用

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux内核定时器使用

Linux驱动定时器的使用 一、结构体定义

在Linux kernel-5.11中内核对定时器的定义:

#include/linux/timer.h
struct timer_list {
	
	struct hlist_node	entry;	//定时器的链表
	unsigned long		expires; //以节拍为单位的定时时间,表示为定时器触发的到期时间
	void			(*function)(struct timer_list *); //该指针指向定时器处理函数,参数为struct timer_list类型指针
	u32			flags;

#ifdef CONFIG_LOCKDEP
	struct lockdep_map	lockdep_map;
#endif
};
二、使用方法

1) 定义定时器: struct timer_list my_timer

2)初始化定时器:timer_setup()在内核中被定义成一个宏,参数说明如下所示。

#define timer_setup(timer, callback, flags)			
	__init_timer((timer), (callback), (flags))

3)修改定时器的延时时间并把定时器添加进内核:mod_timer() 内核原型为:

//path:/kernel/time/time.c
//需要传入两个参数

int mod_timer(struct timer_list *timer, unsigned long expires)
{
	return __mod_timer(timer, expires, 0);
}
EXPORT_SYMBOL(mod_timer);

//同时也可以使用add_timer往内核中添加定时器,这个函数要求先对timer_list结构expires成员进行初始化

void add_timer(struct timer_list *timer)
{
	BUG_ON(timer_pending(timer));
	mod_timer(timer, timer->expires);
}
EXPORT_SYMBOL(add_timer);

4)删除定时器:如果需要在定时器到期之前停止定时器,则可以使用该函数,若是定时器已经过期则不需调用该函数,因为它们会自动删除 del_timer(&my_timer);

三、测试代码

注册定时器之后,在timer_callback()修改定时器的延时时间,这个是第一种方式实现,大家可以尝试使用add_timer()方式实现。

#include  
#include  
#include  
#include  
#include 

//毫秒
#define TIMEOUT 5000

//定义定时器 
struct timer_list mytimer;
unsigned int count = 0;

//定时器处理函数 mod_timer(&mytimer, jiffies + TIMEOUT);
static void timer_callback(struct timer_list *data) {  
    printk("Timer Callback function Called [%d]n", count++);
    mod_timer(&mytimer, jiffies + msecs_to_jiffies(TIMEOUT));
}

//定时器初始化过程 
static int __init timer_init(void) { 
    
    timer_setup(&mytimer, timer_callback, 0);

    
    mod_timer(&mytimer, jiffies + msecs_to_jiffies(TIMEOUT));
    return 0;
}

static void __exit timer_exit(void) {
    
    del_timer(&mytimer);
}

module_init(timer_init);
module_exit(timer_exit);
MODULE_AUTHOR("curtis"); 
MODULE_LICENSE("GPL"); 
四、注意事项
  • 没有 current 指针、不允许访问用户空间。因为没有进程上下文,相关代码和被中断的进程没有任何联系。

  • 不能执行休眠(或可能引起休眠的函数)和调度。

  • 任何被访问的数据结构都应该针对并发访问进行保护,以防止竞争条件。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/309198.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号