本章以按键驱动程序的编写为例来说明字符设备驱动编写中如何加入中断功能。继上一章中杂项设备驱动的编写方法,在编写带有中断的字符设备驱动时,需要在open()设备文件时配置设备中断之后申请中断(request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev)),其中参数irq在此表示外部中断号;handler在此表示中断处理函数指针;flags在此表示中断触发条件;dev在此表示传递给handler的参数。当close()设备文件时需要释放中断(free_irq(unsigned int irq, void *(参数未知)))。下面将编写好的驱动文件(tiny210_buttons.c)编译成内核模块并动态加载。之后运行buttons可执行程序观察实验现象如图20:
图20
按下按键后现象如图21:
图21
上面的测试程序每间隔5s钟读取一次按键信息,不能及时响应按键,而且按键驱动程序中不带有去抖动功能。为此可以编写更可靠的驱动程序。具体编写思路如下:在发生按键中断时启动一个定时器定时毫秒级别,定时时间到了之后读取按键对应IO口状态以实现软件延时去抖动的功能;为了实时响应按键还可以以阻塞方式读取按键键值信息,一旦发现有按键中断解除阻塞并获取按键键值,为此我们需要在读取设备数据的驱动函数中等待按键事件,在延时去抖动延时到来之后释放等待进程队列。下面将修改后的按键驱动程序(mini210_buttons.c)重新编译并动态加载后运行测试程序观察实验现象如图22:
图22
用户1602177 2013-8-27 16:53