linux驱动开发--内核定时器

简介: <p>1、内核定时器</p> <p>时钟中断:由系统的定时硬件以周期性的时间间隔发生,这个间隔(也就是频率)由内核根据常数HZ来确定。<br> HZ常数:她是一个与体系结构无关的常数,可以配置50-1200之间,可以在内核中配置<br> tick:她是HZ的倒数,也就是每发生一次硬件定时器中断的事件间隔。如HZ为200,tick为5毫秒。<br> jiffies核心变数:它是lin

1、内核定时器

时钟中断:由系统的定时硬件以周期性的时间间隔发生,这个间隔(也就是频率)由内核根据常数HZ来确定。
HZ常数:她是一个与体系结构无关的常数,可以配置50-1200之间,可以在内核中配置
tick:她是HZ的倒数,也就是每发生一次硬件定时器中断的事件间隔。如HZ为200,tick为5毫秒。
jiffies核心变数:它是linux核心变数(32位变数,unsigned long),它被用记录自开机以来,已经过多少个tick。每发生一次硬件定时器中断,jiffies变数会被加1。

定时器的作用:
内核定时器由用户控制某个函数(定时器函数)来特定的在未来某个时刻执行。
内核定时器注册的处理函数只执行一次(不是循环执行的)。

内核定时器定义:
在<linux/timer.h>中定义

struct timer_list
{
	struct list_head entry;//内核使用
	unsigned long expires;//超时时间jiffies的值
	void (*function)(unsigned long);//超时处理函数
	unsigned long data;//内核调用超时处理函数时传递给它的参数
	struct tvec_base *base;//内核使用
};

内核定时器操作:
静态初始化
TIMER_INITIALIZER(_function, _expires, _data)
_function:定时器处理函数
_expires:定时器超时jiffies值
_data:传递给定时器处理函数的参数

定义定时器
DEFINE_TIMER(_name, _function, _expires, _data);
_name:待定义的内核定时器变量名称
_function:定时器处理函数
_expires:定时器超时jiffies值
_data:传递给定时器处理函数的参数

动态初始化
void init_timer(struct timer_list *timer);
timer:待初始化的内核定时器
添加定时器
void add_timer(struct timer_list *timer);
timer:待初始化的内核定时器
删除定时器
该函数是在定时器超时前将定时器删除
实际上,在定时器超时后,系统会自动将其删除
void del_timer(struct timer_list *timer);
timer:待初始化的内核定时器

修改定时器
该函数实际相当于del_timer(), timer->expires=expires, add_timer()三个步骤
int mod_timer(struct timer_list *timer, unsigned long expires);
timer:待修改的内核定时器
expires:待修改内核定时器的新超时值
返回:返回0表示定时器处于不活动状态,返回1表示定时器处于活动状态

2、实例代码:

/**
*Copyright (c) 2013.TianYuan
*All rights reserved.
*
*文件名称: kerneltimer.c
*文件标识: 内核定时器 
*
*当前版本:1.0
*作者:wuyq 
*
*取代版本:xxx
*原作者:xxx
*完成日期:2013-11-25
*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/timer.h>

MODULE_LICENSE("GPL");

/*定时器变量*/
struct timer_list bigdog_timer;

#define BARK_TIMER	5/*定时器时间间隔*/
#define BARK_COUNTS	10/*次数*/
void bigdog_timer_handler(unsigned long data)
{
	/*记录该函数被调用的次数*/
	static int bark_count = 0;
	
	printk("wangwang~~~~~~~~~%ld!\n", data);
	if(bark_count < BARK_COUNTS){
		bigdog_timer.expires = jiffies+HZ*BARK_TIMER;
		bigdog_timer.data++;
		add_timer(&bigdog_timer);
		
		bark_count++;
	}
}

int __init kerneltimer_init(void)
{
	/*初始化定时器变量*/
	init_timer(&bigdog_timer);
	bigdog_timer.expires = jiffies+HZ*BARK_TIMER;//超时时间.安装模块时间之后5秒
	bigdog_timer.function = bigdog_timer_handler;//处理函数;函数指针:void (*fun)(unsigned long)
	bigdog_timer.data = 100;
	
	/*添加定时器到内核中去*/
	add_timer(&bigdog_timer);
	printk("add_timer() Done!\n");
	
	return 0;
}

void __exit kerneltimer_exit(void)
{
	/*从内核中删除指定的定时器*/
	del_timer(&bigdog_timer);
	printk("del_timer() done!\n");
}

module_init(kerneltimer_init);
module_exit(kerneltimer_exit);

KERNELDIR ?=/root/Desktop/work/ldd3/linux-2.6.31_TX2440A
PWD := $(shell pwd)
obj-m += kerneltimer.o

default:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:
	@rm -f *.o *.ord* *.sy* *.mod.* *.ko



目录
相关文章
|
安全 网络协议 Linux
深入理解Linux内核模块:加载机制、参数传递与实战开发
本文深入解析了Linux内核模块的加载机制、参数传递方式及实战开发技巧。内容涵盖模块基础概念、加载与卸载流程、生命周期管理、参数配置方法,并通过“Hello World”模块和字符设备驱动实例,带领读者逐步掌握模块开发技能。同时,介绍了调试手段、常见问题排查、开发规范及高级特性,如内核线程、模块间通信与性能优化策略。适合希望深入理解Linux内核机制、提升系统编程能力的技术人员阅读与实践。
1120 1
|
Ubuntu Linux
Ubuntu 23.04 用上 Linux 6.2 内核,预计下放到 22.04 LTS 版本
Linux 6.2 带来了多项内容更新,修复了 AMD 锐龙处理器设备在启用 fTPM 后的运行卡顿问题,还增强了文件系统。
|
Ubuntu Linux
Ubuntu 23.10 现在由Linux内核6.3提供支持
如果你想在你的个人电脑上测试一下Ubuntu 23.10的最新开发快照,你可以从官方下载服务器下载最新的每日构建ISO。然而,请记住,这是一个预发布版本,所以不要在生产机器上使用或安装它。
|
传感器 监控 Ubuntu
10 月发布,Ubuntu 23.10 已升级到 Linux Kernel 6.3 内核
硬件方面,Linux 6.3 引入了在 HID 中引入了原生的 Steam Deck 控制器接口,允许罗技 G923 Xbox 版赛车方向盘在 Linux 上运行;改善 8BitDo Pro 2 有线控制器的行为;并为一系列华硕 Ryzen 主板添加传感器监控。
|
Ubuntu Linux
Ubuntu24.04LTS默认采用Linux 6.8内核,实验性版本可通过PPA获得
IT之家提醒,当下的 Ubuntu 23.10 也是一个“短期支持版本”,该版本将在今年 7 月终止支持,而今年 4 月推出的 Ubuntu 24.04 LTS 长期支持版本将获得 5 年的更新支持。
|
监控 Ubuntu Linux
什么Linux,Linux内核及Linux操作系统
上面只是简单的介绍了一下Linux操作系统的几个核心组件,其实Linux的整体架构要复杂的多。单纯从Linux内核的角度,它要管理CPU、内存、网卡、硬盘和输入输出等设备,因此内核本身分为进程调度,内存管理,虚拟文件系统,网络接口等4个核心子系统。
1191 0
|
Web App开发 缓存 Rust
|
Ubuntu 安全 Linux
Ubuntu 发行版更新 Linux 内核,修复 17 个安全漏洞
本地攻击者可以利用上述漏洞,攻击 Ubuntu 22.10、Ubuntu 22.04、Ubuntu 20.04 LTS 发行版,导致拒绝服务(系统崩溃)或执行任意代码。
|
Ubuntu 机器人 物联网
Linux Ubuntu 22.04 LTS 测试版实时内核已可申请
请注意,在启用实时内核后您需要手动配置 grub 以恢复到原始内核。更多内容请参考: