第四期 第十三讲 Linux中断实验 第十四讲 Linux阻塞和非阻塞IO实验

第十三讲 Linux中断实验

一、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实验

一、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实验

三、测试

你可能感兴趣的:(linux,运维,服务器)