如何从irq处理程序将值传递给linux内核tasklet?

时间:2014-03-01 02:05:18

标签: linux-kernel interrupt tasklet

我有一个Linux驱动程序,其中有许多中断由单个tasklet函数处理。

我想为所有这些注册相同的tasklet,但根据收到的irq更改其行为。我可以这样做吗?

您知道其他解决方案吗?

请不要建议在DECLARE_TASKLET()期间声明参数我已经知道这不起作用,因为值是静态的,而不是由irq处理程序传递。

1 个答案:

答案 0 :(得分:1)

我通过使用工作队来解决这个问题。

每个中断处理程序接收一个数据结构的不同实例,即在request_irq()期间注册的数据结构。

该结构包含一个work_struct作为其字段之一。

为每个irq。

定义多个work_structs

通过从irq处理程序调用INIT_WORK()来调用workqueue函数,将工作结构字段作为参数传递,该参数是原始结构的一部分。

然后使用

工作队列功能
container_of(work_struct_ptr, struct your_original_struct, work_struct_fieldname);

获取该特定工作队列调用的数据实例。

总之,通过这种方式,您可以拥有多条中断线,由相同的中断处理程序提供服务,相同的工作队列功能,但可以处理不同的数据结构。

希望这有帮助。