linux内核中的timer_setup(timer, callback, flags)函数,现在变成了回调函数,我不会用这个。请问如何在内核驱动中使用定时器执行一个需要参数的函数呢?
5条回答 默认 最新
- 编程漫步者 2023-03-02 16:20关注
在新版本的内核中,使用timer_setup函数注册定时器时,需要将定时器的回调函数改为void (*)(struct timer_list *), 即回调函数的参数必须是struct timer_list类型的指针。
如果需要在回调函数中传递其他参数,可以通过定时器的data成员传递。例如,可以将需要传递的参数设置为一个结构体,然后将结构体的指针赋值给定时器的data成员。在回调函数中,可以通过timer_list结构体的data成员获取参数的指针。
以下是一个示例代码,用于在内核驱动中使用定时器执行一个需要参数的函数:
#include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/timer.h> struct my_data { int arg1; char arg2; }; static void my_timer_callback(struct timer_list *timer) { struct my_data *data = (struct my_data *)timer->data; // 使用data指向的结构体中的参数执行操作 printk(KERN_INFO "my_timer_callback: arg1=%d, arg2=%c\n", data->arg1, data->arg2); } static struct timer_list my_timer; static int __init my_init(void) { struct my_data *data = kmalloc(sizeof(struct my_data), GFP_KERNEL); if (!data) return -ENOMEM; // 设置定时器回调函数和参数 data->arg1 = 123; data->arg2 = 'a'; my_timer.data = data; my_timer.function = my_timer_callback; my_timer.expires = jiffies + msecs_to_jiffies(1000); // 启动定时器 add_timer(&my_timer); return 0; } static void __exit my_exit(void) { // 删除定时器并释放参数内存 del_timer(&my_timer); kfree(my_timer.data); } module_init(my_init); module_exit(my_exit); MODULE_LICENSE("GPL");
- 在这个示例中,使用kmalloc动态分配了一个my_data结构体,将需要传递的参数存储在结构体中。然后,将结构体的指针赋值给定时器的data成员,在回调函数中通过timer_list结构体的data成员获取参数的指针,并执行操作。最后,在模块卸载时删除定时器并释放参数内存。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 mmocr的训练错误,结果全为0
- ¥15 python的qt5界面
- ¥15 无线电能传输系统MATLAB仿真问题
- ¥50 如何用脚本实现输入法的热键设置
- ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
- ¥30 深度学习,前后端连接
- ¥15 孟德尔随机化结果不一致
- ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
- ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
- ¥15 谁有desed数据集呀