5.中断机制

  • linux中断机制和其他操作系统的异同
       相同的: 中断上下文切换,如保留现场,中断向量表跳转,调用中断处理程序,恢复现场等。
      linux 特有的: 中断上半部,中断下半部
    5.中断机制
  • 中断使用相关函数
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 			                             
			*/   
		};