基于嵌入式Linux的中断驱动程序设计
图像・编码与软件
电子科技2009年第22卷第10期
收稿日期:2009201215
作者简介:常赟杰(1980-),男,硕士研究生,助教。研究方向:嵌入式系统。刘连浩(1959-),男,博士,教授。研究方向:信息安全与嵌入式系统。
基于嵌入式L inux 的中断驱动程序设计
常赟杰
1,2
,刘连浩
1
(11中南大学信息科学与工程学院,湖南长沙 410083;21湖南工学院计算机科学系,湖南衡阳 421002)
摘 要 首先阐述了嵌入式L inux 操作系统下,设备驱动程序的实现原理和编写方法,然后说明了中断处理在设备驱动程序中的应用,并详细论述了中断方式下,编写设备驱动程序的具体开发流程,进一步分析了编写中断处理程序时所用到一些数据结构。应用证明,在编写L inux 设备驱动程序的时候,采用中断方式的程序效率会更高。
关键词 AR M;L inux;设备驱动;中断
中图分类号 TP316  文献标识码 A   文章编号 1007-7820(2009)10-074-03
D esi gn of I n terrupt D ev i ce D r i vers Ba sed on
E m bedded L i n ux
Chang Yunjie
1,2
,L iu L ianhao
2
十大原耽是哪十个
戚薇演的电视剧(11School of Infor mati on Science and Engineer,Central South University,Changsha 410083,China;21Depart m ent of Computer Science,Hunan I nstitute of Technol ogy,Hengyang 421002,China )Abstract  First,the p rincip le of i m p lementation and p r ogramm ing method of device drivers on embedded L inux operati on system is intr oduced .Then,the app lication of interrup t handling in device drivers is p resen 2ted,with a detailed discussi on of the devel opment p r ocesses of device drivers under interrup t .
Finally,s ome
i m portant data structures used in interrup t handling p r ogramm ing are further analyzed .Practical app lication in 2dicates that higher p r ogram efficiency is achieved with the use of interrup t in the L inux device driver p rogram 2m ing .
Keywords  ARM;L inux;devices drivers;interrup t
  随着电子技术的飞速发展,嵌入式L inux 有着广泛的适用硬件平台,高效稳定的内核代码、丰富的应用软件、良好的网络接口等特点,已经成为嵌入式系统领域中的研究热点。在嵌入式系统中,对硬件的管理是通过内核中的驱动程序来实现的,因此在嵌入式系统开发中,大量工作是对各种设备进行驱动程序的开发。中断管理是嵌入式操作系统的核心任务之一,设备驱动程序中使用中断可以提高应用
程序的效率。L inux 为中断处理提供了良好的接口,L inux 设备驱动程序中有很多都是通过中断方式来实现的。
1 中断方式L inux 驱动程序实现方法
111 设备驱动程序概述
设备驱动程序是为特定的硬件提供给用户程序的一组标准化接口,它隐藏了设备的工作细节。L inux 系统中,硬件设备被抽象为一个设备文件,应用程序可以像操作普通文件一样来对硬件设备进行操作。
(1)设备驱动程序的注册和注销。
L inux 系统为每个设备分配了一个主设备号(Maj or )和次设备号(M inor ),主设备号标识设备对应的驱动程序,次设备号对应具体设备的实例。通常在应用中,主设备号都是采用动态分配的方式获取,即以设备号“0”进行申请,然后由系统返回一个可用设备号作为主设备号。
(2)设备操作。
在L inux 内核中,结构struct file_op reti ons 中定
猪肉炖粉条是哪个地方的菜
僵尸片常赟杰,等:基于嵌入式L inux的中断驱动程序设计图像・编码与软件
义了对设备的各种操作,例如打开设备使用open (),关闭设备使用cl ose(),从设备读取数据用read(),将数据写入设备用write()。编写驱动程序,主要是实现struct file_op reti ons中的函数。
(3)模块化设计。
L inux内核中采用了可加载的模块化设计。驱动采用模块化编写以后,它可以在系统启动后的任何时刻把驱动程序添加到内核代码中;当不需要这个模块时,可以将模块从内核中卸载和删除。当模块被加载时,程序从int_module()函数开始执行;卸载的时候,程序从exit_module()函数开始执行,释放掉它占用的系统资源[2]。L inux提供两个宏,module_int和module_exit来显示的命名模块的注册和注销函数,即为
Moudle_int(init_module);
Moudle_exit(exit_module);
112 L inux中的中断处理
L inux在驱动程序中应用到中断的时候,必须先把中断处理程序注册到系统中。当有硬件中断请求发生后,操作系统调用中断处理程序,完成对设备的操作[4]。
注册中断处理程序采用的函数是request_iqr,其原型为
int request_irq(unsigned int irq,
裙子被踩掉
  Void(3handler()(int irq,void dev_id, struct p t_ges3ges),
   Unsigned l ong irq_flags,const char3 devna me,void3dev_id)
函数调用成功时,返回0;失败时返回负值。其中的参数irq为要申请的硬件中断号;handle为中断处理子程序,中断产生时由系统来调用,调用参数iqr为中断类型号,dev_id为申请时告诉系统的设备;标识regs为中断发生时寄存器的内容; irq_flags决定中断处理程序的特性,例如设置sa_ interrup t就是个快中断,不设置就是慢中断; devna me指向设备名称的字符指针,记录了哪个设备使用这个中断号;dev_id为申请中断时间告诉系统的设备标识,由于中断可以被共享,不同的中断处理通过dev_id来区分。
注销中断采用的函数是free_irq,其原型为
Void free_irq(unsigned int irq,void3dev_id)它的参数与request_iqr函数中参数意义完全一样。113 中断处理函数的实现
中断处理程序的功能,就是将有关中断接收的信息反馈给设备,并根据要服务中断的不同含义进行相应的读写。由于中断处理程序是在中断时间内运行的,它不能向用户空间发送或接收数据,因为它不在任何进程的上下文中执行。通常在中断处理程序中用到以下几个数据结构[3]:
(1)等待队列。
当应用程序对设备进行读的时候,如果暂时还没有数据可读,就必须让进程睡眠来等待数据。如果中断向进程发出了信号,指示它们等待的事件已经发生,那么就可以唤醒在设备上睡眠的那些进程。进程的睡眠和唤醒就是通过一个叫做等待队列的数据结构来实现的。在L inux中,等待队列由一个wait_queue_head_t类型的数据结构来管理。interrup tible_sleep_on()函数用来让进程睡眠, wake_up_interrup tible()函数用来唤醒睡眠的进程。
(2)环形缓冲区。
在驱动程序使用循环缓冲区是处理并发访问问题的一种有效方法。当设备的一些操作来不及处理的时候,就先存放到缓冲区中。缓冲区共有两个指针进行寻址:head和tail。Head指向数据的写入位置,tail指向数据的读出位置。
(3)系统时钟。
在编写中断处理程序的时候,必须要保证程序执行的时间尽可能短。系统执行时间由系统时钟来控制。系统时钟是通过ti m e_list结构可以实现的[5]。使用时钟时,首先调用init_ti m e_list进行初始化。ti m e_list结构中参数exp ires表示时钟的周期,其单位采用L inux全局变量jiffies。系统内核还提供了Hz来定义每秒种最小时间间隔的数目。系统计时到一定时间就调用functi on函数,并把此子程序从定时队列里删除,如果想要每隔一定时间都执行一次的话,就必须在functi on函数里再一次调用addt_i m er函数。
2 中断方式驱动程序设计
211 按键控制原理
小雪节气诗句硬件采用s3c2410处理器I/O口的GPF3, GPF4,GPF5,GPF6这4个端口对应4个按键。当按键按下时,分别产生eint3,eint4,eint5,eint64个外部低电平的中断请求。s3c2410根据中断来判
图像・编码与软件常赟杰,等:基于嵌入式L inux的中断驱动程序设计
断按键被按下。
212 按键驱动程序的实现
(1)首先设计一个按键的设备结构体。该结构体中包含一个缓冲区,当多次按键无法被及时处理的时候,使用该缓冲区缓存按键。此外,还包含按键状态标志和一个等待队列。为了实现软件延时,定时器也是必要的,但不包含在设备结构体中;
(2)接着定义一个按键结构体,来保存4个按键的所对应的中断号,GP I O引脚及键值;
(3)按键驱动的模块加载和卸载函数;
(4)按键设备中断处理函数。在键被按下后,将发生中断,在中断处理程序中,延时20m s,去除抖动;
(5)按键设备的打开、释放函数。按键设备驱动的打开和释放函数比较简单,主要是设置keydev1head、keydev1tail和按键事件函数指针keyEvent的值;
(6)按键设备的读取函数。按键设备驱动的读函数是驱动程序和用户的接口,在读取/dev/key2 board/ra w文件的时候被读取。当keydev1head!= keydev1tail时,表示缓冲区有数据,它从缓冲区的尾部读取一个按键事件,直接返回给用户。当缓冲区为空时,根据用户空间是阻塞读还是非阻塞读,分为如下两种情况来处理:
1)若采用非阻塞读,则因为没有按键缓存,直接返回-Eagain;
2)若采用阻塞读,则在keydev1wq等待队列上睡眠,直到有按键被记录入缓冲区后再被唤醒。
3 结束语
L inux216内核中,添加了可抢占(Pree mp tible)的处理中断方式,使中断处理的实时性更加强大。在编写L inux设备驱动程序的时候,采用中断方式的程序效率会更高。
参考文献
[1] 刘淼.嵌入式系统接口设计与L inux驱动程序设计
[M].北京:北京航空航天大学出版社,2006.
[2] 田泽.AR M9嵌入式开发与实践[M].北京:北京航
空航天大学出版社,2006.
[3] Rubini A,Corbet J.L inux设备驱动程序[M].魏永
明,骆勇,姜均,译.北京:中国电力出版
社,2002.
[4] 董志国,李式巨.嵌入式L inux设备驱动程序开发
[J].计算机工程与设计,2006,27(20):3737
-3740.
[5] 李世勇,肖竟华.基于L inux驱动的编写技术[J].
电脑与信息技术,2006,14(3):43-45.
(上接第21页)
6 结束语
文中给出了该新型智能化变换器式功率表[6]的设计,综述了该仪表系统的工作原理和设计思想,重点介绍了功率检测电路的原理和设计。本仪表经实际使用证明,具有体积小、成本低、精度高、可靠性好等优点,有较好的市场前景。此外,还可以针对不同的用户,进一步修改软硬件系统,增加功能,满足用户实际需求。
参考文献
[1] 林向淮,张文升.电工常用仪器仪表的原理与使用
[M].北京:机械工业出版社,2005.
[2] 黄继昌.电子元器件手册[M].北京:人民邮电出
版社,2004.
[3] 郭仲礼.低压电工实用技术[M].北京:机械工业
出版社,2004.
[4] 何希才.新型开关电源的设计与应用[M].北京:
科学出版社,2001.
[5] 潘永雄.新编单片机原理与应用[M].西安:西安
电子科技出版社,2002.
[6] 杨学新.电测仪表[M].北京:中国电力出版社,2004.
[7] 宋宇澄,高进.8098单片机实现功率因数的计算
[J].电子科技,1995(10):54-58.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。