Linux kernel 如何将值从irq处理程序传递给linux内核tasklet?
我有一个Linux驱动程序,其中有许多中断需要由单个tasklet函数处理 我想为它们注册相同的tasklet,但根据在上接收到它的irq更改其行为。我能做这个吗 你知道有其他的解决方案吗Linux kernel 如何将值从irq处理程序传递给linux内核tasklet?,linux-kernel,interrupt,tasklet,Linux Kernel,Interrupt,Tasklet,我有一个Linux驱动程序,其中有许多中断需要由单个tasklet函数处理 我想为它们注册相同的tasklet,但根据在上接收到它的irq更改其行为。我能做这个吗 你知道有其他的解决方案吗 请不要建议在declare\u TASKLET()期间声明参数。我已经知道这不起作用,因为该值是静态的,没有通过irq处理程序传递。我通过使用工作队列解决了这个问题 每个中断处理程序接收一个不同的数据结构实例,即在请求\u irq()期间注册的实例 该结构包含一个工作结构作为其字段之一 为每个irq定义多个工
请不要建议在
declare\u TASKLET()期间声明参数。
我已经知道这不起作用,因为该值是静态的,没有通过irq处理程序传递。我通过使用工作队列解决了这个问题
每个中断处理程序接收一个不同的数据结构实例,即在请求\u irq()期间注册的实例
该结构包含一个工作结构作为其字段之一
为每个irq定义多个工作结构
通过从irq处理程序调用INIT_WORK()调用workqueue函数,并将WORK struct字段作为参数传递,这是原始结构的一部分
然后,workqueue函数使用
container_of(work_struct_ptr, struct your_original_struct, work_struct_fieldname);
获取特定工作队列调用的数据实例
总之,通过这种方式,您可以有多个中断行,由相同的中断处理程序、相同的工作队列函数提供服务,但工作在不同的数据结构上
希望这有帮助