嵌入式复习提纲
嵌入式系统
定义(重点)
- IEEE定义:用于控制、监控或者辅助操作机器和设备的装置
- 国内定义:嵌入式系统是以应用为中心以计算机技术为基础,软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专业计算机系统
特点(重点)
- 形式多样,面向特定应用
- 得到多种类型处理器和处理器体系结构的支持
- 极其关注成本
- 有实时性和可靠性要求
- 使用的操作系统使用多种处理器、可裁剪、轻量型、实时可靠、可固化的嵌入式操作系统
- 需要专门工具和特殊方法
分类(重点)
- 按处理器位数:4位、8位、16位、32位、64位
- 按应用:信息家电、汽车电子、通信、移动终端、工业控制
- 按速度:强实时系统、一般实时系统、弱实时系统
- 按确定性:硬实时系统、软实时系统
- 按复杂程度:循环轮询系统、有限状态机系统、前后台机系统、单处理器多任务系统、多处理器多任务系统
典型应用(重点)
工控设备、军用电子设备、航空航天、汽车电子、信息家电、通信、智能玩具、可穿戴设备
基本组成(重点)
由嵌入式硬件和软件组成
- 硬件:微处理器为核心继承寻初期和系统专用的输入输出设备
- 软件:初始化代码及驱动、嵌入式操作系统和应用程序有机结合,形成系统特定的一体化软件。
IOT基本组成(重点)
第一种答案
- 设备传感器
- 连通性
- 网关
- 云
- 数据处理
- 用户界面
第二种答案
- 传感网
- M2M
- 两化融合
- RFID
CPS的基本组成(重点)
- CPS:信息物理系统(Cyber-Physical Systems)作为计算机进程和物理进程的统一体,是集成计算、通信与控制于一体的下一代智能系统。
- 基本组成:传感器、执行器、决策控制单元
- 嵌入式系统+网络+控制功能
嵌入式系统设计
嵌入式系统面临挑战
- 需要的硬件数量问题
- 如何满足时限要求,如何处理多项功能在时间上的协调一致关系
- 如何降低系统功耗
- 如何设计以保证系统可升级
- 如何保证系统可靠的工作
传统开发过程
- 需求分析
- 规格说明
- 体系结构
- 构建设计
- 系统集成
软硬件协同设计(非重点)
增加了系统的灵活性
增加了风险
软硬件的划分
- 嵌入式系统的设计涉及硬件与软件部分,设计中必须决定什么功能由硬件实现,什么功能由软件实现。
- 硬件和软件具有双重性
- 软硬件变动对系统的决策造成影响
- 划分和选择需要考虑多种因素
- 硬件和软件的双重性是划分决策的前提
嵌入式硬件系统基础
嵌入式微处理器基础
嵌入式微处理器体系结构
冯诺依曼结构和哈佛结构
- 冯诺依曼结构:数据和程序放在同一个存储单元,统一编制,指令和数据通过同一个总线访问
- 哈佛结构:程序和数据存储在不同的空间中,即程序存储器和数据存储器是两个相互独立的存储器,每个存储器独立编制、独立访问。与之相对应的是系统中设置的两条总线(程序总线和数据总线),从而使数据的吞吐量提高了一倍(更大存储代管和更大可预测带宽)
- 哈佛结构不能使用自修改代码
CISC与RISC
CISC:复杂指令集(许多地址格式,许多操作)
RISC:精简指令集(流水型指令)
RISC机器用来减少指令周期的一种技术,可提高处理器和总线使用率
| | CISC | RISC |
| —————— | —————————————————————————————— | —————————————————————————————— |
| 价格 | 由硬件完成部分软件功能,硬件复杂性增加,芯片成本高 | 由软件完成部分硬件功能,软件复杂性增加,芯片成本低 |
| 性能 | 减少代码尺寸,增加指令的执行周期数 | 使用流水线降低指令的执行周期数,增加代码尺寸 |
| 指令集 | 大量的混杂指令集,有简单快速的指令,也有复杂多周期指令,符合HLL | 简单的单周期指令,在汇编指令方面有相应的SISC伪代码指令 |
| 高级语言支持 | 硬件完成 | 软件完成 |
| 寻址模式 | 复杂的寻址模式,支持内存到内存寻址 | 简单的寻址模式,仅允许LOAD和STORE指令存取内存,其他所有的操作都基于寄存器到寄存器 |
| 寄存器数目 | 寄存器较少 | 寄存器较多 |
流水线技术
RISC机器用来减少指令周期的一种技术,提高处理器和总线的使用率,在CPU中由若干个不用功能的电路单元组成一条指令处理流水线,然后将一条指令分成若干步后再由这些电路单元分别执行,这样就能实现在一个CPU时钟周期完成一条指令,因此提高CPU的运算速度。
优点:提高CPU利用率、并行计算
看门狗(Watch Dog)(重点)
功能:
在对系统稳定性要求较高的场合,防止嵌入式控制系统运行时收到外部干扰或者系统错误,程序出现跑飞,导致整个系统瘫痪,加入看门狗电路,当系统跑飞进入死循环时,回复系统的运行
基本原理:
舍本系统程序完整运行一周期的时间是tp,看门狗的定时周期为ti,且ti>tp,在程序运行一周气候就修改(在重新设定看门狗的定时周期)定时器的计数值(喂狗),只要程序正常运行,定时器就不会溢出。若由于干扰等原因使系统不能再tp时刻修改定时器的计数值,定时器将在ti时刻溢出,引发系统复位,使系统得以重新运行,从而起到监控的作用。
嵌入式系统的存储体系
存储器系统:存储器系统的层次结构
ROM的种类与选型
ROM
只读存储器(Read-Only Memory)是一种只能读取资bai料的存储器。在制造过程中,将资料以一特制光罩(mask)烧录于线路中,其资料内容在写入后就不能更改,所以有时又称为“光罩式只读内存”(mask ROM)。
PROM
可编程程序只读存储器(Programmable ROM,PROM)之内部有行列式的熔丝,是需要利用电流将其烧断,写入所需的资料,但仅能写录一次。 PROM在出厂时,存储的内容全为1,用户可以根据需要将其中的某些单元写入数据0
EPROM
可抹除可编程只读存储器(Erasable Programmable Read Only Memory,EPROM)可利用高电压将资料编程写入,抹除时将线路曝光于紫外线下,则资料可被清空,并且可重复使用。通常在封装外壳上会预留一个石英透明窗以方便曝光。
OTPROM
一次编程只读存储器(One Time Programmable Read Only Memory,OTPROM)之写入原理同EPROM,但是为了节省成本,编程写入之后就不再抹除,因此不设置透明窗。
E2PROM
电子式可抹除可编程只读存储器(Electrically Erasable Programmable Read Only Memory,EEPROM)之运作原理类似EPROM,但是抹除的方式是使用高电场来完成,因此不需要透明窗
快闪存储器
快闪存储器(Flash memory)的每一个记忆胞都具有一个“控制闸”与“浮动闸”,利用高电场改变浮动闸的临限电压即可进行编程动作。
Flash的种类与选型
RAM的种类与选型
RAM
RAM也称随机存储器,那么随机是什么意思?所谓随机,指的是当存储器中的数据被读取或写入时,所需要的时间与这段信息所在的位置无关(任何位置读写速度一样)。
DRAM
DRAM(Dynamic Random Access Memory,动态随机存储器)是最为常见的系统内存。我们使用的电脑和手机的运行内存都是DRAM。DRAM使用电容存储,DRAM 只能将数据保持很短的时间。
SRAM
SRAM(Static Random Access Memory,静态随机存储器),它是一种具有静止存取功能的内存,其内部机构比DRAM复杂,可以做到不刷新电路即能保存它内部存储的数据。
SDRAM
SDRAM:(Synchronous Dynamic Random Access Memory,同步动态随机存取存储器),为DRAM的一种,同步是指Memory工作需要同步时钟,内部命令的发送与数据的传输都以时钟为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是由指定地址进行数据读写。
还有DDR SDRAM、DDR2 SDRAM、DDR3 SDRAM不做过多赘述,感兴趣可以自己百度。
Cache(非重点)
- 不不是一种严格的内存结构
- 会经常性的被程序员忽视
- 有效使用的优化关键
嵌入式系统总线(重点)
总线结构,常见的总线及特点
单总线结构
使用一条单一的系统总线来链接CPU、主存和IO设备。总线只能分时工作,是信息的传送的吞吐量受到限制
双总线结构
在CPU和主存之间专门设置了一组高速的存储总线,使CPU可通过专用总线与存储器交换信息,并减轻了系统总线的负担。主存仍可通过系统总线与外设之间实现DMA操作,而不经过CPU
多总线结构
在双总线系统的基础上增加IO总线,其中系统总线使CPU、主存和通道(IOP)之间进行数据传送的公共通路,而IO是多个外部设备与通道之间进行数据传送的公共通路。通道实际上是一台具有特殊功能的处理器,他分担了一部分CPU的功能,以实现对外设的统一管理及外设与主存之间的数据传送。
输入输出编成:忙等IO和中断IO
- 忙等IO:用指令来检查设备是否就绪
- 最简单的设备驱动方式
- CPU不能再检查设备的过程中执行其他指令
- 很难处理同时发生的IO操作
- 中断IO:基于子程序调用,使下一条指令为一个子程序调用的预定位置,返回位置被保存确保执行前台程序。
- CPU和设备之间通过总线连接
- CPU和设备之间进行握手
- 设备发出中断请求
- 当CPU能处理中断时发出中断确认请求。
- 两种机制确保中断更加有效:优先级决定哪个中断先获得CPU;中断向量决定每个中断对应的执行代码。
- 忙等效率比较低。
Programming I/O:Independent I/O port. memory-mapped I/O
Programming I/O
在通信过程中三种方法来选择控制寄存器和数据缓存:
- Independent I/O port
- memory-mapped I/O
- Hybrid solution. the hybrid model include memory-mapped
I/O data buffers and separate I/O ports for the control
registers.
嵌入式系统软件知识
嵌入式软件基础知识(重点)
嵌入式软件的特点
独特的实用性
嵌入式软件是为嵌入式系统服务的,这就要求它与外部硬件和设备联系紧密。嵌入式系统以应用为中心,嵌入式软件是应用系统,根据应用需求定向开发,面向产业、面向市场,需要特定的行业经验。每种嵌入式软件都有自己独特的应用环境和实用价值
灵活的适用性
嵌入式软件通常可以认为是一种模块化软件,它应该能非常方便灵活地运用到各种嵌入式系统中,而不能破坏或更改原有的系统特性和功能。嵌入式软件要使用灵活,应尽量优化配置,减小对系统的整体继承性,升级更换灵活方便
程序代码精简
由于嵌入式系统本身的应用有小体积、小存储空间、低成本、低功耗等要求,嵌入式软件和大型机上的软件相比,具有代码精简、执行效率高等特点
可靠性、稳定性高
嵌入式系统应用要求一般较为苛刻,特别是在涉及安全相关的领域,如汽车电子、工业控制、航空航天等,这些领域的嵌入式系统不仅要求硬件可靠,还对嵌入式软件提出了更高的要求。嵌入式软件需要运行可靠、稳定,具有错误处理及故障恢复等功能
嵌入式软件的分类
系统软件
EOS负责嵌入系统的全部软、硬件资源的分配、调度工作,控制、协调并发活动;它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能
支撑软件
支撑软件是用于帮助和支持软件开发的软件,通常包括数据库和开发工具,其中以数据库最为重要
应用软件
嵌入式应用软件是针对特定应用领域,基于某一固定的硬件平台,用来达到用户预期目标的计算机软件。由于用户任务可能有时间和精度上的要求,因此有些嵌入式应用软件需要特定嵌入式操作系统的支持
嵌入式软件体系结构
- 驱动层
- 板级初始化程序
- 与系统启动相关的驱动
- 与应用软件相关的驱动
- 与应用软件相关的驱动不一定需要与操作系统连接,这些驱动的设计和开发由应用决定。
- 操作系统层
- 操作系统层包括嵌入式内核、嵌入式TCP/IP网络系统、嵌入式文件系统、嵌入式GUI系统和电源管理等部分
- 其中嵌入式内核是基础和必备的部分,其他部分要根据嵌入式系统的需要来确定
- 中间件层
- 目前在一些复杂的嵌入式系统中也开始采用中间件技术,主要包括嵌入式CORBA、嵌入式Java、嵌入式DCOM和面向应用领域的中间件软件
- 如基于嵌入式CORBA的应用于软件无线电台的应用中间件SCA(Software Core Architecture)等
- 应用层
- 应用层软件主要由多个相对独立的应用任务组成
- 每个应用任务完成特定的工作,如I/O任务、计算的任务、通信任务等,由操作系统调度各个任务的运行
嵌入式操作系统基础知识(重点)
RTOS
概念
对外来事件能在限定的响应时间内做出预定质量处理的计算机系统
特点
可移植性、强调实时性能、内核精简、抢占式内核、使用可重入函数、可配置、可裁剪、高可靠性
选型原则
综合权衡
- 成本
- 可靠性
- 实时性
- 工具链
- 模块丰富
- RTOS内核RAM、ROM占用量
- 支持
任务管理
进程、线程、任务的概念
进程概念
一个程序的单次执行。(如果两次运行一个相同的程序,就创建了两个不同的进程)
进程是操作系统资源分配的基本单位,进程之间的地址空间和资源相互独立
线程概念
每个进程都拥有自己的状态,不仅包括寄存器还包括它所有的内存,在某些操作系统,尤其是轻量级RTOS,进程运行于同一地址空间,通常将这种共享同一地址空间和资源的进程成为线程(共享内存空间且并发运行的一组命令式程序),同一进程的线程之间可以互相访问对方的变量
任务概念
一组实时的程序,且程序之间可能会进行通信
任务的实现
任务的层次结构
任务控制块
任务控制快OS_TCB是描述一个任务的核心数据结构,存放了它的各种管理信息
OSTCBStkPtr:任务栈指针,放在任务块的开始,方便使用
OSTCBNext:指向下一个任务块的指针
OSTCBPrev:指向上一个任务块的指针
OSTCBDly:延迟拍数,使用delay函数会用到这个变量
OSTCBStat:任务的状态
OSTCBPrio:任务的优先级,ucosii中不允许想同优先级的任务,所以可以通过优先级唯一的区分任务
任务的状态及状态转换
任务队列
任务调度
可抢占调度
系统总是选择优先级别的最高的算法进行调度,并且一旦高优先级别的任务准备就绪之后,它就会马上被调度而不等待低优先级的任务主动放弃CPU
不可抢占调度
让进程运行直到结束或阻塞的调度方式
先来先服务
如果早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,那么先来先服务(FCFS: first come first service)总是把当前处于就绪队列之首的那个进程调度到运行状态。也就说,它只考虑进程进入就绪队列的先后,而不考虑它的下一个CPU周期的长短及其他因素,是一种非抢占式策略
时间片轮转算法
系统把所有就绪进程按先入先出的原则排成一个队列。新来的进程加到就绪队列末尾。每当执行进程调度时,进程调度程序总是选出就绪队列的队首进程,让它在CPU上运行一个时间片的时间(时间片是一个小的时间单位,通常为10~100ms数量级)。当进程用完分给它的时间片后,系统的计时器发出时钟中断,调度程序便停止该进程的运行,把它放入就绪队列的末尾;然后,把CPU分给就绪队列的队首进程,同样也让它运行一个时间片,如此往复。
优先级算法
实时系统及任务调度(结合书和实例)
RMS算法
单一速率调度
静态调度策略,分配给每个进程的优先级是固定不变的,基于单一速率分析。
周期短的进程被指定为最高优先级。每个周期进去,p进去,根据优先级调度执行,执行结束就从就绪状态退出直到下一个周期开始
EDF算法
最早截止时限优先调度
动态的优先级方案,在进程执行时根据进程的启动时间改变进程的优先级
根据截止时间顺序指定优先级。最高优先级的进程是当前截止时限最接近的进程
任务间通信
共享内存
两个组件(比如CPU和I/O设备),通过一个共享内存位置进行通信,这个内存区域可以被看作一个通信设备,这个设备上所有的数据都存储在通信链路/内存中
消息
消息传递通信机制是共享内存模型的一种补充
每个通信实体都具有自己的消息发送/接收单元。消息不在通信链路上存储,而是存储在端点的发送器/接收器。
管道
发送进程以字符流形式将大量数据送入管道,接收进程可从管道接收数据,二者利用管道进行通信
由于当前操作系统的不惟一性,各个系统都有其独自的通信协议,导致了不同系统间通信的困难。尽管TCP/IP协议目前已发展成为Internet的标准,但仍不能保证C/S应用程序的顺利进行。命名管道作为一种通信方法,有其独特的优越性,这主要表现在它不完全依赖于某一种协议,而是适用于任何协议——只要能够实现通信
信号
信号很简单,因为除了信号本身不会传递其他数据,信号类似于中断,但它完全由软件创建。一个信号是由进程产生的,并由操作系统传送给另一个进程
同步与互斥
竞争条件
多个进程并发访问和操作同一数据且执行结果与访问的特定顺序有关,称为竞争条件。
竞争条件发生在当多个进程或者线程在读写数据时,其最终的的结果依赖于多个进程的指令执行顺序。
临界区
临界区指的是一个访问共用资源的程序片段,而这些共用资源又无法同时被多个线程访问的特性。当有线程进入临界区段时,其他线程或是进程必须等待
互斥
一个公共资源同一时刻只能被一个进程或线程使用,多个进程或线程不能同时使用公共资源
信号量
信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器
作用:
- 实现对共享资源的互斥访问(包括单个共享资源或多个相同的资源)
- 实现任务之间的行为同步
组成:
- 信号量的计数值和等待该信号量的任务所组成的等待任务表
死锁
线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行
当一些进程被永久地阻止获取互斥锁时就发生了死锁
例如线程A持有lock1且被阻止lock2,线程B持有lock2但被阻止获取lock1,就会出现死锁
存储管理
嵌入式系统静态内存管理
系统在启动前,所有的任务都获得了所需要的所有内存,运行过程中将不会有新的内存请求
在强实时系统中,减少内存分配在时间上可能带来的不确定性。
不需要操作系统进行专门的内存管理操作。
系统使用内存的效率比较低下,只适合于那些强实时,且应用比较简单,任务数量可以静态确定的系统
嵌入式系统动态内存管理
应用通过分配(malloc)与释放(free)操作来使用内存
堆(heap)会带来碎片
垃圾回收
对内存堆进行重新排列,把碎片组织成为大的连续可用内存空间。但垃圾回收的时间长短不确定:不适合于处理实时应用
在实时系统中,避免内存碎片的出现,而不是在出现内存碎片时进行回收
嵌入式实时内核**(以ucosII为例)
实时任务调度
μC/OS_II进行任务调度的思想是 “近似地每时每刻总是让优先级最高的就绪任务处于运行状态” 。为了保证这一点,它在系统或用户任务调用系统函数及执行中断服务程序结束时总是调用调度器,来确定应该运行的任务并运行它 。
μC/OS_II进行任务调度的依据就是任务就绪表
中断与时钟
μC/OS-II系统响应中断的过程为:
系统接收到中断请求后,这时如果CPU处于中断允许状态(即中断是开放的),系统就会中止正在运行的当前任务,而按照中断向量的指向转而去运行中断服务子程序;当中断服务子程序的运行结束后,系统将会根据情况返回到被中止的任务继续运行或者转向运行另一个具有更高优先级别的就绪任务。
时钟节拍是一种特殊的中断
μC/OS-II需要用户提供周期性的信号源,用于实现时间延时和确认超时。节拍率应在10到100hz之间,时钟节拍率越高,系统的额外负荷就越重
时钟节拍的实际频率取决于用户应用程序的精度
同步与通信
管理的核心是事件控制块ECB,同步可以通过开关中断实现。互斥使用信号量。
通信可以使用邮箱和消息队列实现。
存储管理
μC/OS中是实模式存储管理
不划分内核空间和用户空间,整个系统只有一个地 址空间,即物理内存空间,应用程序和内核程序都 能直接对所有的内存单元进行访问
系统中的“任务”,实际上都是线程–––只有运行 上下文和栈是独享的,其他资源都是共享的。
内存布局
代码段(text)、数据段(data)、bss段、堆空间、栈空 间;
静态
动态
μC/OS中的存储管理 μC/OS采用的是固定分区的存储管理方法
μC/OS把连续的大块内存按分区来管理,每个分区 包含有整数个大小相同的块;
在一个系统中可以有多个内存分区,这样,用户的 应用程序就可以从不同的内存分区中得到不同大小 的内存块。但是,特定的内存块在释放时必须重新 放回它以前所属于的内存分区;
采用这样的内存管理算法,动态分配的内存碎片问题就得到了解决。
BSP,BootLoader
嵌入式系统的启动过程
- 上电复位
- 板级初始化
- 引导操作系统
- 操作系统初始化
- 应用程序初始化
- 多任务应用
bsp
特点
- 硬件相连性
BSP必须为操作系统提供操作和控制具体硬件的方法
操作系统相连性
BSP必须为不同的操作系统提供接口
与bios的区别
BIOS主要是负责在电脑开启时检测、初始化系统设备(设置栈指针、中断分配、内存初始化)、装入操作系统并调度操作系统向硬件发出的指令
BSP是和操作系统绑在一起运行在主板上的,尽管BSP的开始部分和BIOS所做的工作类似,可是大部分和BIOS不同,作用也完全不同。
程序员还可以编程修改BSP,在BSP中任意添加一些和系统无关的驱动或程序,甚至可以把上层开发的统统放到BSP中。 而BIOS程序是用户不能更改,编译编程的,只能对参数进行修改设置。更不会包含一些基本的硬件驱动
引导模式
操作系统引导概念
将操作系统装入内存并开始执行的过程
按时间效率和空间效率不同的要求,分为两种模式:
需要BootLoader的引导模式
节省空间,牺牲时间,适用于硬件成本低,运行速度快,但启动速度相对慢
不需要BootLoader的引导模式
时间效率高,系统快速启动,直接在NOR flash或ROM系列非易失性存储介质中运行,但不满足运行速度的要求
BootLoader及其启动过程
- 概念:bootloader是嵌入式系统中的OS启动加载程序
- 启动过程
- 初始化硬件,如设置UART(至少设置一个),检测存储器等
- 设置启动参数,告诉内核硬件的信息,如用哪个启动界面,波特率
- 跳转到操作系统的首地址
- 消亡