▲第5章嵌入式系统的软件▲5.1嵌入式系统软件的开发方式5.2嵌入式系统软件的结构5.3基于嵌入式Linux的嵌入式系统的软件▲5.1嵌入式系统软件的开发方式5.1嵌入式系统软件的开发方式5.1.1嵌入式系统的软件嵌入式系统软件通常包括:操作系统应用软件▲软硬件结合是嵌入式系统软件开发最大的特点,主要体现在两方面处理器体系结构•Windows和桌面Linux系统通常只运行在x86单一的体系结构上•嵌入式系统具有ARM、x86、MIPS等多种体系结构的处理器,在这些处理器上运行的本地程序需要使用不同的编译工具进行编译,生成不同的二进制代码软件和硬件之间的接口•Windows和桌面Linux系统的驱动程序是比较标准化的,通常在驱动程序之上,还具有硬件抽象层(HardwareAbstractLayer,HAL),它可以进一步的“屏蔽”硬件之间的差异•嵌入式系统具有多种多样的接口、设备等硬件(嵌入式处理器芯片内部或外接),需要软件支持,特别是需要关注软硬件的交互•另外,嵌入式系统因为成本原因,处理器性能、内存容量以及外围接口和设备资源均有限,需要对软件进行裁剪、优化5.1嵌入式系统软件的开发方式5.1.2软硬件结合的方式▲5.2嵌入式系统软件的结构5.2.1软件的层次结构第一章回顾嵌入式系统结构自下而上,通常可以分成四个层次:硬件(Hardware)操作系统(OS)中间件(MiddleWare)应用层程序(Application)5.2嵌入式系统软件的结构▲5.2嵌入式系统软件的结构嵌入式系统软件的层次结构▲操作系统需要包含了核心的功能,操作系统和中间件之间的差别在同一个系统中通常可以区分。但是在不同系统中,某些功能即可以放在操作系统中实现,也可以放在中间件来实现,如文件系统、网络协议(网络管理)5.2嵌入式系统软件的结构中间件是比较底层的软件,通常只提供功能的接口,不实现具体的逻辑。中间件起着承上启下的作用,将操作系统的功能和应用层程序作出恰当的隔离和联系对于比较简单的功能,可以不经过中间件,直接调用操作系统的API实现即使在同一个系统中,那些软件是中间件,那些是应用层,也不存在完全的区分▲5.2嵌入式系统软件的结构5.2.2嵌入式软件的分类1、操作系统操作系统的核心通常包括了进程(任务)调度、进程(任务)间通讯、内存管理、文件系统、设备管理等方面▲5.2嵌入式系统软件的结构第一章回顾嵌入式操作系统的主要功能:处理器管理:在多任务环境下,合理分配任务来共享处理器,提高处理器的利用率,同时提供任务间的通信机制内存管理:为多任务环境下的程序运行提供良好的环境,包括内存分配、内存保护、地址映射、内存扩充文件管理:对系统文件和用户文件进行管理,包括存储空间的管理、目录管理、文件的读写管理以及文件的共享与保护设备管理:根据用户提出的设备请求,为用户分配I/O设备,提高CPU和I/O设备的利用率▲5.2嵌入式系统软件的结构2、文件系统(FileSystem,FS)文件系统可以提供一致的“文件”功能,有利于统一各不同具体文件系统之间的差异,简化系统的开发过程。在嵌入式Linux中,文件系统属于操作系统的一部分,而设备管理需要文件系统的支持3、协议栈(Protocol)TCP/IP网络协议是目前最常使用的协议栈,除此之外,还有蓝牙协议、红外协议等各个层次的协议栈在嵌入式Linux中,网络协议(网络管理)有的认为属于操作系统的一部分,有的认为不属于,本书按“属于”论述4、GUI(图形用户界面)系统GUI系统可以提供给上层(比如应用层)一个接口,让上层的程序实现各种具体的图形界面▲5.3基于嵌入式Linux的嵌入式系统的软件5.3基于嵌入式Linux的嵌入式系统的软件5.3.1嵌入式Linux操作系统、中间件、应用层程序的关系▲5.3基于嵌入式Linux的嵌入式系统的软件在基于嵌入式Linux的嵌入式系统中,软件系统通常包含了操作系统,中间件,应用层程序等几个层次设备管理▲嵌入式Linux操作系统如何支持中间件/应用层?嵌入式Linux操作系统提供系统调用(一些基础的功能)来完成和中间件/应用层的交互:系统调用Linux操作系统(位于内核空间)和中间件/应用层(位于用户空间)之间的基础接口是系统调用(SystemCall)Linux的系统调用按照功能逻辑大致可分为:进程控制、进程间通信存储管理文件系统设备管理网络管理等5.3基于嵌入式Linux的嵌入式系统的软件▲5.3基于嵌入式Linux的嵌入式系统的软件系统调用在许多操作系统(包括嵌入式Linux)中,为了更好地保护操作系统内核,将程序的运行空间分为内核空间和用户空间(内核态和用户态),它们分别运行在不同的级别上,逻辑上是相互隔离的用户程序(中间件/应用层)在通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间访问用户数据,调用用户空间的函数。而系统调用接口正是操作系统向用户程序提供支持的接口,通过这些接口,用户程序向操作系统请求服务,控制转向操作系统,而操作系统在完成服务后,将控制和结果返回给用户程序数据函数数据函数▲5.3基于嵌入式Linux的嵌入式系统的软件用户程序系统调用内核空间用户空间用户编程接口API用户编程接口API实际上,呈现给中间件/应用层调用的是并不是系统调用(进程控制、进程间通信、存储管理、文件系统、设备管理、网络管理等),而是用户编程接口API(ApplicationProgrammingInterface)API对系统调用进行了适当的封装,符合POSIX接口标准▲5.3基于嵌入式Linux的嵌入式系统的软件文件系统文件系统作为Linux操作系统的一部分,向用户程序(中间件/应用层)提供一个操作文件的统一接口,包括:新建、打开、读写等标准的文件I/O操作支持多种类型的文件系统,其中比较常用的包括EXT2、EXT3、FAT、NTFS、Cramfs、JFFS、ROMFS、NFS等支持不同类型的存储介质进程管理子系统内存管理子系统vfs网络子系统进程通信子系统minixExt2msdos设备缓冲设备驱动程序中间件/应用层LinuxOS▲5.3基于嵌入式Linux的嵌入式系统的软件open:打开文件准备I/O操作。release/close:关闭由open()函数打开的文件read:从文件读数据write:往文件写数据lseek:移动文件指针的位置ioctl:执行读、写之外的操作,主要是一些自定义的命令fcntl:文件/记录上锁等select:处理文件复用mmap:主要用于设备文件…………文件系统API(操作文件的统一接口)▲设备管理设备管理Linux操作系统的一部分由于I/O设备(比如:第四章的外围接口和设备)千差万别,这就给操作系统对I/O设备管理造成了不少的难度和麻烦。为此,在Linux中引入了“设备文件”这个概念。即:Linux系统把每个设备映射为一种特殊的文件,Linux对各类设备的输入、输出看起来就好像对普通文件的输入输出一样使用设备文件好处:Linux为文件和设备提供了一致的用户接口,对用户而言,设备文件与普通文件并无区别,可以象操作文件一样打开和关闭设备文件、读写数据等在Linux系统中,硬件设备(包括字符设备和块设备)使用文件来表示,这些文件在/dev/目录中5.3基于嵌入式Linux的嵌入式系统的软件▲5.3基于嵌入式Linux的嵌入式系统的软件Linux将所有的设备看作文件,通过文件系统对设备进行访问。这样可以很好的做到“设备无关性”Linux对设备的管理划分成四个层次:用户程序(中间件/应用层)文件系统层设备驱动层硬件层位于LinuxOS▲5.3基于嵌入式Linux的嵌入式系统的软件设备管理API(操作设备文件的统一接口)open:打开设备准备I/O操作。release/close:关闭由open()函数打开的设备read:从设备上读数据write:往设备上写数据lseek:移动文件指针的位置,仅用于随机存取的设备ioctl:执行读、写之外的操作,主要是一些自定义的命令,如对设备的参数设置等fcntl:设备文件上锁等select:处理设备复用mmap:内存映射(因为设备内存位于内核空间)…………▲网络管理5.3基于嵌入式Linux的嵌入式系统的软件TCP/IP网络分层模型网络接口层(MAC层):负责管理硬件(网络硬件设备驱动)网络层(IP层):负责处理主机之间(点到点)的通信,每个主机在网络层有一个网内唯一的IP地址传输层:负责处理应用程序(端到端)之间的通信,如TCP/UDP应用层:通过调用网络层/传输层提供的API函数(主要是传输层提供的应用程序之间通信服务API)来进行网络通信,一般通过套接字Socket(一整套的API及使用流程)的方式网络层▲5.3基于嵌入式Linux的嵌入式系统的软件socket是进程之间通信机制,通过它不同机器上的进程之间能够通过网络进行通信,也能实现本地机器上的进程之间的通信一个完整的socket需要用一个相关描述(包括协议(TCP/IP)、本地地址、本地端口、远程地址、远程端口)来表示。▲5.3基于嵌入式Linux的嵌入式系统的软件网络管理API(包括使用流程)socket服务器端closesend/sendtorecv/recvfromacceptlistenbindsocketcloserecv/recvfromsend/sendtoconnect客户端bindTCP通信流程UDP通信流程▲5.3基于嵌入式Linux的嵌入式系统的软件对于中间件/应用层(位于用户空间),C语言库提供了程序运行的基本函数操作和标准库函数,C语言库除了API以外还有一些其他的函数,这些函数中许多也需要调用API来实现C函数库包括两类:静态库(归档文件)和动态库(动态链接库/共享库)C语言库静态库在编译时就被链接到可执行程序中动态库在程序运行时被加载(动态链接),动态库可以经过若干个层次的“链接”可执行程序使用动态库的另外一种方式是动态打开,这种动态库不需要被链接在目标系统中,只有可执行程序和动态库,静态库在使用的时候会被连接到可执行程序和动态库之内▲5.3基于嵌入式Linux的嵌入式系统的软件C函数库文件名由前缀lib和库名以及后缀组成静态库的后缀名为.a,如libm.a动态库的后缀名为.so加版本号,如libm.so.6应用层的应用程序不仅可以是可执行程序,也可以是若干个层次的动态库中间件不仅可以是动态库,也可以是可执行程序C语言库▲5.3.2嵌入式Linux中的中间件5.3基于嵌入式Linux的嵌入式系统的软件▲1、用户终端在嵌入式Linux系统的中,用户终端(shell)是操作系统之外的最基本软件,它提供一个可以进行人机交互的界面,通过这个界面我们可以输入并执行Linux中常用的命令在Linux中,用户终端通常需要建立在一个系统的标准终端中,这个终端通常是一个Linux中的tty设备。用户终端使用这个设备作为的输入输出的基础,并提供一个基本的界面,一些比较好的终端可以实现历史纪录、自动完成命令等功能。用户终端所支持的各种命令(比如mv,ls,cp,ifconfig等)通过调用Linux系统调用(API)来实现。例如:完成mkdir命令,可以通过mkdirAPI函数完成5.3基于嵌入式Linux的嵌入式系统的软件▲Linux终端程序Linux操作系统tty驱动程序标准系统调用(SystemCall)各种命令各种命令各种命令人机交互界面(提示符)执行交互:输入命令、查看信息……Linux的用户终端工具5.3基于嵌入式Linux的嵌入式系统的软件▲嵌入式Linux中常用的用户终端BusyBox它是一个多功能应用软件,小巧但功能繁多,特别适合于嵌入式系统使用Busybox是一组小程序,可以提供一些在命令行使用的工具,实现shell人机交互界面的功能,为任何一个嵌入式系统提供了相当