我有一个Linux驱动程序,其中有许多中断由单个tasklet函数处理。
我想为所有这些注册相同的tasklet,但根据收到的irq更改其行为。我可以这样做吗?
您知道其他解决方案吗?
请不要建议在DECLARE_TASKLET()
期间声明参数我已经知道这不起作用,因为值是静态的,而不是由irq处理程序传递。
答案 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);
获取该特定工作队列调用的数据实例。
总之,通过这种方式,您可以拥有多条中断线,由相同的中断处理程序提供服务,相同的工作队列功能,但可以处理不同的数据结构。
希望这有帮助。