特点:规模小、开发难度大、高实时性和高可靠性要求、软件固化存储
分类:系统软件、应用软件、支撑软件
体系结构:
1.无操作系统的嵌入式软件:循环轮转方式、中断方式
2.有操作系统的嵌入式软件:
设备驱动层
完成硬件设备所需要的一些软件初始化、管理。直接对硬件进行管理、控制,并为上层软件提供所需的驱动支持
板级支持包:BSP,Board Support Package。类似于 BIOS+驱动程序
把所有与硬件相关的代码都封装起来,为操作系统提供一个虚拟的硬件平台。将嵌入式操作系统与具体的硬件平台隔离开来
用户可以根据不同的硬件需求对其今次那个改动、二次开发
包括:
BootLoader(引导加载程序):操作系统内核运行之前运行的一小段程序。用来完成整个系统的加载启动任务。
初始化硬件设备、建立内存空间的映射图。将系统的软硬件环境设置到一个合适的状态,以便为最终为调用操作系统内核做好准备
包括:片级初始化(纯硬件初始化)、板级初始化(软硬件初始化)、加载内核……基本功能
设备驱动程序:一组库函数。对硬件进行初始化、管理,并向上层软件提供访问接口
函数的组织结构:
分层结构:硬件接口、调用接口
混合结构:
系统初始化过程可以分为3个主要环节,按照自底向上、从硬件到软件的次序依次为:片级初始化、板级初始化和系统级初始化。
1.片级初始化:完成嵌入式微处理器的初始化,包括设置嵌入式微处理器的核心寄存器和控制寄存器、嵌入式微处理器核心工作模式和嵌入式微处理器的局部总线模式等。片级初始化把嵌入式微处理器从上电时的默认状态逐步设置成系统所要求的工作状态。这是一个纯硬件的初始化过程。
2.板级初始化:完成嵌入式微处理器以外的其他硬件设备的初始化。另外,还需设置某些软件的数据结构和参数,为随后的系统级初始化和应用程序的运行建立硬件和软件环境。这是一个同时包含软硬件两部分在内的初始化过程。
3.系统初始化:该初始化过程以软件初始化为主,主要进行操作系统的初始化。 BSP 将对嵌入式微处理器的控制权转交给嵌入式操作系统,由操作系统完成余下的初始化操作,包含加载和初始化与硬件无关的设备驱动程序,建立系统内存区,加载并初始化其他系统软件模块,如网络系统、文件系统等。最后,操作系统创建应用程序环境,并将控制权交给应用程序的入口。
嵌入式中间件:
一种软件平台技术。
不包括操作系统内核、设备驱动程序、应用软件在内的所有软件系统
将原本属于应用软件层的一些通用功能模块抽取出来
分类:消息中间件、对象中间件、远程过程调用(RPC:Remote Procedure Calls)、数据库访问中间件、安全中间件……
操作系统层:
EOS:Embedded Operating System,嵌入式操作系统
功能:
1.构成一个易于编程的虚拟机平台:提供抽象的编程接口,间接操作硬件层。
2.系统资源的管理者:各种软硬件资源。
目标:完成某一项、有限项功能,而非通用型的操作系统。性能、实时性方面限制严格
内核:Kernel。任务管理、存储管理、输入/输出(I/O)设备管理、文件系统管理
分类:
系统类型:商业化系统、专用系统、开发源代码系统
响应时间:RTOS(Real Time Operating Systems,实时操作系统:硬实时系统、软实时系统)、非实时操作系统
体系结构:单体结构(裁剪、修改、调试、维护不方便)、分层结构(组织良好)、微内核结构(客户单元与服务器单元相互独立,安全)
常见的嵌入式操作系统:
1.VxWorks:微内核,最广泛、市场占有率最高的商业系统之一
2.嵌入式Linux:开放源码
3.Window CE:提供图形界面、各种应用程序
4.μC/OS-II:Micro-Controller Operating System,微控制器操作系统,MUCOSUCOS。免费、开源
任务管理:
1.单道程序设计类型:任何时候只能有一个程序在运行
2.多道程序设计类型:
进程:正在执行的程序,=程序+运行的上下文。
动态的,变化的;具有独立性,是一个独立的实体;并发性
=线程+资源平台
一个进程运行的时候,可以启动一个或多个程序;一个程序也可能由多个进程同时执行。
一次执行,暂时的,动态地产生、终止
包括:相应的程序(代码+数据)、CPU上下文、一组系统资源。
线程:进程当中的一条执行流程
CPU的基本调度单位;并发性。
一个进程、资源平台上可以同时存在多个线程;同一进程中的各线程,可以共享该进程的大部分资源(内存地址空间、代码、数据、文件……),也有一小部分资源不能共享,每个线程都必须拥有各自独立的一份(CPU运行上下文:PC寄存器、PSW寄存器、通用寄存器、栈指针;栈……)
任务(task):能够独立运行的实体
优先级、栈空间大小、函数名
层次结构:
创建:fork/exec(继承)、spawn(新)
终止:正常退出、错误退出、被其他任务踢出……
状态:运行(running)、就绪(ready)、阻塞(blocked)=等待(waiting)
任何一个时刻,处于运行转台的任务个数<=CPU数目
TCB(Task Control Block):任务控制块。用来描述、管理一个任务的数据结构
描述任务的基本情况、运行变化过程
任务存在的唯一标志。对任务的组织、管理通过对TCB的组织、管理来实现
包括:任务的管理信息、CPU上下文信息、资源管理信息……
任务切换:
步骤:
1.将CPU上下文信息保存在TCB中
2.更新状态:就绪>阻塞
3.按策略,从就绪中选择一个运行
4.修改新任务状态:就绪>运行
5.根据新任务TCB,恢复CPU上下文环境
任务队列:
组织所有任务,提高管理效率
运行队列、就绪队列、阻塞队列(多个:阻塞原因不同,阻塞队列不同)
系统当中的每个任务,根据状态,将TCB加到相应队列中
任务调度(scheduler):
选择就绪队列中任务中的一个去运行
CPU资源的管理者
环境:任务创建、任务结束、I/O操作、阻塞、I/O中断、时钟中断……
调度方式:可抢占调度(preemptive)、不可抢占调度(nonpreemtive)
响应时间(response time)=调度器为就绪任务进行上下文切换所用的时间+任务在就绪队列中的等待时间
周转时间(turnaround time)=从提交到完成经理的时间
调度开销(overhead)=调度器做出调度决策时所需的时间+空间开销
公平性(fairness):任务得到CPU时间大致相同,防止饥饿情况发生
均衡性(balance):CPU、I/O都忙起来
吞吐量=单位时间内完成的任务数量
调度算法:
1.先来先服务算法:First Come First Served,FCFS。简单。平均周转时间取决于各任务到达的顺序
2.短作业优先算法:Shortest Job First,SJF。可抢占式(SRTF:Shortest Remaining Time First:最短剩余时间优先算法)、不可抢占式。最小的平均周转时间。长任务长时间无法运行
3.时间片轮转算法:Round Robin,RR。各任务平均分配CPU使用时间
4.优先级算法:Priority。包括:可抢占、不可抢占。优先级确定:静态方式、动态方式。优先级相同的,任务按不同的优先级分组,不同组使用优先级算法,同一组使用时间片轮转法
实时系统调度
1.RTOS任务执行
2.单调速率调度算法:Rate Monotonic Scheduling,RMS
静态优先级调度算法。
3.最早期限优先算法:Earliest Deadline First,EDF
存储管理
MMU:Memory Management Unit,存储管理单元
一种内存保护的硬件机制,防止地址越界、操作越权
实现系统内核与应用程序的隔离;应用程序之间进行隔离。
通常,只在安全性、可靠性要求高,系统复杂的嵌入式系统中存在
方式:
1.实模式存储管理:整个系统只有一个地址空间(物理内存地址空间),只有运行上下文、栈是独享的,其他资源都是共享的。
内存地址包括:text(代码段)、data(数据段:带初始值的全局变量)、bss(未初始值的全局变量)、堆(动态分配的内存空间:malloc、free(一段连续的内存空间))、栈(局部变量、运行参数)
简单,适合规模下、简单、实时性要求高的系统。没有存储保护,安全性差
2.保护模式存储管理:具有MMU硬件并启用。没有应用程序只能访问自己的地址空间,对于共享的内存区域,按照权限规则访问,具有存储保护功能
安全性、可靠性好,适合规模较大、较复杂、实时性要求不太高的系统
分区存储管理:适合多道程序操作系统
整个内存分为系统区、用户区(若干个)
分类:
1.固定分区存储管理:一旦确定,固定不变,不可修改。内碎片
分区大小可以相等,也可不等
简单。内存利用率不高,限制并行执行的程序个数
2.可变分区存储管理:系统动态创建。无内碎片,可能有外碎片
个数、位置、大小是动态变化的
考虑:数据结构、内存分配算法(内存低端到高端)、内存回收算法(空闲区合并,分区链表更新)
分区链表
分区分配算法:最先匹配法(first-fit)、下次匹配法(next-fit)、最佳匹配法(best-fit)、最坏匹配法(worst-fit)
地址映射:
由存储管理单元MMU完成
物理地址:内存地址、绝对地址、实地址。
只有通过物理地址,才能对内存单元进行直接访问
一维的线性空间
逻辑地址:相对地址、虚地址
经过编译、汇编形成的目标代码采用的是相对地址,其余指令中的地址都是相对于这个首地址来编址的
映射方式:
1.静态地址映射:装入内存前,一次性将所有逻辑地址转换为物理地址。一旦装入内存,就不在改变
2.动态地址映射:程序运行过程中需要访问内存时,再进行转换(硬件的地址映射机制完成,基地址寄存器(重定位寄存器))
页式存储管理:
打破存储分配的连续性,以提高内存利用率
程序必须全部装入内存,才能够运行。如果一个程序的规模大于当前的空闲的综合,就无法运行。
页表结构包括:多级页表结构、哈希页表结构、反置页表……
1.数据结构:
页表:逻辑页面号与内存中的物理页面号之间的对应关系
物理页表:内存中,各个物理页面的使用分配状况。位示图、空闲页面链表实现
2.内存分配与回收:
3.地址映射:以页面为单位
虚拟页式存储管理:
MMU提供
页式存储管理+请求调页+页面置换;页表项增加驻留位、保护位、修改位、访问位……
只装入部分的页面,就可以启动程序,运行。
页面置换算法:最优页面置换算法(OPTimal,OPT)、最近最久未使用算法(Least Recently Used,LRU)、最不常用算法(Least Frequently Used,LFU)、先进先出算法(First In First Out,FIFO)、时钟页面置换算法(Clock)
I/O设备管理
I/O单元:I/O设备(人机交互)+设备控制器(与主机通信)
控制寄存器编址:
1.I/O独立编址:每一个寄存器一个唯一的I/O端口地址。地址空间完全独立,不占用内存空间,指令形式不一样
2.内存映像编址:每一个寄存器都映射为一个内存单元(专门用于I/O操作)。端口、内存地址空间统一编码,编程方便
3.混合编址:I/O独立编址(设备控制器中的寄存器)+内存映像编址(I/O设备的数据缓冲区)
I/O控制方式:
1.程序循环检测方式:繁忙等待方式、论询方式。I/O操作的整个过程,控制I/O设备的所有工作都是又CPU完成的,一直占用CPU.
2.中断驱动方式:I/O操作时,CPU调用一个对应的系统函数(来启动I/O操作),CPU执行其他任务。I/O操作完成,向CPU发出中断。
数据的每次读写还是通过CPU完成;当I/O设备进行数据处理时,CPU可以进行其他操作,不必等待
3.直接内存访问方式(DMA,Direct Memory Access):DMA控制器,完成I/O设备与内存之间的数据存送,空出更多的CPU时间
I/O软件:
1.中断处理程序:I/O设备驱动程序(启动I/O操作,自身阻塞)
2.I/O设备驱动程序:直接对I/O设备进行控制(读、写、初始化……);与具体的设备类型密切相关
3.设备独立的I/O软件:位于设备驱动的上面,系统内核的一部分。通用的I/O功能,向用户提供统一的访问接口;
驱动程序地址表:实现设备驱动程序的管理。各个设备驱动程序的入口地址。实现设备驱动的动态安装、卸载
缓冲区:为了缓解I/O与CPU速度不匹配,在内存中开辟的一个存储空间
缓冲技术:单缓冲、双缓冲、环形缓冲
4.用户空间的I/O软件:
Spooling(simultaneous Peripheral Operations on line,外围设备联机操作):多道系统中,一种处理独占设备的方法。
将独占的设备转变为具有共享特征的虚拟设备