0

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

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

您是否知道其他解决方案?

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

4

1 回答 1

1

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

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

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

您为每个 irq 定义多个 work_structs。

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

然后工作队列函数使用

container_of(work_struct_ptr, struct your_original_struct, work_struct_fieldname);

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

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

希望这可以帮助。

于 2014-03-05T20:09:42.037 回答