设备树中:
只需要在我们编写的设备树节点中引用已经写好的中断控制器父节点以及配置中断信息即可
重点在于interrupt-parent和interrupts
interrupt-parent:(父控制器节点)
这个填写的内容在 imx6ull.dtsi文件中含有成员interrupt-controller(含有该成员说明是一个中断控制器)中选择合适的填写即gpio1~gpio5、gpc、intc
interrupts:(触发方式)
程序中:
基本函数介绍:
中断注册函数:
中断注销函数
中断处理函数
中断的使能和禁用函数
tip:在调用request_irq函数后等于已经调用了enable_irq函数
关闭和开启全局中断相关函数(宏定义)
软中断:
定义:
由软件发送中断指令产生的中断
软中断编号:
tip:NR_SOFTIRQS并不是中断编号
软中断相关函数:
注册软中断函数:
触发软中断函数:
tasklet:
简介:
tasklet 是基于软中断实现,如果对效率没有特殊要求推荐是用 tasklet 实现中断分层。为什么这么说,根据之前讲解软中断的中断服务函数是一个全局的数组,在多 CPU 系统中,所有 CPU 都可以访问,所以在多 CPU 系统中需要用户自己考虑并发、可重入等问题,增加编程负担。软中断资源非常有限一些软中断是为特定的外设准备的(不是说只能用于特定外设)例如“NET_TX_SOFTIRQ,NET_RX_SOFTIRQ,”从名字可以看出它们用于网络的 TX 和 RX。像网络这
种对效率要求较高的场合还是会使用软中断实现中断分层的。 相比软中断 tasklet
使用起来更简单,最重要的一点是在多
CPU
系统中同一时间只有一个
CPU
运 行 tasklet
,所以并发、可重入问题就变得很容易处理(一个
tasklet
甚至不用去考虑)。
结构体:
struct
tasklet_struct
{
struct
tasklet_struct
*
next;
unsigned long
state;
atomic_t count;
void
(
*
func)(
unsigned long
);
unsigned long
data;
};
函数介绍:
初始化函数:
void
tasklet_init
(
struct
tasklet_struct
*
t,
void
(
*
func)(
unsigned long
),
unsigned long
data)
参数:
t:指定要初始化的
tasklet_struct
结构体
func:指定
tasklet
处理函数,等同于中断中的中断服务函数
data:指定
tasklet
处理函数的参数。函数实现就是根据设置的参数填充
tasklet_struct
结构体
返回值
:
无
触发中断函数(用来触发中断的)
static inline
void
tasklet_schedule(
struct
tasklet_struct
*
t)
工作队列:
简介:
工作队列运行在内核线程,允许被重新调度和睡眠。
结构体:
struct work_struct {
atomic_long_t data;
struct
list_head
entry;
work_func_t func;
#ifdef CONFIG_LOCKDEP
struct
lockdep_map
lockdep_map;
#endif
};
重点在于work_func_t func,
该参数用于指定“工作”的处理函数。
函数介绍:
初始化函数(初始宏定义):
#define INIT_WORK(_work, _func)
该红顶共有两个参数,_work 用于指定要初始化的工作结构体,_func 用于指定工作的处理函数。
触发中断函数:
static inline bool schedule_work(struct work_struct *work)