一、Linux内 核中断处理简介
1.1、裸机中断
1.2 linux中断
1、先知道你要使用的中断对应的中断号。
2、先申请request_irq,此函数会激活中断。
3、如果不用中断了,那就释放掉,使用free_irq。
4、中断处理函数irqreturn_t (*irq_handler_t) (int, void *)。
5、使能和禁止中断,
1.3 上半部和下半部
中断一定要处理的越快越好,
1、软中断
static struct softirq_action softirq_vec[NR_SOFTIRQS] 10个
要使用软中断,要先注册,使用函数open_softir。注册以后使用raise_softirq触发。
软中断我们不要去用!!
软中断我们不要去用!!
2、tasklet
也需要用到上半部,只是上半部的中断处理函数重点是调用tasklet_schedule。
1、定义一个tasklet函数。
2、初始化、重点是设置对应的处理函数
3、工作队列
1.4 设备树中断节点信息
1、#interrupt-cells指定interrupt的cells数量,也就是属性interrupts。
intc: interrupt-controller@00a01000 {
compatible = "arm,cortex-a7-gic";
#interrupt-cells = <3>;
interrupt-controller;
reg = <0x00a01000 0x1000>,
<0x00a02000 0x100>;
};
gpio5: gpio@020ac000 {
compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";
reg = <0x020ac000 0x4000>;
interrupts =
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <2>;
};
fxls8471@1e {
compatible = "fsl,fxls8471";
reg = <0x1e>;
position = <0>;
interrupt-parent = <&gpio5>;
interrupts = <0 8>;
};
interrupt-parent指定父中断。interrupts第一个cells就是gpio编号,因此上面就是用的gpio5_io00。
通过函数 irq_of_parse_and_map从inttertupes属性获取中断号。
二、编写试验驱动
1、修改设备树
2、编写中断驱动
3、按键消抖
三、测试
一、Linux阻塞和非阻塞IO
1.1 阻塞与非阻塞简介
阻塞:当资源不可用的时候,应用程序就会挂起。当资源可用的时候,唤醒任务。应用程序使用open打开驱动文件,默认是阻塞方式打开。
非阻塞:当资源不可用的时候,应用程序轮询查看,或放弃。会有超时处理机制。应用程序在使用open打开驱动文件的时候,使用O_NONBLOCK。
1.2 等待队列
1、等待队列头
wait_queue_head_t 需要定义一个。定义以后使用 init_waitqueue_head函数初始化。或者使用宏DECLARE_WAIT_QUEUE_HEAD。
2、等待队列项
wait_queue_t表四等待队列项,或者使用宏DECLARE_WAITQUEUE(name, tsk)。
3、添加队列项到等待队列头
add_wait_queue函数
4、移除等待队列项
资源可用的时候使用remove_wait_queue函数移除。
5、唤醒
wake_up唤醒
1.3、轮询
1.4、驱动里面的poll函数
unsigned int (*poll) (struct file *, struct poll_table_struct *),将wait传递给poll_wait
二、编写试验驱动
1、阻塞IO实验
2、非阻塞IO实验
三、测试