嵌入式系统第10讲.ppt

上传人:asd****56 文档编号:87669178 上传时间:2023-04-16 格式:PPT 页数:88 大小:750KB
返回 下载 相关 举报
嵌入式系统第10讲.ppt_第1页
第1页 / 共88页
嵌入式系统第10讲.ppt_第2页
第2页 / 共88页
点击查看更多>>
资源描述

《嵌入式系统第10讲.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统第10讲.ppt(88页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、09 四月 2023生物医学工程学院电子技术系1第10讲 嵌入式系统内核的相关技术09 四月 2023生物医学工程学院电子技术系2第10章 嵌入式系统内核的相关技术n本章主要内容n进程的基本概念、Linux下的进程间通信机制。n信号机制、管道和有名管道机制、SystemV通信机制及其消息队列和共享存储段机制。nS3C44B0X微处理器的中断系统。nLinux设备驱动开发。09 四月 2023生物医学工程学院电子技术系3第1节 嵌入式系统进程间通信的原理10.1 嵌入式系统进程间通信10.1.1 嵌入式系统进程间通信的基本原理 1.Linux系统中的进程n进程是运行于自已的虚拟地址空间的一个程序

2、。nLinux系统的3类进程:n交互进程:由shell控制和运行,既可以在前台运行,也可以在后台运行。n批处理进程:不属于某个终端,它被提交到一个队列中,以便顺序执行。n守护进程:只有在需要时才被唤起在后台运行,一般在Linux启动时开始执行。nLinux是一个多进程的操作系统,每个进程都有自己的权限和任务,某一个进程的失败一般不会导致其他进程的失败;进程之间可以通过由内核控制的机制相互通信。09 四月 2023生物医学工程学院电子技术系410.1 嵌入式系统进程间通信的原理 2.Linux系统中的进程间通信nLinux下进程通信的6种主要手段:信号(signal):用于通知接收进程有某种事件

3、发生。除支持signal()外,还支持符合POSIX.1标准的信号函数sigaction()。管道(pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信;有名管道克服管道没有名字的限制,可用于亲缘和和非亲缘进程间的通信。报文(或消息)队列(mesage):是消息的链接表,包括POSIX消息队列、SystemV消息队列。消息队列克服了信号承载信息量少,管道只能承载无格式字节流,以及缓冲区大小受限等缺点。09 四月 2023生物医学工程学院电子技术系510.1 嵌入式系统进程间通信的原理共享存储段:多个进程可以访问同一块内存空间。与其他通信机制结合使用。信号量(sema

4、phore):主要作为进程之间及同一进程不同线程之间的同步手段。套接字:更为一般的进程间通信机制,可用于不同机器之间的进程间通信。Linux和SystemV的变种都支持套接字。n应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCPIP协议交互提供了称为套接字(Socket)的接口。区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。Soc

5、ket原意是“插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。09 四月 2023生物医学工程学院电子技术系610.1 嵌入式系统进程间通信的原理 3.信号机制n信号是在软件层次上对中断机制的一种模拟。进程收到信号与处理器收到一个中断申请是一样的。n信号是进程间通信机制中惟一的异步通信机制,进程不必通过任何操作来等待信号的到达。nLinux信号机制基本继承了UNIX系统。n信号之间不存在内在的相对优先级。一个进程若同时出现两个信号时,系统会按任意顺序提交给进程。09 四月 2

6、023生物医学工程学院电子技术系710.1 嵌入式系统进程间通信的原理n信号可以由以下几种方式生成:1)由硬件异常产生:当硬件检测到无效的存储访问、除数为0等情况时将通知内核,内核会为正在运行的进程产生适当的信号。2)由软件产生:信号可以在一定的软件条件下产生。例如,当检测到非规定波特率的数据时产生SIGURG。3)由终端用户生成:用户产生的键盘序列会中断或结束当前正在执行的进程。4)由系统调用生成:系统调用能产生信号的函数,kill()、sigqueue()、signal、sigaction()。09 四月 2023生物医学工程学院电子技术系810.1 嵌入式系统进程间通信的原理 4.管道及

7、有名管道n管道就是一种把一个进程的标准输出与另一个进程的标准输入相连接的方法。n管道的特点:管道是半工的管道只能用于具有亲缘关系的进程之间。管道单独构成一种独立的文件系统。一个进程向管道中写的内容被管道另一端的进程读出。09 四月 2023生物医学工程学院电子技术系910.1 嵌入式系统进程间通信的原理n在Linux系统中,管道用两个指向同一个临时性虚拟文件系统(VFS,Virtual File System)索引节点的文件数据结构来实现。这个临时性的VFS索引节点指向内存中的一个物理页面。图10.2是管道的一个实例。09 四月 2023生物医学工程学院电子技术系1010.1 嵌入式系统进程间

8、通信的原理 5.消息队列n消息队列允许一个或多个进程向队列中写入消息,然后由一个或多个读进程读出。图10.3是消息队列工作机制的示意图。09 四月 2023生物医学工程学院电子技术系1110.1 嵌入式系统进程间通信的原理nLinux系统维护一个消息队列的表。该表是msgque结构的数组,数组中每个元素指向一个完全描述消息队列的msgqid_ds数据结构。一旦一个新的消息队列被创建,则在系统内存中会为一个新的msgqid_ds数据结构分配空间,并把它插入到数组中。n每个msgqid_ds结构都包含ipc_perm数据结构及指向进入该队列的消息的指针。n写入消息:有效用户标识和访问模式验证。n读

9、取消息:09 四月 2023生物医学工程学院电子技术系1210.1 嵌入式系统进程间通信的原理 6.共享存储段n共享存储段允许一个或多个进程通过在它们的虚拟地址空间中同时出现的存储区进行通信。n虚地址空间的页是通过共享进程的页表来访问的,共享存储段的访问控制是通过密钥和访问权限检查来实现的。n一旦某一内存区域被共享了,系统就无法检查进程如何使用这部分内存区域,系统必须使用SystemV信号量等机制来同步对存储器的访问。n图10.4是共享存储段工作机制示意图。每个新建的共享存储段由shmid_ds数据结构来表示,并记录在shmid_segs向量中。09 四月 2023生物医学工程学院电子技术系1

10、310.1 嵌入式系统进程间通信的原理nShmid_ds数据结构中包含共享存储段的大小,当前使用该共享存储段的进程数目及共享存储段如何映射到进程地址空间的等信息。09 四月 2023生物医学工程学院电子技术系1410.1 嵌入式系统进程间通信的原理n当某一进程第一次访问共享存储段的某一页时,系统会产生一个页失效。Linux在处理页失效时,它会找到描述该页的vm_area_struct数据结构。Vm_area_struct结构包含处理这种共享存储段页失效的函数的句柄。n当进程不再使用共享存储段时,进程会执行分离操作。若有其他进程还在使用该段,分离只影响当前进程。进程的vm_area_struct

11、结构会被从shmid_ds结构中删除、释放掉,系统更新页表使虚地址区域无效,当最后使用共享存储段的进程执行分离操作时,物理存储器中的共享页被释放掉,同时对应的shmid_ds数据结构也会被释放。09 四月 2023生物医学工程学院电子技术系1510.1 嵌入式系统进程间通信的原理 7.SystemV的进程间通信机制nLinux支持消息队列、信号和共享存储段3种进程通信机制。这些System V的进程通信机制使用相同的认证方法,即通过系统调用向内核传递这些资源的全局惟一标识来访问它们,Linux使用访问许可的方式检查对System V IPC对象的访问。nLinux把IPC对象的访问标识作为对系

12、统资源表的索引,但访问标识不是一种直接的索引,而是由索引标识通过某些运算产生的对象索引。nLinux系统中所有代表System V IPC对象的数据结构都包括ipc_perm数据结构,ipc_perm结构中含有拥有者和创建者进程的用户标识和组标识。09 四月 2023生物医学工程学院电子技术系1610.1 嵌入式系统进程间通信的原理n每一个IPC对象都有一个独一无二的IPC标识符与之相联系。n标识符的惟一性与对象的类型相关的。为了获得一个惟一的标识符,必须使用关键字,不管是客户端还是服务端都认可相应的关键字。09 四月 2023生物医学工程学院电子技术系17第2节 嵌入式系统中断原理10.2嵌

13、入式系统中断原理n本节主要介绍S3C2410处理器的中断系统。10.2.1嵌入式系统中断的工作原理 1、S3C2410的中断类型nS3C2410拥有7种不同的异常中断类型,根据ARM系列中断处理的特点,各种异常中断对应于ARM系列的不同工作模式 。09 四月 2023生物医学工程学院电子技术系1810.2 嵌入式系统中断原理09 四月 2023生物医学工程学院电子技术系1910.2 嵌入式系统中断原理 2、异常中断的响应过程和返回过程 (1)异常中断响应过程保存CPSR到将要执行的异常中断的SPSR;设置CPSR的值:设置CPSR相应位的值使处理器进入特定的处理器模式,按要求屏蔽中断;设置LR

14、寄存器:将中断相应模式的LR寄存器的值设置为异常中断的返回地址;处理程序计数器PC:将PC值设为相应的中断向量的地址。(2)异常中断返回过程恢复CPSR:将保存在中断模式中的SPSR值赋给当前的CPSR;将返回地址复制到PC:这样程序将返回到异常中断产生的下一条指令或出现问题的指令处执行。09 四月 2023生物医学工程学院电子技术系2010.2 嵌入式系统中断原理 异常中断的响应-返回流程图09 四月 2023生物医学工程学院电子技术系2110.2 嵌入式系统中断原理 3、异常中断处理程序的安装n异常中断向量的入口地址是固定的(0 x000 x1c),系统运行到满足异常中断条件而产生异常中断

15、时,系统将自动跳入相应的异常中断向量表中。n 在异常向量表中保存的,正是利用跳转指令或ldr指令指向该中断的异常中断处理程序的指令程序,这样就实现了异常中断处理程序的安装。09 四月 2023生物医学工程学院电子技术系2210.2 嵌入式系统中断原理 (1)利用跳转指令特点 将BL指令放置到中断向量表的特定位置,跳转目标地址为中断处理程序的首地址,便可直接实现异常中断的安装。优点 BL指令可以直接保存地址缺点 是BL的跳转范围只有32MB的地址空间实例 bl SWI_Handle 09 四月 2023生物医学工程学院电子技术系2310.2 嵌入式系统中断原理 (2)利用ldr指令特点 先要将异

16、常中断处理程序首地址的绝对地址放在邻近的一个存储单元中,然后用ldr命令将该内存单元中的地址读取到PC中。优点 可调用程序的范围不受限制 实例 ldrpc,SWI_ADDRSWI_ADDRdcdSWI_Handle09 四月 2023生物医学工程学院电子技术系2410.2 嵌入式系统中断原理 4、中断控制寄存器09 四月 2023生物医学工程学院电子技术系2510.2 嵌入式系统中断原理 5、S3C2410的中断控制寄存器#definerSRCPND(*(volatileunsigned*)0 x4a000000)#definerINTMOD(*(volatileunsigned*)0 x4a

17、000004)#definerINTMSK(*(volatileunsigned*)0 x4a000008)#definerPRIORITY(*(volatileunsigned*)0 x4a00000a)#definerINTPND(*(volatileunsigned*)0 x4a000010)#definerINTOFFSET(*(volatileunsigned*)0 x4a000014)09 四月 2023生物医学工程学院电子技术系2610.2 嵌入式系统中断原理 (1)源中断申请寄存器(SRCPND)nSRCPND寄存器32位中的每一位对应着一个中断源。某一位被设置为1,则相应的中

18、断源产生中断请求并且等待中断被服务。n能够通过向这个寄存器写一个数据来清除SRCPND寄存器的相应位 。09 四月 2023生物医学工程学院电子技术系2710.2 嵌入式系统中断原理 (1)源中断申请寄存器(SRCPND)09 四月 2023生物医学工程学院电子技术系2810.2 嵌入式系统中断原理09 四月 2023生物医学工程学院电子技术系2910.2 嵌入式系统中断原理 (2)中断模式寄存器(INTMOD)n中断模式寄存器(INTMOD)的32位中的每一位对应一个中断源,当INTMOD中的每一位都设置为1,则ARM920T内核将以FIQ(快速中断)模式操作那个中断。否则,将以IRQ(普通

19、中断)模式操作。09 四月 2023生物医学工程学院电子技术系3010.2 嵌入式系统中断原理09 四月 2023生物医学工程学院电子技术系3110.2 嵌入式系统中断原理09 四月 2023生物医学工程学院电子技术系3210.2 嵌入式系统中断原理 (3)中断请求寄存器(INTPND)n中断请求寄存器32位中的每一位对应着相应的中断请求。经过优先级逻辑后,INTPND寄存器只能有一位被设为1,并且向CPU产生中断请求。n能够通过向这个寄存器写一个数据来清除INTPND寄存器的相应位 。09 四月 2023生物医学工程学院电子技术系3310.2 嵌入式系统中断原理09 四月 2023生物医学工

20、程学院电子技术系3410.2 嵌入式系统中断原理09 四月 2023生物医学工程学院电子技术系3510.2 嵌入式系统中断原理/*Functionname:ClearPendingParameter:bit:相应的中断位Description:清除相应的中断请求*/voidClearPending(intbit)rSRCPND=bit;rINTPND=bit;09 四月 2023生物医学工程学院电子技术系3610.2 嵌入式系统中断原理 (4)中断屏蔽寄存器(INTMSK)n在INTMSK寄存器中,32位依次对应着每个中断源。如果指定位被设为1,CPU将不响应相应中断源的中断请求。如果屏蔽位为

21、0,则中断请求能被响应。09 四月 2023生物医学工程学院电子技术系3710.2 嵌入式系统中断原理09 四月 2023生物医学工程学院电子技术系3810.2 嵌入式系统中断原理09 四月 2023生物医学工程学院电子技术系3910.2 嵌入式系统中断原理/*Functionname:EnableIrqParameter:bit:相应的中断位Description:使能相应的中断*/voidEnableIrq(intbit)rINTMSK&=(bit);09 四月 2023生物医学工程学院电子技术系4010.2 嵌入式系统中断原理/*Functionname:DisableIrqParame

22、ter:bit:相应的中断位Description:禁止相应的中断*/voidEnableIrq(intbit)rINTMSK|=(bit);09 四月 2023生物医学工程学院电子技术系4110.2 嵌入式系统中断原理 (5)中断偏移寄存器(INTOFFSET)n中断偏移寄存器中的值显示了INTPND寄存器中哪个IRQ模式的中断请求。这个位在清除SRCPND和INTPND后被自动清除。09 四月 2023生物医学工程学院电子技术系4210.2 嵌入式系统中断原理09 四月 2023生物医学工程学院电子技术系4310.2 嵌入式系统中断原理 (6)中断优先寄存器(PRIORITY)nThe p

23、riority logic for 32 interrupt requests is composed of seven rotation based arbiters:six first-level arbiters and onensecond-level arbiter.09 四月 2023生物医学工程学院电子技术系4410.2 嵌入式系统中断原理优先级产生框图09 四月 2023生物医学工程学院电子技术系4510.2 嵌入式系统中断原理09 四月 2023生物医学工程学院电子技术系4610.2 嵌入式系统中断原理09 四月 2023生物医学工程学院电子技术系4710.3 嵌入式Linu

24、x驱动程序开发10.3 嵌入式Linux驱动程序开发10.3.1嵌入式Linux的设备管理nLinux将设备分成两大类:一类是块设备,类似磁盘以记录块或扇区为单位,成块进行输入/输出的设备;另一类是字符设备,类似键盘以字符为单位,逐个进行输入/输出的设备。网路设备是介于块设备和字符设备之间的一种特殊设备。n块设备接口仅支持面向块的I/O操作,所有I/O操作都通过在内核地址空间中的I/O缓冲区进行,它可以支持随机存取的功能。文件系统通常都建立在块设备上。n字符设备接口支持面向字符的I/O操作,由于它们不经过系统的快速缓存,所以它们负责管理自己的缓冲区结构。字符设备接口只支持顺序存取的功能,一般不

25、能进行任意长度的I/O请求,而是限制I/O请求的长度必须是设备要求的基本块长的倍数。09 四月 2023生物医学工程学院电子技术系4810.3 嵌入式Linux驱动程序开发n处理器与设备间数据交换方式n处理器与外设之间传输数据的控制方式通常有3种:查询方式、中断方式和直接内存存取(DMA)方式。1查询方式n设备驱动程序通过设备的I/O端口空间,以及存储器空间完成数据的交换。例如,网卡一般将自己的内部寄存器映射为设备的I/O端口,而显示卡则利用大量的存储器空间作为视频信息的存储空间。利用这些地址空间,驱动程序可以向外设发送指定的操作指令。通常来讲,由于外设的操作耗时较长,因此,当处理器实际执行了

26、操作指令之后,驱动程序可采用查询方式等待外设完成操作。09 四月 2023生物医学工程学院电子技术系4910.3 嵌入式Linux驱动程序开发n驱动程序在提交命令之后,开始查询设备的状态寄存器,当状态寄存器表明操作完成时,驱动程序可继续后续处理。查询方式的优点是硬件开销小,使用起来比较简单。但在此方式下,CPU要不断地查询外设的状态,当外设未准备好时,就只能循环等待,不能执行其他程序,这样就浪费了CPU的大量时间,降低了处理器的利用率。2中断方式n中断方式才是多任务操作系统中最有效利用处理器的方式。当CPU进行主程序操作时,外设的数据已存入端口的数据输入寄存器,或端口的数据输出寄存器已空,此时

27、由外设通过接口电路向CPU发出中断请求信号。CPU在满足一定条件下,暂停执行当前正在执行的主程序,转入执行相应能够进行输入/输出操作的子程序,待输入/输出操作执行完毕之后,CPU再返回并继续执行原来被中断的主程序。这样,CPU就避免了把大量时间耗费在等待、查询外设状态的操作上,使其工作效率得以大大提高。09 四月 2023生物医学工程学院电子技术系5010.3 嵌入式Linux驱动程序开发 3直接访问内存(DMA)方式n利用中断,系统和设备之间可以通过设备驱动程序传送数据,但是,当传送的数据量很大时,因为中断处理上的延迟,利用中断方式的效率会大大降低。而直接内存访问(DMA)可以解决这一问题。

28、DMA可允许设备和系统内存间在没有处理器参与的情况下传输大量数据。设备驱动程序在利用DMA之前,需要选择DMA通道并定义相关寄存器,以及数据的传输方向,即读取或写入,然后将设备设定为利用该DMA通道传输数据。设备完成设置之后,可以立即利用该DMA通道在设备和系统的内存之间传输数据,传输完毕后产生中断以便通知驱动程序进行后续处理。在利用DMA进行数据传输的同时,处理器仍然可以继续执行指令。09 四月 2023生物医学工程学院电子技术系5110.3 嵌入式Linux驱动程序开发 设备驱动程序的概念n设备驱动程序实际是处理和操作硬件控制器的软件,从本质上讲,是内核中具有最高特权级的、驻留内存的、可共

29、享的底层硬件处理例程。驱动程序是内核的一部分,是操作系统内核与硬件设备的直接接口,驱动程序屏蔽了硬件的细节,完成以下功能:对设备初始化和释放;对设备进行管理,包括实时参数设置,以及提供对设备的操作接口;读取应用程序传送给设备文件的数据或者回送应用程序请求的数据;检测和处理设备出现的错误。09 四月 2023生物医学工程学院电子技术系5210.3 嵌入式Linux驱动程序开发nLinux操作系统将所有的设备全部看成文件,并通过文件的操作界面进行操作。对用户程序而言,设备驱动程序隐藏了设备的具体细节,对各种不同设备提供了一致的接口,一般来说,是把设备映射为一个特殊的设备文件,用户程序可以像对其他文

30、件一样对此设备文件进行操作。这意味着:由于每一个设备至少由文件系统的一个文件代表,因而都有一个“文件名”。应用程序通常可以通过系统调用open()打开设备文件,建立起与目标设备的连接。打开了代表着目标设备的文件,即建立起与设备的连接后,可以通过read()、write()、ioctl()等常规的文件操作对目标设备进行操作。09 四月 2023生物医学工程学院电子技术系5310.3 嵌入式Linux驱动程序开发n设备文件的属性由三部分信息组成:第一部分是文件的类型,第二部分是一个主设备号,第三部分是一个次设备号。其中类型和主设备号结合在一起惟一地确定了设备文件驱动程序及其界面,而次设备号则说明目

31、标设备是同类设备中的第几个。n由于Linux 中将设备当做文件处理,所以对设备进行操作的调用格式与对文件的操作类似,主要包括open()、read()、write()、ioctl()、close()等。应用程序发出系统调用命令后,会从用户态转到核心态,通过内核将open()这样的系统调用转换成对物理设备的操作。09 四月 2023生物医学工程学院电子技术系5410.3 嵌入式Linux驱动程序开发 驱动程序结构1自动配置和初始化子程序,用来检测所需驱动的硬件设备是否工作正常、对正常工作的设备及其相关驱动程序所需要的软件状态进行初始化。2服务于I/O请求的子程序,该子程序称为驱动程序的上半部。这

32、部分程序在执行时,系统仍认为与进行调用的进程属于同一个进程,只是由用户态变成了核心态,可以在其中调用sleep()等与进程运行环境有关的函数。3中断服务程序,又称为驱动程序的下半部,由Linux系统来接收硬件中断,再由系统调用中断服务子程序。09 四月 2023生物医学工程学院电子技术系5510.3 嵌入式Linux驱动程序开发n在系统内部,I/O设备的存取通过一组固定的入口点来进行,入口点也可以理解为设备的句柄,就是对设备进行操作的基本函数。字符型设备驱动程序提供如下几个入口点:open入口点:打开设备准备I/O操作。对字符设备文件进行打开操作,都会调用设备的open入口点。open子程序必

33、须对将要进行的I/O操作做好必要的准备工作,如清除缓冲区等。如果设备是独占的,即同一时刻只能有一个程序访问此设备,则open子程序必须设置一些标志以表示设备处于忙状态。close入口点:关闭一个设备。当最后一次使用设备完成后,调用close子程序。独占设备必须标记设备方可再次使用。09 四月 2023生物医学工程学院电子技术系5610.3 嵌入式Linux驱动程序开发 read入口点:从设备上读数据。对于有缓冲区的I/O操作,一般是从缓冲区里读数据。对字符设备文件进行读操作将调用read子程序。write入口点:往设备上写数据。对于有缓冲区的I/O操作,一般是把数据写入缓冲区里。对字符设备文件

34、进行写操作将调用write子程序。ioctl入口点:执行读、写之外的操作。select入口点:检查设备,看数据是否可读或设备是否可用于写数据。select系统调用在检查与设备文件相关的文件描述符时使用select入口点。09 四月 2023生物医学工程学院电子技术系5710.3 嵌入式Linux驱动程序开发structfile_operationsstructmodule*owner;loff_t(*llseek)(structfile*,loff_t,int);ssize_t(*read)(structfile*,char*,size_t,loff_t*);ssize_t(*write)(s

35、tructfile*,constchar*,size_t,loff_t*);int(*readdir)(structfile*,void*,filldir_t);unsignedint(*poll)(structfile*,structpoll_table_struct*);int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong);int(*mmap)(structfile*,structvm_area_struct*);int(*open)(structinode*,structfile*);int(*flush)(stru

36、ctfile*);int(*release)(structinode*,structfile*);int(*fsync)(structfile*,structdentry*,intdatasync);int(*fasync)(int,structfile*,int);int(*lock)(structfile*,int,structfile_lock*);ssize_t(*readv)(structfile*,conststructiovec*,unsignedlong,loff_t*);ssize_t(*writev)(structfile*,conststructiovec*,unsign

37、edlong,loff_t*);ssize_t(*sendpage)(structfile*,structpage*,int,size_t,loff_t*,int);unsignedlong(*get_unmapped_area)(structfile*,unsignedlong,unsignedlong,unsignedlong,unsignedlong);09 四月 2023生物医学工程学院电子技术系5810.3 嵌入式Linux驱动程序开发 lseek,移动文件指针的位置,只能用于可以随机存取的设备。read,进行读操作,buf为存放读取结果的缓冲区,count为所要读取的数据长度。wr

38、ite,进行写操作,与read类似。select,进行选择操作。ioctl,进行读、写以外的其他操作。mmap,用于把设备的内容映射到地址空间,一般只有块设备驱动程序使用。open,打开设备进行I/O操作。返回0表示成功,返回负数表示失败。release,即close 操作。09 四月 2023生物医学工程学院电子技术系59structinode称做索引节点数据结构,定义如下:structinodestructlist_headi_hash;structlist_headi_list;structlist_headi_dentry;structlist_headi_dirty_buffers;

39、structlist_headi_dirty_data_buffers;unsignedlongi_ino;atomic_ti_count;kdev_ti_dev;umode_ti_mode;nlink_ti_nlink;uid_ti_uid;gid_ti_gid;kdev_ti_rdev;loff_ti_size;time_ti_atime;time_ti_mtime;time_ti_ctime;unsignedinti_blkbits;unsignedlongi_blksize;unsignedlongi_blocks;unsignedlongi_version;structsemapho

40、rei_sem;structsemaphorei_zombie;structinode_operations*i_op;structfile_operations*i_fop;structsuper_block*i_sb;09 四月 2023生物医学工程学院电子技术系60wait_queue_head_ti_wait;structfile_lock*i_flock;structaddress_space*i_mapping;structaddress_spacei_data;structdquot*i_dquotMAXQUOTAS;structlist_headi_devices;struct

41、pipe_inode_info*i_pipe;structblock_device*i_bdev;structchar_device*i_cdev;unsignedlongi_dnotify_mask;structdnotify_struct*i_dnotify;unsignedlongi_state;unsignedinti_flags;unsignedchari_sock;atomic_ti_writecount;unsignedinti_attr_flags;09 四月 2023生物医学工程学院电子技术系61_u32i_generation;unionstructminix_inode_

42、infominix_i;structext2_inode_infoext2_i;structext3_inode_infoext3_i;structhpfs_inode_infohpfs_i;structntfs_inode_infontfs_i;structmsdos_inode_infomsdos_i;structumsdos_inode_infoumsdos_i;structiso_inode_infoisofs_i;structnfs_inode_infonfs_i;structsysv_inode_infosysv_i;structaffs_inode_infoaffs_i;stru

43、ctufs_inode_infoufs_i;structefs_inode_infoefs_i;structromfs_inode_inforomfs_i;structshmem_inode_infoshmem_i;structcoda_inode_infocoda_i;structsmb_inode_info09 四月 2023生物医学工程学院电子技术系62_smbfs_i;structhfs_inode_infohfs_i;structadfs_inode_infoadfs_i;structqnx4_inode_infoqnx4_i;structreiserfs_inode_inforei

44、serfs_i;structbfs_inode_infobfs_i;structudf_inode_infoudf_i;structncp_inode_infoncpfs_i;structproc_inode_infoproc_i;structsocketsocket_i;structusbdev_inode_infousbdev_i;structjffs2_inode_infojffs2_i;void*generic_ip;u;09 四月 2023生物医学工程学院电子技术系6310.3 嵌入式Linux驱动程序开发nstruct file主要用于与文件系统相关的设备驱动程序,可提供关于被打开

45、的文件的信息,定义如下:structfilestructlist_headf_list;structdentry*f_dentry;structvfsmount*f_vfsmnt;structfile_operations*f_op;atomic_tf_count;unsignedintf_flags;mode_tf_mode;loff_tf_pos;unsignedlongf_reada,f_ramax,f_raend,f_ralen,f_rawin;structfown_structf_owner;unsignedintf_uid,f_gid;intf_error;unsignedlong

46、f_version;/*neededforttydriver,andmaybeothers*/void*private_data;/*preallocatedhelperkiobuftospeedupO_DIRECT*/structkiobuf*f_iobuf;longf_iobuf_lock;09 四月 2023生物医学工程学院电子技术系6410.3 嵌入式Linux驱动程序开发n在用户自己的驱动程序中,首先要根据驱动程序的功能,完成file_operations结构中函数的实现。不需要的函数接口可以直接在file_operations结构中初始化为NULL。file_operations中

47、的变量会在驱动程序初始化时,注册到系统内部。每个进程对设备的操作,都会根据主次设备号,转换成对file_operations结构的访问。09 四月 2023生物医学工程学院电子技术系6510.3 嵌入式Linux驱动程序开发10.3.2 设备驱动程序的开发过程n由于嵌入式设备由于硬件种类非常丰富,在默认的内核发布版中不一定包括所有驱动程序。所以进行嵌入式Linux系统的开发,很大的工作量是为各种设备编写驱动程序。除非系统不使用操作系统,程序直接操纵硬件。嵌入式Linux系统驱动程序开发与普通Linux开发没有区别。可以在硬件生产厂家或者Internet上寻找驱动程序,也可以根据相近的硬件驱动程

48、序来改写,这样可以加快开发速度。实现一个嵌入式Linux设备驱动的大致流程如下。09 四月 2023生物医学工程学院电子技术系6610.3 嵌入式Linux驱动程序开发(1)查看原理图,理解设备的工作原理。一般嵌入式处理器的生产商提供参考电路,也可以根据需要自行设计。(2)定义设备号。设备由一个主设备号和一个次设备号来标识。主设备号惟一标识了设备类型,即设备驱动程序类型,它是块设备表或字符设备表中设备表项的索引。次设备号仅由设备驱动程序解释,区分被一个设备驱动控制下的某个独立的设备。(3)实现初始化函数。在驱动程序中实现驱动的注册和卸载。(4)设计所要实现的文件操作,定义file_operat

49、ions结构。(5)实现所需的文件操作调用,如read、write等。(6)实现中断服务,并用request_irq向内核注册,中断并不是每个设备驱动所必需的。(7)编译该驱动程序到内核中,或者用insmod命令加载模块。(8)测试该设备,编写应用程序,对驱动程序进行测试。09 四月 2023生物医学工程学院电子技术系6710.3 嵌入式Linux驱动程序开发 模块化驱动程序设计n在探讨模块之前,有必要先看一看内核模块与应用程序之间的区别。一个应用从头到尾完成一个任务,而模块则是为以后处理某些请求而注册自己,完成这个任务后,它的“主”函数就立即中止了。n然而,内核源码仅能连接编译到内核模块中,

50、不像应用那样有众多的支持库,内核能调用的仅是由内核开放出来的那些函数。由于没有库连接到模块中,所以源码文件不应该模块化任何常规头文件。与内核有关的所有内容都定义在目录/usr/include/linux和/usr/include/asm下的头文件中。09 四月 2023生物医学工程学院电子技术系6810.3 嵌入式Linux驱动程序开发 1内核空间和用户空间n当谈到软件时,我们通常称执行态为“内核空间”和“用户空间”,在Linux系统中,内核在最高级执行,也称为“管理员态”,在这一级任何操作都可以执行。而应用程序则执行在最低级,所谓的“用户态”,在这一级处理器禁止对硬件的直接访问和对内存的未授

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁