gpt4 book ai didi

c - 如何将自定义参数传递给 linux 定时器的函数?

转载 作者:太空狗 更新时间:2023-10-29 16:02:18 26 4
gpt4 key购买 nike

在某些情况下,我想安排一个定时器(struct timer_list)来处理自定义数据。该结构体的function字段保存了将被触发的实际函数,定义如下:

void (*function)(unsigned long);

问题是我想传递一个指针而不是 unsigned long。我知道根据体系结构,int-ptr 转换可能安全也可能不安全,但我找不到是否所有体系结构都将 long 整数与指针对齐所以这是我的问题(事实上,二合一):

执行 longvoid* 转换是否安全?如果不是,我应该如何处理 unsigned long 参数以在计时器函数中获取我想要的数据指针?

最佳答案

Linux 内核 4.15 removed the data field完全,使这里的答案过时。根据我的推断,将参数传递给定时器回调的首选方法是将它们与定时器一起封装在一个结构中,并使用 from_timer 宏来检索它们,定义为

#define from_timer(var, callback_timer, timer_fieldname) \
container_of(callback_timer, typeof(*var), timer_fieldname)

所以为了传递参数,定义一个额外的结构体

struct timer_data {
struct timer_list timer;
datatype data;
};

并将其传递给设置函数

struct timer_data *tmd = init_timer_data(); //your logic for init
timer_setup(&tmd->timer, callback, flags);

稍后,使用 from_timer 检索参数。默认情况下,指向 timer_list 的指针被传递给回调函数,而不是 4.15 之前的版本中的 unsigned long data

void callback(struct timer_list *t) {
struct timer_data *tmd = from_timer(tmd, t, timer);
datatype data = tmd -> data;
}

关于c - 如何将自定义参数传递给 linux 定时器的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14953871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com