微电子学与计算机 !""#年第 $期
! !"
随着网络接入方式的不断扩展和网络应用模
式的日益丰富,“无处不有的网络,无所不在的计
算”所体现的普及计算日益成为未来计算机技术和
应用发展的主要方向之一。普及计算进一步强调以
人为本的宗旨,作为普及计算发展的主要推动力,
嵌入式系统的应用将不再仅限于工业控制系统,要
真正实现计算机围着人转、计算能力无处不在、计
算工具随身携带、信息资源唾手可得的目标,嵌入
式操作系统要能够支持多种多样的设备,这给嵌入
式操作系统的设计带来了极大的挑战。
在嵌入式操作系统中,设备驱动程序占到代码
量的一半多,同时,嵌入式系统要支持的设备多种
多样,因此如何高效、快捷地构造嵌入式设备驱动
程序,对嵌入式操作系统的实际应用有重要意义。
%&’( )%*+%,,%, &’-./0123+4% ’5%236/-0 (7(6%*8,
即嵌入式可配置操作系统,是 9%,:36 公司在嵌入
式领域的关键产品。%&’( 开放源码,相对于价格昂
贵的专用嵌入式操作系统,它具有很大的优势,因
此正在吸引越来越多的嵌入式系统开发者。%&’(对
嵌入式应用具有良好的支持,该操作系统层次分
明,接口合理,专门设计了便于设备驱动管理和开
发的 ; < = 包和 >?@ 包,开发人员可以方便地将其
开发的程序加入到 %&’(中,和别的系统组件一起进
行配置。
设备驱动程序的编写是操作系统开发或移植
中最困难的任务之一,本文在对 %&’(设备驱动程序
体系结构分析的基础上,着重阐述了 %&’(设备驱动
程序的编写,希望能够通过对 %&’(这种典型的开放
源码操作系统设备驱动程序构造的分析,使我们能
更好地掌握构造嵌入式操作系统设备驱动程序的
基本原理,以广泛应用在各种的嵌入式设备中。
" #$%$%&’()*+,
操作系统的设备驱动程序通常包含以下内容:
)A8 提供一些基本的 ; < =函数。它们负责完成以
下工作:初始化和配置设备、从设备收发数据、控制
设备、处理设备中断等。
)!8 向内核注册设备。
)#8 调用系统函数,进行设备管理。操作系统内
核应提供函数支持驱动程序的同步、计时、内存管
理、缓冲区管理、设备名空间及资源管理等
图 A为 %&’(的体系结构示意,作为一个嵌入式
操作系统,在为应用提供设备操作接口时,%&’( 采
用了较为灵活的方式。%&’(为应用程序提供了一组
统一的 BC; 用于进行 ; < = 操作;但是,%&’( 也允许
应用程序绕过统一的设备驱动程序接口,直接访问
硬件。
;D= &库 E36/F% & G%2-%4 BC; !;62’-
;-6%2-%4 G%2-%4 BC;
G%2-%4
多线程调试支持
H>I D61+( 9=J J’-/6’2
硬 件
嵌 入 式 应 用
设备
驱动
程序
:BK
)硬件抽象层8
图 A %&’(体系结构
使用统一的 BC; 进行 ; < = 操作,可以对应用程
序屏蔽设备的差别,使应用程序开发者忽略设备 ; <
=操作的细节,专心进行应用程序开发,这一方面有
利于开发过程中分工的细化,另一方面也有利于增
强代码的可移植性和可维护性,从而提高开发效
率,缩短开发周期。但是,通用往往以效率为代价,
统一的 BC; 增加了系统调用开销,延长了系统处理
设备 ; < = 的时间,对于一些简单的嵌入式设备,在
收稿日期L !""#M"AM"#
基金项目L 十五国防基础研究基金资助项目)NAO"""I""P8
#$%-%&.(#/01
B-347(/( ’. %&’( >%F/Q% >2/F%2 >%(/0-
西北工业大学计算机科学与工程系 234 567 89: ;<= )西安 $A""$!8
> ?@ 普及计算的发展
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
新型的嵌入式操作系统能够支持更多的设备,如何高效、快捷地构造这些网络设备的驱
动程序,对嵌入式操作系统的实际应用起着决定性的作用。%&’( 这种嵌入式可配置操作系统层次分明、接口合理,便于
设备管理和设备驱动的开发,文章在对 %&’( 设备驱动程序体系结构分析的基础上,重点讨论了 %&’( 设备驱动程序设计
编写的要点及其工作的基本原理,并给出了具体的应用实例。
ABC@ %&’(,设备驱动,内核,中断,宏
R
!""#年第 $期 微电子学与计算机
应用程序中直接读写设备端口可能会更高效;统一
的 %&’ 在处理一些特殊设备时,缺乏灵活性,例如
对显示卡的读写操作和对鼠标的读写操作完全不
一样,使用统一的 %&’ 为操作系统增加图形显示支
持就显得极为笨拙。
()*+ 设备驱动由 ’ , - 包和 ./0 包组成 1包是
()*+的模块化代码,是 ()*+进行剪裁配置的单位2,
它们与系统其余部分的相互关系如图 !所示。
图 ! ()*+设备驱动体系结构
应用程序
’ , -包
.(3包
4(5678
9%:
硬件 ,外部设备
1;2 应用程序:使用 ()*+ 设备驱动的应用程序
通过 ’ , - %&’访问外设。
1!2 ()*+ 内核:操作系统的核心,向设备驱动提
供调度、时钟、同步、中断等内核服务的支持。但是,
在某些嵌入式应用中,部分内核服务并不是必需
的。为了减少代码空间,在配置 ()*+时可以选择将
<(56(8包裁剪掉,这时,设备驱动所必需的内核服务
由 9%:1975=>75( %?+@57A@B*6 :7C(52,即硬件抽象层
提供。
1#2 9%::9%: 包含所有与平台相关的代码,如
上下文切换和 ’ , - 寄存器访问等。9%: 处于 ()*+
核心代码的最底层,它直接控制和访问硬件,并通
过宏向其它与机器无关的代码提供服务。当操作系
统配置不包含内核的时候,由 9%: 向设备驱动提
供必需的同步与中断服务。
1D2 ’ , - 包:’ , - 包提供抽象的设备 ’ , - 操作支
持。’ , -包为应用程序提供 ’ , - %&’,应用程序访问
设备时使用逻辑设备名,每个设备都对应一个唯一
的逻辑设备名。()*+ 设备驱动支持分层的结构模
型,即一个设备可以建立在另一个设备之上。这样,
一个物理设备就可能对应多个逻辑设备,如“, =(3 ,
+(5"”和“, =(3 , @@C"”分别为建立在串口 ; 上的两个
逻辑设备。
1E2 ./0 包:./0 包提供设备 ’ , - 操作的底层
实现,直接操作硬件。’ , - 包和 ./0 包之间的界限
并不是很严格,设备在 ./0 包中的代码甚至可以
完全上移到 ’ , -包中实现。但是在驱动程序设计时
合理地划分 ’ , - 包代码和 ./0 包代码,可以增强
代码的可重用性。例如,如果要在多个体系平台上
为同一种设备1如串口2开发设备驱动程序,那么,将
所有对逻辑设备的操作放在 ’ , - 包中,而只在 ./0
包中编写具体平台的 ’ , - 操作实现代码,就可以大
大减少开发工作量。
! "#$%!"#$%&’()
()*+的设备可基本分为字符设备、块设备和网
络设备三种。目前 ()*+的字符设备主要包括鼠标、
键盘、串口等;块设备包括硬盘、闪存等。网络设备
在 ()*+ 里做专门的处理,()*+ 支持的网络
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
和
驱动程序之间有专门定义的数据结构传递数据。下
面以字符设备驱动实现的一般过程为例,对编写
()*+设备驱动程序的几个关键问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
进行阐述。
!&’ ( ) *+(
为了统一访问界面,设备的 ’ , - 操作在各种操
作系统中均
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
现为一组特殊的预定义文件,以便提
供统一的 ’ , - %&’,设备驱动程序的编写实际上就
是这些预定义的文件在具体设备上的实现。’ , - 包
提供的设备 ’ , - %&’,主要对设备进行读、写、设置
操作,表 ; 是 E 个基本的设备 ’ , - %&’,除了
ACFGB*G8**
5B@(12
向设备发送数据。参数 ?HL为待发送数据
的缓冲区,待发送的数据量由参数 8(6 指
定,实际发送的数据量也由 8(6返回。
ACFGB*GF(@GA*6LBF12
获得设备的运行时状态信息。检索的信
息类型由键值 1<(C2参数指定,检索信息
由 ?HL参数指定的缓冲区返回。
ACFGB*G+(@GA*6LBF12
改变设备的运行时状态。修改的信息类
型由键值参数指定,数据通过 ?HL 参数指
定的缓冲区传送。
!&, *+,-
()*+ 设备驱动程序通过内核 %&’ 获取内核服
务,当操作系统配置不包含内核的时候,由 9%: 提
M
微电子学与计算机 !""#年第 $期
供类似的 %&’。这些 %&’主要提供必需的中断与同
步服务。
()*+为设备驱动程序提供一种三层中断模型,
该模型包括 ’,-.中断服务例程/、0,-.延迟服务例
程/和线程。’,- 响应硬件中断,0,- 响应 ’,- 的请
求,而线程是驱动程序的客户程序。硬件中断以几
乎不受任何打断的速度传递给 ’,-,’,- 可以操作
硬件,但只允许调用有限的内核 %&’。当 ’,- 返回
时,它可以要求它的 0,-被调度执行。在绝大多数
时候,0,- 总在 ’,- 之后立即执行。但如果当前线
程正在调度程序中执行,0,- 将被推迟到线程结
束。0,-允许调用比 ’,-更多的内核 %&’,尤其是
0,-能够调用内核 %&’唤醒正在等待的线程。线程
能够调用所有的内核 %&’,特别地,线程允许等待互
斥信号和条件变量。
与三层中断模型对应,()*+ 支持三种不同级别
的同步机制:
.1/ ’,- 的同步机制:该机制在临界区禁止中断
以阻止 ’,- 运行,在多处理机系统中,还要求旋转
锁 .+2345*67/。 ’,- 的 同 步 机 制 通 过 内 核 %&’
689:;<=:3+<:5*67./和 689:;<=:3+<:>45*67./实现,这种
机制应该尽量少用且每次只持续很短的时间。
.!/ 0,- 的同步机制:该机制在内核中实现,通
过在临界区锁调度来禁止 0,- 的执行。0,- 的同
步机制通过 %&’ 689:;<=:;+<:5*67./和 689:;<=:;+<:
>45*67./实现。和 ’,- 的同步机制一样,这种机制也
应该尽量少用。
.#/ 线程的同步机制:该机制用互斥信号和条件
变量实现。0,- 可以给条件变量发信号,但只有线
程可以给互斥信号上锁和允许等待条件变量。
大多数的设备都提供中断方式的 ’ ? @ 操作,为
设备编写中断处理程序时,首先要在驱动程序中定
义 ’,- 和 0,-,然后再调用相关的中断内核 %&’ 将
中断对象绑定到相应的中断向量上。根据 ()*+的中
断与同步机制,使用中断的 ()*+设备驱动程序可以
选择以下三种中断处理模型的一种构造。
第一种模型将所有的设备处理放在 ’,- 中完
成。当 ’,- 被执行时,’,- 直接操作设备硬件、访问
内存中待传送的数据。’,- 结束时也可以调用它的
0,-,但 0,- 除了调用内核 %&’ 唤醒线程之外不做
任何事情。
第二种模型将对设备的处理推迟到 0,-。’,-
仅仅屏蔽该中断的进一步传递,然后就调用内核
%&’ 使能其它中断,
通知
关于发布提成方案的通知关于xx通知关于成立公司筹建组的通知关于红头文件的使用公开通知关于计发全勤奖的通知
操作系统调度它的 0,- 运
行。其余的大多数设备处理在 0,-中完成。
第三种模型将设备处理进一步推迟到线程。
’,- 的行为和第二种模型完全一样,而 0,- 仅调用
内核 %&’唤醒线程,由线程执行所有的设备处理。
中断处理模型的选择应根据设备的特点和嵌
入式应用的需要而定,不同的设备可以选择不同的
处理模型。第一种模型适用于中断处理操作较简单
而系统又需要及时处理的设备;第二种模型少量增
加了中断处理迟延,但获得了更灵活的同步机制,
适用于多数的设备;如果要在设备中断处理中进行
复杂操作,例如,要在鼠标中断到来时分辨不同的
事件.移动、单击、双击等/,第三种模型就比较合适。
!"! !"#$%&
我们知道,A34>B 使用文件操作表来支持对设
备的 ’ ? @ 操作,文件操作表的每一个域都对应着一
个 %&’,编写 A34>B 设备驱动程序就是用实际的操
作函数填充文件操作表的各个域。()*+ 用设备表
.0(=CDE5(/和设备 ’ ? @ 表 .0(=’@CDE5(/管理设备,每
个设备的设备表和设备 ’ ? @ 表分别由 0FGC%H:
FIC-J 和 0FG’@:C%HAF 两个宏生成,和 A34>B 类
似,()*+设备驱动的实现就是用实际的 ’ ? @ 操作函
数填充这两个宏。
#K#K1 0FGC%H:FIC-J宏
设备表项由宏 0FGC%H:FIC-J创建,每次使
用 0FGC%H:FIC-J 宏 添 加 一 个 设 备 表 项 。
0FGC%H:FIC-J宏的定义为:
0FGC%H:FIC-J.5L 4DM(L ;(2:4DM(L ND4;5(<+L
343OL 5**7>2L 2<3=/
5 为设备表项的“标签”,用于在符号表中标识
该设备表项。4DM(为设备的逻辑设备名,可以是任
何有意义的字符串,一般以设备名前加一个 ;(= 前
缀命名,例如 ? ;(= ? 6*M1。;(2:4DM( 用于分层设备,
为该设备所依赖设备的逻辑设备名,如果该设备不
依赖任何设备,该域为 IPAA。
ND4;5(<+ 为指向设备 ’ ? @ 表的指针,它连接了
设备表项和设备 ’ ? @表。设备 ’ ? @表中包含了设备
’ ? @操作函数的入口地址,这些函数直接操作物理
设备,通过 ND4;5(<+ 域,’ ? @ 包的各个 ’ ? @ %&’ 可以
调用这些函数完成具体的 ’ ? @ 操作。因此 ND4;5(<+
也是连接逻辑设备和物理设备的桥梁。
343O 是设备的初始化函数,它负责初始化硬件
和绑定中断。如果使用 #K! 节中的第三种中断模型
构造设备驱动,可以在 343O中创建线程。5**7>2为应
用程序调用 689:3*:5**7>2./时设备的处理函数,它
1"
!""#年第 $期 微电子学与计算机
实际上提供了设备“打开”的操作,在应用程序使用
设备前,确保设备为可用状态,并执行进行设备复
位,清理缓冲区的操作。
%&’(为私有数据。%&’(是 )*+,设备驱动程序中
一个很有用的域。设备表项中的其它域都有确定的
类型,只有 %&’( 为 (+’- 类型的指针。不同的设备具
有不同的特性,管理设备需要的信息也因而不尽相
同,由于 %&’( 为 (+’- 类型的指针,因此它可以携带
任何类型的指针,这使得设备表项具有了灵活的可
扩展性,可以保存更丰富的设备相关信息。例如,鼠
标驱动程序需要保存鼠标的当前坐标值和鼠标允
许移动的范围,除此之外,还要保存鼠标的中断向
量、中断处理句柄等必要的信息。这时,可以考虑为
鼠标驱动程序定义一个数据结构,专门保存上述信
息,在使用 ./01234/5167 宏时,将这个数据结
构作为一个指针传递给 %&’(,这就扩展了鼠标的设
备表项,方便了设备管理。
#8#8! ./09:4123;/宏
设备表项由 ./09:4123;/ 宏创建,每次使用
./09:4123;/ 宏添加一个设备 9 < : 表。./09:4
123;/宏的定义为:
./09:4123;/=>? @&’A)? &)B-? C)A4D+EF’C? ,)A4D+EF’CG
>为设备 9 < :表的“标签”。@&’A)、&)B-、C)A4D+EF’C
和 ,)A4D+EF’C 分别为 H 个读、写、设置 9 < : 2I9 的回
调函数入口地址。对于设备不提供的操作,相应的
域为 5J;;。
综上所述,)*+,设备驱动程序的编写步骤可以
总结为以下步骤:
=KG 在深入了解设备硬件特性基础上,选择适当
的中断模型,定义保存设备专门信息的数据结构。
=!G 调用 ./01234/5167宏和 ./09:4123;/
宏向系统注册设备。
=#G 为 ’E’A、>++LM%、@&’A)、&)B-、C)A4D+EF’C 和 ,)A4
D+EF’C 分别编写设备相关的代码;如果设备使用了
中断,根据所选择的中断处理模型,为设备编写中
断处理函数。
=HG 调试。
!"# !"#$%&’()
在操作系统配置时,如果设备被选择包含到目
标操作系统中,其对应的设备表项在操作系统编译
时就会作为内核符号表的一部分被编译到目标代
码中去。因此 )*+,不支持设备的动态安装,应用程
序可以操作的设备在操作系统配置时就已确定了。
图 # 为 )*+, 设备驱动程序各个组成部分的相互调
用关系,下面结合图 #对 )*+,设备驱动的工作原理
作简要分析。
=KG 初始化
)*+,在系统初始化时初始化所有的设备。所有
设备的设备表项从内核符号表 4./01234N"O开始,
到 4./01234/5.结束。)*+,初始化时,遍历所有
设备的设备表,调用设备的 ’E’A 函数,初始化设备。
设备的 ’E’A函数允许返回错误,这时设备被设置为
“离线”状态且所有对该设备的 9 < : 请求都被认为
是错误的。将来应用程序操作设备时,将再次尝试
初始化设备,但此工作由设备的 >++LM%函数完成。
=!G 打开设备
应用程序操作任何设备之前都要先打开设备,
打开设备的操作由 2I9 DPC4’+4>++LM%=G完成。当应用
程序以某设备的逻辑名调用 DPC4’+4>++LM%=G时,操
作系统在内核符号表中查找设备的设备表项 =图 #
!G,如果查找到该设备,则调用设备的 >++LM% 函
数,让设备变为“在线”状态,允许 9 < :操作进行。对
于分层设备,系统还会依次用底层设备的逻辑设备
名调用 DPC4’+4>++LM%=G。应用程序通过调用 DPC4’+4
>++LM%=G获得一个设备句柄,设备句柄其实就是指向
设备表项的指针。
=#G 操作设备
应用程序以设备句柄为参数调用 9 < : 2I9 操作
设备=图 #"G。9 < : 2I9将设备句柄作强制类型转换
展开为设备表项,通过设备表项的 QBE->)&, 域=图 #
#G,9 < : 2I9 再调用设备相关的 9 < : 操作函数完成
具体的 9 < :操作=图 #$G。
=HG 中断处理
对于使用中断的设备驱动,根据所选择的中断
处理模型不同,当中断产生时,设备驱动分别在 9R6
KK
微电子学与计算机 !""#年第 $期
级%图 #!&、’() 级%图 #"&和线程级%图 ##&处理中
断请求,线程级的中断处理可以进行根据需要和用
户线程同步%图 #$&。
!"# !"
结合项目的具体要求,我们先后为 *+,-编写了
.( / !鼠标、串口鼠标、图像采集卡、专用图像处理加
速卡等设备的驱动程序,并成功为 *+,-移植了 0123
库,为 *+,- 增加了图形显示支持,图 4 为部分设备
配置到 *+,- 中的一个截图。
驱动程序的设计开发是嵌入式应用开发中比
较复杂的一个环节,对开发者有较高的要求,开发
者需要同时掌握软硬件方面的相关知识,才能设计
出高质量的驱动程序。驱动程序的设计不应拘泥于
特定的模式,而应根据应用需要和设备的特性灵活
选择适当的模式。
$ #$%
嵌入式计算将是计算机技术发展最重要的领
域,也将是最广阔的领域。目前,专用的实时嵌入式
系统价格昂贵,开放源码的 *+,-对发展自主的嵌入
式操作系统很有借鉴意义,希望本文对 *+,-设备驱
动程序设计的介绍,能有助于嵌入式系统开发者更
好地掌握构造嵌入式操作系统设备驱动程序的基
本原理,以推动相关领域研究的发展。
&’()
567 89*--3:;<, )=>?:? 著 @ A?-,9*2 译 B A?:=C 设备驱动程序B
中国电力出版社@ !"""@ D"ED!B
5!7 )?FG H<*I3:@ ),>*<0 J,,0*@ K:2, +L9?3C 著@ 许汝峰译B #!
位嵌入式系统编程B 中国电力出版社@ !""6@ 6DME6N4B
5#7 J?F>3*9 O3<<著B 于志宏译B + / +PP嵌入式系统编程B 中国
电力出版社@ !""6@ Q$E6""B
547 *+,- )*R*<*:F* J3:=39B )*; S30 K:F@ !"""B
5D7 O3<0 T**<@ U,I: ’3993V3LB WI* *+,- +,XY,:*:0 Z0*<’-
H=?;*B )*; S30 K:F@ !""6B
5N7 8:0I,:L U J3--3B *+,- .,<0?:2 H=?;*B [X>*;;*;(L-0*X@
!""6B
5$7 H3*;;*;
(L-0*X-B ’>^- U,=<:39@ !"""B
_K‘ S=3?aR*:2@ (SK b?3,a3:@ cS]d b?:2a-I*@ Hd U?3:aI=3
%+,XY=0*< (F?*:F* ’*Y3<0X*:0@ ‘,<0IV*-0 .,9L0*FI:?F39
d:?1*<-?0L@ b?’3: $6""$!&
%&’()*+(* WI* ;*1*9,YX*:0 ,R .*<13-?1* +,XY=0?:2 ;*X3:;
X,<* ;*1?F*- >* -=YY,<0*; >L 0I* *X>*;;*; ,Y*<30?:2 -L-0*XB
WI*<*R,<*@ I,V 0, Y<,2<3X 0I* ;*1?F* ;1*< <3Y?;9L 3:;
*RR?F?*:09L ?- >*F,X?:2 3: F0?F39 Y<,>9*X 0, 0I* -=FF*-- ,R
*X>*;;*; ,Y*<30?:2 -L-0*XB 8- 3 F,:R?2=<3>9* *X>*;;*;
,Y*<30?:2 -L-0*X@ *+,- I3- V*99 ;*-?2:*; 39*X- ,R ;*1?F*
;1*< ;*-?2: 3:; ?99=-0<30* 0I* V,
本文档为【eCos设备驱动程序设计分析】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。