我有一个 Linux 驱动程序,其中有许多中断要由单个 tasklet 函数处理。
我想为所有这些注册相同的 tasklet,但根据接收到的 irq 更改其行为。我可以这样做吗?
您是否知道其他解决方案?
请不要建议在DECLARE_TASKLET()
我已经知道这不起作用期间声明参数,因为该值是静态的并且不是由 irq 处理程序传递的。
我有一个 Linux 驱动程序,其中有许多中断要由单个 tasklet 函数处理。
我想为所有这些注册相同的 tasklet,但根据接收到的 irq 更改其行为。我可以这样做吗?
您是否知道其他解决方案?
请不要建议在DECLARE_TASKLET()
我已经知道这不起作用期间声明参数,因为该值是静态的并且不是由 irq 处理程序传递的。
我通过使用工作队列解决了这个问题。
每个中断处理程序接收数据结构的不同实例,该实例已在 request_irq() 期间注册。
该结构包含一个 work_struct 作为其字段之一。
您为每个 irq 定义多个 work_structs。
您可以通过从 irq 处理程序调用 INIT_WORK() 来调用工作队列函数,将工作结构字段作为参数传递,这是原始结构的一部分。
然后工作队列函数使用
container_of(work_struct_ptr, struct your_original_struct, work_struct_fieldname);
获取该特定工作队列调用的数据实例。
总之,通过这种方式,您可以拥有多个中断线,由相同的中断处理程序、相同的工作队列函数提供服务,但使用不同的数据结构。
希望这可以帮助。