Z.C. 2023-03-02 16:13 采纳率: 28.6%
浏览 42
已结题

内核定时执行需参函数

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成员获取参数的指针,并执行操作。最后,在模块卸载时删除定时器并释放参数内存。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 3月11日
  • 已采纳回答 3月3日
  • 创建了问题 3月2日

悬赏问题

  • ¥15 mmocr的训练错误,结果全为0
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀