博文

目前显示的是标签为“中断”的博文

初尝内核中断

每台计算机都连接有很多外设,那操作系统对这些外设进行管理时要如何通信呢?一般有轮询(Polling)和中断(Interrupt)两种,第一种是操作系统定时主动去查询这些外设,看有没有设备需要进行处理,而第二种则是外设需要处理时主动向操作系统发送请求信号,然后操作系统再做相应的处理。这第二种不需要定时去查询,只有在设备需要时才进行处理,节省了CPU的消耗,提高了效率。故而我们先尝试下如何去使用Linux内核的中断处理机制,本次采用共享中断的机制来学习我们的中断程序。  一般来说,一个中断有这样的操作步骤: 1.注册中断及服务子程序; 2.使能中断; 3.中断到来时调用服务子程序进行处理,处理完成后退出继续等待下一个中断的到来。  而在Linux内核源码include/linux/interrupt.h里有注册中断需要用到的如下函数: static inline int __must_check request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev) ; 接下来说说这5个参数吧: 1.irq:中断号/中断向量,在嵌入式里经常会用gpio来作为外部中断请求线,经常会用到gpio_to_irq函数来作转换; 2.handler:服务子程序/中断处理程序,指向一个处理本中断的回调函数,其函数原型如下: typedef irqreturn_t (*irq_handler_t)(int, void *); 其两参数分别对应irq和dev; 3.flags:作为gpio请求中断时,该标志可设置触发方式:高电平、低电平、上升延、下降延,还可以设置该中断的处理模式是:屏蔽、共享等,具体可查阅interrupt.h文件里以IRQF_开头的宏; 4.name:中断请求的设备名称,在/proc/interrupts里可查看到中断号、中断次数、中断设备名称; 5.dev:传递给中断处理程序的参数,void*类型表示可以传递任意类型的数据,一般传递设备结构体指针。该参数在设置为共享模式(IRQF_SHARED)时用于标志共享中断的唯一性。 上面说到了中断注册函数,释放时对应的函数为: extern voi...