5.中断机制
- linux中断机制和其他操作系统的异同
相同的: 中断上下文切换,如保留现场,中断向量表跳转,调用中断处理程序,恢复现场等。
linux 特有的: 中断上半部,中断下半部
- 中断使用相关函数
disable_irq(int irq); //屏蔽指定中断号的中断
enable_irq(int irq); //使能某中断号的中断
request_irq(unsigned int irq, //硬件中断号
irq_handler_t handler, //中断处理函数
unsigned long flags, //中断标志
const char *name, //中断名称
void *dev)
//释放指定的中断, irq表示中断号 dev_id中断共享时用,一般为NULL
void free_irq(unsigned int irq,void *dev_id);
/*中断耗时部分的推迟处理*/
推迟处理一般用 tasklet和 workqueue
//tasklet的使用
DECLARE_TASKLET (xxx_tasklet, xxx_do_tasklet, 0) //注册tasklet
tasklet_schedule(&xxx_tasklet) //触发tasklet
static void xxx_do_tasklet(unsigned long arg) //处理函数
//workqueue的使用
struct work_struct my_wq; //定义工作队列 (用于推迟处理耗时操作)
INIT_WORK(&my_wq,(void *)my_delay_work); //初始化工作队列
schedule_work(&my_wq); //启动工作队列
void my_delay_work(unsigned long arg)//处理函数
- 设备树配置
interrupt-key {
compatible = "interrupt,key";
interrupt-parent = <&gpx1>;
/*对应arch\arm\boot\dts\exynos4x12-pinctrl.dtsi 中的
gpx1: gpx1 {
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
interrupt-parent = <&gic>;
interrupts = <0 24 0>, <0 25 0>, <0 26 0>, <0 27 0>,
<0 28 0>, <0 29 0>, <0 30 0>, <0 31 0>;
#interrupt-cells = <2>;
};
*/
interrupts = <1 2>;<2,2>
/* 1 对应 gpx1 第二组中断 <0 25 0> 。
2 对应触发方式 下降沿触发
( 详见 Documentation/devicetree/bindings/arm/gic.txt
2 = high-to-low edge triggered)
25由来:电路图(K2->UART_RING->XEINT9)
->芯片手册 9.2 Interrupt Source
-> 25 57 – EINT[9] External Interrupt
*/
};