kernel howto

博客提供了一个关于Linux内核构建的链接,即http://www.digitalhermit.com/linux/Kernel - Build - HOWTO.html ,可通过该链接获取Linux内核构建的相关信息。
在 Linux 内核中使用多个定时器(multiple timers)是非常常见的需求,比如驱动程序需要周期性地轮询硬件状态、延时执行某些任务等。Linux 内核提供了基于 `timer_list` 结构的定时器机制,支持创建和管理多个独立的定时器。 下面是如何在 Linux 内核模块中使用多个定时器的完整示例。 --- ### ✅ 示例:使用多个内核定时器 ```c #include <linux/module.h> #include <linux/kernel.h> #include <linux/timer.h> #include <linux/jiffies.h> // 定义两个定时器结构体 static struct timer_list my_timer1; static struct timer_list my_timer2; // 定时器 1 的回调函数 void timer1_callback(struct timer_list *t) { pr_info("Timer 1: Hello from timer 1! jiffies = %lu\n", jiffies); // 如果你想让它重复运行,重新设置过期时间并添加回定时器系统 mod_timer(&my_timer1, jiffies + msecs_to_jiffies(1000)); // 1秒后再次触发 } // 定时器 2 的回调函数 void timer2_callback(struct timer_list *t) { pr_info("Timer 2: Hello from timer 2! jiffies = %lu\n", jiffies); mod_timer(&my_timer2, jiffies + msecs_to_jiffies(2000)); // 2秒后再次触发 } // 模块初始化函数 static int __init multiple_timers_init(void) { pr_info("Multiple timers module loaded.\n"); // 初始化定时器 1 timer_setup(&my_timer1, timer1_callback, 0); my_timer1.expires = jiffies + msecs_to_jiffies(1000); // 1秒后第一次触发 add_timer(&my_timer1); // 初始化定时器 2 timer_setup(&my_timer2, timer2_callback, 0); my_timer2.expires = jiffies + msecs_to_jiffies(2000); // 2秒后第一次触发 add_timer(&my_timer2); return 0; } // 模块退出函数 static void __exit multiple_timers_exit(void) { int ret; // 删除定时器(如果正在运行则返回1) ret = del_timer(&my_timer1); if (ret) pr_info("Timer 1 was still in use...\n"); ret = del_timer(&my_timer2); if (ret) pr_info("Timer 2 was still in use...\n"); pr_info("Multiple timers module unloaded.\n"); } module_init(multiple_timers_init); module_exit(multiple_timers_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("A simple Linux kernel module demonstrating multiple timers"); ``` --- ### 🔍 解释说明: - **`struct timer_list`**:这是内核老版本就存在的定时器结构,在现代内核(>=4.15)中推荐配合 `timer_setup()` 使用。 - **`timer_setup()`**:用于安全初始化定时器,替代旧的直接赋值方式(避免竞争条件)。 - **`mod_timer()`**:修改或启动一个定时器,常用于实现周期性执行。 - **`jiffies` 和 `msecs_to_jiffies()`**:将毫秒转换为节拍数(jiffies),是内核中常用的时间单位。 - **`add_timer()`**:激活并添加定时器到内核调度系统。 - **`del_timer()`**:安全删除一个定时器,防止已删除的定时器被再次触发。 > ⚠️ 注意事项: > - 所有定时器回调函数运行在**中断上下文**中,不能调用可能睡眠的函数(如 `msleep`, `kmalloc(..., GFP_KERNEL)`, `printk` 除外)。 > - 若需执行耗时操作,请结合工作队列(workqueue)使用。 --- ### ✅ 可扩展性建议 你可以通过以下方式进一步优化多定时器管理: 1. **动态分配定时器**:使用 `kzalloc` 动态创建多个定时器对象。 2. **使用 `hrtimer` 高精度定时器**:如果你需要微秒级精度,应改用 `struct hrtimer`。 3. **封装结构体**:将定时器与其数据绑定在一个结构中,便于管理。 例如: ```c struct my_device { struct timer_list timer; int id; char name[16]; }; ``` 然后在 `timer_callback` 中通过 `container_of(t, struct my_device, timer)` 获取上下文。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值