- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在尝试在没有原始板制造商支持的情况下将驱动程序从 2.6 移植到 4.X(并且 Linux 经验非常有限)。
原始驱动程序使用init_timer()
并传入指向timer_list
结构的指针。 timer_list
结构的 data
元素被设置为指向另一个内存结构的指针,而 function
元素被设置为回调。在回调函数中,data
元素用于访问其他内容。
当前计时器init
-方法使用:
timer_setup( timer_list *, callback, (unsigned int) flags);
并且 timer_list
结构被更改以消除 data
字段。
我不确定通知等效 data
元素的回调函数的最佳/正确方法是什么。谁能提供一些指导?
这是老司机的一个片段:
myDevice * dev;
dev->getIntrTimer = kmalloc(sizeof(struct timer_list), GFP_KERNEL);
init_timer(dev->getIntrTimer);
dev->getIntrTimer->data = (unsigned long) dev;
dev->getIntrTimer->function = GetIntrTimerCallback;
回调函数是这样开始的:
void GetIntrTimerCallback(unsigned long devAddr)
{
myDevice *dev = (myDevice *) devAddr;
dev->blahBlah++; // etc.
因此,旧代码将指针传递给 myDevice
,以便在回调中可以访问该结构。
但是对于新的计时器方法,只有一个 4 字节的 int 可用,而指针是 8(或其他)。
我想做的是:
dev->getIntrTimer = kmalloc(sizeof(struct timer_list), GFP_KERNEL);
timer_setup(dev->getIntrTimer, GetIntrTimerCallback, dev);
当然这会产生编译错误,因为 dev
是指向类型 myDevice
的指针,它不适合 int。
最佳答案
具有三个参数的 timer_setup()
自 4.14 Linux 内核以来就存在(仅供引用,在较早的版本中有 setup_timer()
)。如果您维护一些应该与最新内核相关的代码 - 每次 API 更改时您都必须以适当的方式更改它。现在您可以通过基于 container_of()
的特殊函数 from_timer()
访问您的数据.
timer_list
通常不用作结构内部的指针,因此该示例暗示了正常用法,可能类似于:
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)
init_timer(&dev->getIntrTimer);
dev->getIntrTimer.data = (unsigned long) dev;
dev->getIntrTimer.function = GetIntrTimerCallback;
/* ... */
add_timer(&dev->getIntrTimer);
#else
timer_setup(&dev->getIntrTimer, GetIntrTimerCallback, 0);
/* the third argument may include TIMER_* flags */
/* ... */
#endif
回调函数:
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)
void GetIntrTimerCallback(unsigned long devAddr)
{
myDevice *dev = (myDevice *) devAddr;
#else
void GetIntrTimerCallback(struct timer_list *t)
{
myDevice *dev = from_timer(dev, t, getIntrTimer);
#endif
/* Do something with "dev" */
另请阅读:
关于c - 从旧的 init_timer 到新的 timer_setup 的适配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53839625/
我正在尝试寻找一个错误,该错误会导致 PC 在 get_next_timer_interrupt() 代码周围有时在 run_timer_softirq() 间歇性崩溃 我发现一个驱动程序可能经常调用
我正在尝试构建一个 SDK 驱动程序(没有制造商的文档或支持)。原始驱动程序使用 init_timer() 并传入指向 timer_list 结构的指针。它使用“数据”元素。现在我知道一些计时器函数在
我有一个创建计时器的 Linux 模块,其中一些计时器可能会在它们的处理程序函数期间再次添加它们自己。 在其他一些情况下,使用 del_timer_sync() 删除计时器(可能在它关闭之前)。 在这
在 if() 语句中包装对 del_timer() 或 del_timer_sync() 的调用似乎是明智的,例如: if (timer_pending(&t)) { del_timer_sy
我一直在尝试在没有原始板制造商支持的情况下将驱动程序从 2.6 移植到 4.X(并且 Linux 经验非常有限)。 原始驱动程序使用init_timer() 并传入指向timer_list 结构的指针
我是一名优秀的程序员,十分优秀!