-
“嵌入式系统”实际上是“嵌入式计算机系统”的简称。
-
IEEE(国际电气和电子工程师协会)的定义: > 嵌入式系统是“用于控制、监视或者辅助操作机器和设备的装置”(Devices used to control, monitor, or assist the operation of equipment, machinery or plants)。
- 可以看出此定义是从应用上考虑的,嵌入式系统是软件和硬件的综合体,还可以涵盖机电等附属装置。
-
国内普遍被认同的定义: > 嵌入式系统是“以应用为中心,以计算机技术为基础,软硬件可裁减,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统”。 嵌入式系统就是一个具有特定功能或用途的隐藏在某种设备中的计算机软硬件集合体,没有固定的特征形状。
- 嵌入式系统通常是形式多样、面向特定应用的
- 嵌入式系统得到多种类型的处理器和处理器体系结构的支持
- 嵌入式系统通常极其关注成本
- 嵌入式系统有实时性和可靠性的要求
- 嵌入式系统使用的操作系统一般是适应多种处理器、可剪裁、轻量型、实时可靠、可固化的嵌入式操作系统
- 嵌入式系统开发需要专门工具和特殊方法
- 按嵌入式处理器的位数来分类
- 4位 8位 16位 32位 64位
- 按应用来分类
- 信息家电 移动终端 工业控制 汽车电子 通信类
- 按速度分类 + 强实时系统 一般实时系统 弱实时系统
- 按确定性来分类 + 硬实时 软实时系统
- 按嵌入式系统软件复杂程度来分类
- 循环轮询系统 有限状态机系统 前后台系统 单处理器多任务系统 多处理器多任务系统
- 信息家电 移动终端 工业控制 汽车电子 通信类
- 嵌入式系统一般由嵌入式硬件和软件组成。
- 硬件以微处理器为核心集成存储器和系统专用的输入/输出设备
- 软件包括:初始化代码及驱动、嵌入式操作系统和应用程序等,这些软件有机地结合在一起,形成系统特定的一体化软件。
- 系统定义(需求分析)
- 软硬件划分
- 结构规划 – 处理器类型, 软硬件之间的接口类型, 等.
- 划分目的 – 满足系统速度,延迟, 体积,成本等方面的要求.
- 划分策略 - high level partitioning by hand, automated partitioning using various techniques, etc.
- 调度
- Operation scheduling in hardware
- Instruction scheduling in compilers
- Process scheduling in operating systems
- 软硬件设计过程中的建模
- 软硬件协同的设计方式
- 需要用什么样的系统结构来实现
- 如何满足系统接口要求,嵌入式应用直接和系统接口输入输出信息
- 如何满足时限要求,如何处理多项功能在时间上的协调一致关系
- 如何保证系统可靠地工作
- 如何降低系统的功耗
- 如何使系统可升级
- 需求分析
- 总体设计
- 软硬件开发
- 系统集成
- 是否满足需求
- 速度、灵活性以及开销
- 通常由软件实现的部分
- 操作系统功能
- 任务调度
- 资源管理
- 设备驱动
- 协议栈
- TCP/IP
- 应⽤用软件框架
- 除基本系统、物理接⼝口、基本逻辑电路,许多由硬件实现的功能都可以由软件实现。
- 操作系统功能
- 双重
- 算法
- 数学运算
- 嵌入式系统的硬件是以嵌入式微处理器为核心,主要由嵌入式微处理器、总线、存储器、输入/输出接口和设备组成。
- 嵌入式微处理器
- 总线
- 存储器
- 输入/输出接口和设备
###嵌入式微处理器体系结构
- 冯诺伊曼结构
- 内存包含数据和指令
- CPU通过内存获取指令
- CPU寄存器包括PC 指令寄存器 通用寄存器等
- 哈佛结构
- 程序指令储存和数据储存分开
- 数据和指令的储存可以同时进行
- 精简指令集系统 RISC(Reduced Instruction Set Computer)
- 复杂指令集系统 CISC(Complex Instruction Set Computer)
- 对比 |比较点|CISC|RISC| |:---:|:---:|:---:| |价格|由硬件完成部分软件功能,硬件复杂性增加,芯片成本高|有软件完成部分硬件功能,软件复杂性增加,芯片成本低| |性能|减少代码尺寸,增加指令的执行周期数|使用流水线降低指令的执行周期数,增加代码尺寸| |指令集|大量的混杂指令集,有简单快速的指令,也有复杂多周期指令,符合HLL|简单的但周期指令,在汇编指令方面有相应的CISC微代码指令| |高级语言支持|硬件完成|软件完成| |寻址模式|复杂的寻址模式,支持内存到内存寻址|简单的寻址模式,仅允许LOAD和STORE指令存取内存,其它所有的操作都基于寄存器到寄存器| |控制单元|微码|直接执行| |寄存器数目|寄存器较少|寄存器较多|
- 程序执行时多条指令重叠进行操作
- 分类:
- 3-stage:获取指令 解析指令 执行指令
- 5-stage:数据和指令分开 减少时钟周期
- 6-stage
- 小端(默认):byte3 byte2 byte1 byte0
- 大端:byte0 byte1 byte2 byte3
-
工作状态
- ARM状态:32位,执行字对准的ARM指令。
- Thumb状态:16位,执行半字对准的Thumb指令。
ARM微处理器在开始执行代码时,应该处于ARM状态。 进入Thumb状态:当操作数寄存器的状态位(位0)为1时,可以采用执行BX指令的方法,使微处理器从ARM状态切换到Thumb状态。此外,当处理器处于Thumb状态时发生异常(如IRQ、FIQ、Undef、Abort、SWI等),则异常处理返回时,自动切换到Thumb状态。 进入ARM状态:当操作数寄存器的状态位为0时,执行BX指令时可以使微处理器从Thumb状态切换到ARM状态。此外,在处理器进行异常处理时,把PC指针放入异常模式链接寄存器中,并从异常向量地址开始执行程序,也可以使处理器切换到ARM状态。
-
运行模式
- 用户模式 User:ARM微处理器正常的程序执行状态
- 特权模式 Privileged
- 系统 System:运行特权操作系统任务
- 快速中断模式 FIQ:用于高速数据传输或通道处理,比IRQ可以使用的寄存器更多
- 中断模式 IRQ:用于通用的中断处理
- 数据访问中止 Abort:当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护
- 未定义 Undefined:支持硬件协处理器的软件仿真
- 管理 Supervisor:操作系统使用的保护模式
-
寄存器结构
- 37个寄存器(32位)
- 1个 PC
- 1个 Current Program Status Register (CPSR) 程序状态寄存器
- 5个 Saved Program Status Register (SPSR) 备份程序状态寄存器
- 30个通用寄存器
- 所有程序可以访问
- R0 - R12
- R13:栈指针
- R14:保存返回地址
- R15:PC 程序计数器
- 当前程序的状态寄存器
- 特权模式(除了System)可以访问备份程序状态寄存器
- PSR具体PPT
- Condition Codes
- PPT Examples
- 37个寄存器(32位)
-
中断和异常 +
- 寄存器
- 芯片内高速缓存
- 芯片外高速缓存
- 主存
- 外部存储器
- 远程存储
- Flash是ROM的一个分类
- Electrically erasable, must be block erased.
- Random access, but write/erase is much slower than read.
- NOR flash is more flexible.
- NAND flash is more dense.
-
Non-volatile memory.
- Flash can be programmed in-circuit.
-
Random access for read.
-
To write:
- Erase a block to 1.
- Write bits to 0.
-
Types:
- NOR:
- Word-accessible read.
- Erase by blocks.
- NAND:
- Read by pages (512-4K bytes).
- Erase by blocks.
- NAND is cheaper, has faster erase, sequential access times.
- NOR:
- Dynamic RAM 动态随机存取存储器
- 只能保留很短的时间
- SDRAM 同步
- Static RAM 静态随机存取存储器
- CPU - Cache Controller - Cache - Memory
- Hit and miss
- PPT
- 嵌入式系统的总线一般集成在嵌入式微处理器中。
- 从微处理器的角度来看,总线可分为片外总线(如:PCI、ISA等)和片内总线(如:AMBA、 AVALON、OCP、WISHBONE等)。
- 选择总线和选择嵌入式微处理器密切相关,总线的种类随不同的微处理器的结构而不同。
???
-
Busy/wait is very inefficient.
- CPU can’t do other work while testing device.
- Hard to do simultaneous I/O.
-
Interrupts allow a device to change the flow of control in the CPU.
-
Causes subroutine call to handle device.
-
peek读 & poke写
// 忙等IO #define OUT_CHAR 0x1000 #define OUT_STATUS 0x1001 Char *mystring = “hello,world.”; Char *current_char; Current_char = mystring; While(*current_char !=’\0’){ Poke(OUT_CHAR, *current_char); While(peek(OUT_STATUS)!=0); Current_char++; } // 中断IO Main(){ While(TRUE){ If(gotchar){ Poke(OUT_DATA,achar); Poke(OUT_STATUS,1) Gotchar=FALSE; } } } Void input_handler(){ Achar = peek(IN_DATA); Gotchar = TRUE; Poke(IN_STATUS,0); }
Ref: 嵌入式计算系统设计原理。
- 轮询(Round-Robin)
- 有限状态机
- 系统软件
- 支撑软件
- 应用软件
- 驱动层
- 板级初始化程序
- 与系统软件相关的驱动
- 与应用软件相关的驱动
- 与应用软件相关的驱动不一定需要与操作系统连接,这些驱动的设计和开发由应用决定
- 操作系统层
- 操作系统层包括嵌入式内核、嵌入式TCP/IP网络系统、嵌入式文件系统、嵌入式GUI系统和电源管理等部分。
- 其中嵌入式内核是基础和必备的部分,其他部分要根据嵌入式系统的需要来确定。
- 中间件层
- 目前在一些复杂的嵌入式系统中也开始采用中间件技术,主要包括嵌入式CORBA、嵌入式Java、嵌入式DCOM和面向应用领域的中间件软件。
- 如基于嵌入式CORBA的应用于软件无线电台的应用中间件SCA(Software Core Architecture)等。
- 应用层
- 应用层软件主要由多个相对独立的应用任务组成
- 每个应用任务完成特定的工作,如I/O任务、计算的任务、通信任务等,由操作系统调度各个任务的运行。
- 哪些正确性不仅取决于计算的逻辑结果,也取决于产生结果所花费的时间的系统”。
- POSIX 1003.b作了这样的定义:指系统能够在限定的响应时间内提供所需水平的服务。
- 能够保证在一定时间限制内完成特定功能的操作系统
- 高精度及时系统
- 多级中断机制
- 实时调度机制
- 可靠性
- 可预测性
- 性能好
- 可压缩
- 可扩展性
-
任务调度机制
-
内存管理
-
最小内存开销
-
最大中断禁止时间
-
任务切换时间
-
市场进入时间
-
可移植性
-
可扩展性
-
响应时间
-
可利用资源
-
定制能力
-
成本
- µC/OS-II
- 嵌入式µCLinux
- RTLinux
- Windows CE
- VxWorks
- Nucleus
- Symbian
- RMS(Rate Monotonic Scheduling) 单调速率调度
- 任务按照单调速率优先级分配
- 具有小的执行周期的任务有高优先级
- 可抢占
- 优点:静态 最优调度算法 开销小 灵活性好
- 缺点:利用率低
- EDF(Earliest Deadline First) 最早截止时间优先调度
- 一种最优的动态调度算法
- 任务优先级按照任务截止时间动态改变
- 缺点:瞬时过载时系统行为不可测 一个任务丢失导致一连串丢失
- ucOS-II任务调度
- LDF
- EDF*
见下
- 把在宿主机上编写的高级语言程序编译成可以运行在目标机上的代码,即在宿主机上能够编译生成另一种CPU(嵌入式微处理器)上的二进制程序。
- 一个任务通常是一个无限循环(返回值类型void)
- ucOS-II可以管理多达64个任务;
- 优先级数值越小,优先级越高
- 系统保留了优先级为0,1,2,3,OS_LOWEST_PRIO-3,OS_LOWEST_PRIO-2,OS_LOWEST_PRIO-1以及OS_LOWEST_PRIO这8个任务
- 内核总是创建一个空闲任务OSTaskIdle()
- 统计任务OSTaskStat()
- 调度方式
- 可抢占实时多任务内核,总是运行优先级最高的一个
- 任务级的调度是由函数OSSched()完成的;
- 中断级的调度是由另一个函数OSIntExt()完成的。
- 根据就绪表确定最高优先级
- 将优先级数分解为高三位和低三位分别确定
- 高优先级有小的优先级号
- 任务就绪表
- 通过OSRdyGrp值确定高3位
- 通过OSRdyTbl[3]的值来确定低3位
- 查表:
- Y = OSUnMapTbl[OSRdyGrp];
- X = OSUnMapTbl[OSRdyTbl[Y]];
- Prio = (Y<<3) + X;
- 调度器在进行调度时,在这个位置还要进行一下判断:究竟是待运行任务是否为当前任务,如果是,则不切换;如果不是才切换,而且还要保存被中止任务的运行环境。
- 中断服务程序ISR
- μC/OS-II系统响应中断的过程为:
- 系统接收到中断请求后,这时如果CPU处于中断允许状态(即中断是开放的),系统就会中止正在运行的当前任务,而按照中断向量的指向转而去运行中断服务子程序;当中断服务子程序的运行结束后,系统将会根据情况返回到被中止的任务继续运行或者转向运行另一个具有更高优先级别的就绪任务。
- 时钟TimeTick
- PPT
- 任务间通信的管理:事件控制块ECB
- 同步与互斥
- 临界区(Critical Sections)
- OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()
- 信号量(Semaphores)
- 临界区(Critical Sections)
- 任务间通信
- 低级通信
- 信号量
- 高级通信
- 共享内存
- 邮箱(Message Mailboxes)
- 消息队列(Message Queues)
- 低级通信
- 同步与互斥
- 实模式存储管理
- 不划分内核和用户空间
- 系统中的“任务”,实际上都是线程
- 内存布局
- 代码段(text)、数据段(data)、bss段(存放未初始化过的数据的)、堆空间、栈空间;
- malloc() & free()
- 改进:分配和释放固定大小的内存块
- 分区的存储管理方法
- 内存控制块MCB
- 上电复位、板级初始化阶段
- 嵌入式系统上电复位后完成板级初始化工作。
- 板级初始化程序具有完全的硬件特性,一般采用汇编语言实现。不同的嵌入式系统,板级初始化时要完成的工作具有一定的特殊性,但以下工作一般是必须完成的:
- CPU中堆栈指针寄存器的初始化。
- BSS段(Block Storage Space表示未被初始化的数据)的初始化。
- CPU芯片级的初始化:中断控制器、内存等的初始化。
- 系统引导/升级阶段
- 根据需要分别进入系统软件引导阶段或系统升级阶段。
- 软件可通过测试通信端口数据或判断特定开关的方式分别进入不同阶段。
- 系统引导阶段
- 系统引导有几种情况:
- 将系统软件从NOR Flash中读取出来加载到RAM中运行:这种方式可以解决成本及Flash速度比RAM慢的问题。软件可压缩存储在Flash中。
- 不需将软件引导到RAM中而是让其直接在NorFlash上运行,进入系统初始化阶段。
- 将软件从外存(如NandFlash、CF卡、MMC等)中读取出来加载到RAM中运行:这种方式的成本更低。
- 系统引导有几种情况:
- 系统升级阶段
- 进入系统升级阶段后系统可通过网络进行远程升级或通过串口进行本地升级。
- 远程升级一般支持TFTP、FTP、HTTP等方式。
- 本地升级可通过Console口使用超级终端或特定的升级软件进行。
- 系统初始化阶段
- 在该阶段进行操作系统等系统软件各功能部分必需的初始化工作,如根据系统配置初始化数据空间、初始化系统所需的接口和外设等。
- 系统初始化阶段需要按特定顺序进行,如首先完成内核的初始化,然后完成网络、文件系统等的初始化,最后完成中间件等的初始化工作。
- 应用初始化阶段
- 在该阶段进行应用任务的创建,信号量、消息队列的创建和与应用相关的其它初始化工作。
- 多任务应用运行阶段
- 各种初始化工作完成后,系统进入多任务状态,操作系统按照已确定的算法进行任务的调度,各应用任务分别完成特定的功能
- BSP全称 板级支持包 (Board Support Packages),说的简单一点,就是一段启动代码,和计算机主板的BIOS差不多,但提供的功能区别就相差很大。
- BSP是嵌入式系统的基础部分,也是实现系统论可移植的关键。它负责上电时的硬件初始化、启动RTOS或应用程序模块、提供底层硬件驱动,为上层软件提供访问底层硬件的手段。BSP针对具体的目标板设计,其结构和功能虽目标版的不同呈现较大的差异。
- 硬件相关性
- 因为嵌入式实时系统的硬件环境具有应用相关性,所以,作为高层软件与硬件之间的接口,BSP必须为操作系统提供操作和控制具体硬件的方法。
- 操作系统相关性
- 不同的操作系统具有各自的软件层次结构, 因此,不同的操作系统具有特定的硬件接口形式。
- BIOS主要是负责在电脑开启时检测、初始化系统设备(设置栈指针,中断分配,内存初始化..)、装入操作系统并调度操作系统向硬件发出的指令。
- BSP是和操作系统绑在一起运行,尽管BSP的开始部分和BIOS所做的工作类似,但是 BSP还包含和系统有关的 基本驱动 。
- BIOS程序是用户不能更改,编译编程的,只能对参数进行修改设置。但是程序员还可以编程修改BSP,在BSP中任意添加一些和系统无关的驱动或程序,甚至可以把上层开发的统统放到BSP中 。
- 将操作系统装入内存并开始执行的过程。
- 需要BootLoader的引导模式:节省空间,牺牲时间,适用于硬件成本低,运行速度快,但启动速度相对慢
- 不需要BootLoader的引导模式:时间效率高,系统快速启动,直接在NOR flash或ROM系列非易失性存储介质中运行,但不满足运行速度的要求
- 嵌入式系统中的 OS 启动加载程序。
- BootLoader是在操作系统内核运行之前执行的一段小程序,它将操作系统内核从外部存储设备拷贝到内存中,并跳转到内核的首条指令。
- BootLoader 的 stage1 通常包括以下步骤
- 硬件设备初始化
- 为加载 BootLoader 的 stage2 准备 RAM 空间
- 拷贝 BootLoader 的 stage2 到 RAM 空间中
- 设置好堆栈
- 跳转到 stage2 的 C入口点
- BootLoader 的 stage2 通常包括以下步骤
- 初始化本阶段要使用到的硬件设备
- 检测系统内存映射(memory map)
- 将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中
- 为内核设置启动参数
- 调用内核
有限状态机及其应用。 微波炉
- 进程、线程、任务的概念
- 任务的实现(任务的层次结构、任务控制块、任务的状态及状态转换、任务队列)
- 任务调度(可抢占调度、不可抢占调度、先来先服务、时间片轮转算法、优先级算法)
- 任务间通信(共享内存、消息、管道、信号)
- 同步与互斥(竞争条件、临界区、互斥、信号量、死锁)
- 编辑器、编译器、链接器、调试器、模拟器
- 常用嵌入式开发工具
- 集成开发环境
- 开发辅助工具
- 嵌入式软件开发 Ref: 嵌入式系统导论-CPS方法。
- 嵌入式计算系统设计原理。
- 嵌入式软件开发基础知识
- 嵌入式程序设计语言
- 汇编、编译、解释系统的基础知识和基本工作原理
- 汇编语言
- 各类程序设计语言的主要特点和适用情况
- 嵌入式软件开发环境