嵌入式系统概论
2023-08-09 14:53:19 # NJU # 嵌入式系统概论

1 嵌入式系统概述

1.1 定义

1.1.1 IEEE 的定义

嵌入式系统是用于控制、监视或者辅助操作机器和设备的装置。

Devices used to control, monitor, or assist the operation of equipment, machinery or plants.

此定义是从应用上考虑的,嵌入式系统是软件和硬件的综合体,还可以涵盖机电等附属装置。

1.1.2 国内的定义

嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁减,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统

嵌入式系统就是一个具有特定功能或用途的隐藏在某种设备中的计算机软硬件集合体,没有固定的特征形状。

1.1.3 嵌入式系统三要素

嵌入性:嵌入到对象体系中,有对象环境要求

专用性:软、硬件按对象要求设计、裁剪

计算机:实现对象的智能化功能

1.1.4 其他的定义

嵌⼊封闭产品中的信息处理系统。

看不见的计算机,一般不能被用户编程, 它有一些专用的 I/O 设备, 对用户的接口是应用专用的。

An embedded system is a computer system contained within some larger device or product with the intent purpose of providing monitoring and control services to that device.

嵌入式系统是包含在某些较大的设备或产品中的计算机系统,其目的是为该设备提供监视和控制服务。

Any sort of device which includes a programmable computer but itself is not intended to be a general-purpose computer.

包括可编程计算机在内但本身不打算用作通用计算机的任何设备。

包含有计算机,但又不是通用计算机的计算机应用系统。

1.2 特点

  • 嵌入式系统通常是形式多样、面向特定应用
  • 嵌入式系统得到多种类型的处理器和处理器体系结构的支持
  • 嵌入式系统通常极其关注成本
  • 嵌入式系统有实时性和可靠性的要求
  • 嵌入式系统使用的操作系统一般是适应多种处理器、可剪裁、轻量型、实时可靠、可固化的嵌入式操作系统
  • 嵌入式系统开发需要专门工具和特殊方法

1.3 分类

1.3.1 按嵌入式处理器的位数来分类

  • 4 位嵌入式系统:大量应用

  • 8 位嵌入式系统:大量应用

  • 16 位嵌入式系统:大量应用
  • 32 位嵌入式系统:正成为主流发展趋势
  • 64 位嵌入式系统:高度复杂的、高速的嵌入式系统已经开始采用

1.3.2 按应用来分类

image-20221030163439013

1.3.3 按速度分类

  • 强实时系统,其系统响应时间在毫秒或微秒级。
  • ⼀般实时系统,其系统响应时间在几秒的数量级上,其实时性的要求比强实时系统要差⼀些。
  • 弱实时系统,其系统响应时间约为数十秒或更长。这种系统的响应时间可能随系统负载的轻重⽽变化

1.3.4 按确定性来分类

根据确定性的强弱,可将嵌入式系统分为硬实时、软实时系统:

  • 硬实时:系统对系统响应时间有严格的要求,如果系统响应时间不能满⾜,就要引起系统崩溃或致命的错误。

  • 软实时:系统对系统响应时间有要求,但是如果系统响应时间不能满⾜,不会导致系统出现致命的错误或崩溃。

1.3.5 按嵌入式系统软件复杂程度来分类

  • 循环轮询系统
  • 有限状态机系统
  • 前后台系统
  • 单处理器多任务系统
  • 多处理器多任务系统

1.4 典型应用

无线感知网络、CPS、IOT

  1. 工控设备
  2. 军用电子设备
  3. 航天/航空
  4. 汽车电子
  5. 信息家电
  6. 通信
  7. 智能玩具
  8. 可穿戴

2 嵌入式系统、IOT、CPS的基本组成

2.1 嵌入式系统的组成

嵌入式系统一般由嵌入式硬件和软件组成

  • 硬件以微处理器为核心集成存储器和系统专用的输入/输出设备

  • 软件包括:初始化代码及驱动、嵌入式操作系统和应用程序等,这些软件有机地结合在一起,形成系统特定的一体化软件。

image-20221030164145573

2.2 IOT的组成

物联网(IoT)是物理设备、车辆(也称为“连接设备”和“智能设备”)、建筑物和其他嵌入电子设备、软件、传感器、执行器和网络连接的项目的互联网络,使这些对象能够收集和交换数据。

2.3 CPS的组成

网络物理系统(CPS,Cyber-physical System)是一种由基于计算机的算法控制或监视的机制,与互联网及其用户紧密集成。

是计算进程与物理进程的集成

  • 更多地强调嵌⼊式系统与物理学的深度结合

  • CPS=ES+Physics

⼈机物融合系统

深度融合了各类信息技术:传感器、嵌入式计算、云计算、网络通信、软件,使得各种信息化能⼒(3C:计算-Computer、通信-Communication和控制-Control)⾼度协同和⾃治,实现⽣产应⽤系统⾃主、智能、动态、系统化地监视并改变物理世界的性状。

3 嵌入式系统设计

3.1 嵌入式系统面临挑战

  • 需要多少硬件?
  • 如何满⾜时限要求,如何处理多项功能在时间上的协调⼀致关系?
  • 如何降低系统的功耗?
  • 如何设计以保证系统可升级?
  • 如何保证系统可靠地⼯作?

3.2 传统开发过程

传统软硬件设计过程的基本特征:

  • 系统在一开始就被划分为软件和硬件两大部分

  • 软件和硬件独立进行行开发设计

  • 经常采用“硬件优先”的方法

隐含的一些问题:

  • 软硬件之间的交互受到很大限制:凭经验划分软硬件、软硬件之间的相互性能影响很难评估

  • 系统集成相对滞后,NRE 较大,越后期发现的问题可能会导致越严重的开销

因此:设计质量差、设计修改代价高、研制周期不能有保障

3.3 软硬件协同设计 -

  • 硬件/软件协同设计是指一种专用系统的设计,该系统由几个专用 IC 组成,这些 IC 与通用处理器上的软件过程配合使用(1994 年)

  • 硬件/软件协同设计意味着通过并发设计来利用硬件和软件的协同作用,从而达到系统级目标(1997 年)

  • 硬件/软件协同设计试图通过提供可以告诉设计人员系统是否满足其性能,功耗和尺寸目标的分析方法以及可以使设计人员快速评估许多潜在设计方法的综合方法,来提高嵌入式系统设计的可预测性(2003 年)

  • 它从新兴学科(90 年代初)发展为主流技术(今天)

3.4 软硬件划分

  • 嵌⼊式系统的设计涉及硬件与软件部件,设计中必须决定什么功能由硬件实现,什么功能由软件实现。

  • 硬件和软件具有双重性

  • 软硬件变动对系统的决策造成影响
  • 划分和选择需要考虑多种因素
  • 硬件和软件的双重性是划分决策的前提

3.4.1 通常由软件实现的部分

  • 操作系统功能:任务调度、资源管理、设备驱动
  • 协议栈:TCP/IP
  • 应用软件框架
  • 除基本系统、物理理接口、基本逻辑电路,许多由硬件实现的功能都可以由软件实现

3.4.2 双重性部分

  • 算法:加密/解密、编码/解码、压缩/解压。
  • 数学运算:浮点运算、FFT。

3.4.3 软硬件技术对系统结构的影响

硬软件设计的趋势:融合、渗透

  • 硬件设计的软件化:VHDL、Verilog、HANDL-C

  • 软件实现的硬件化:各种算法的 ASIC

对系统设计的影响:协同设计

  • 增加灵活性
  • 增加了风险

4 嵌入式硬件系统基础

4.1 嵌入式微处理器基础

4.1.1 冯诺伊曼结构与哈佛结构

冯诺依曼结构

  1. 存储器保存数据、指令。
  2. 中央处理器(CPU)从内存中获取指令:分离的 CPU 和内存区分可编程计算机。
  3. CPU 寄存器可提供帮助:程序计数器(PC),指令寄存器(IR),通用寄存器等。
  4. 嵌入式中两个版本的 CPU 都有

哈佛结构

  1. Harvard 不能使用自我修改的代码。
  2. Harvard 允许同时进行两次内存提取。
  3. 大多数 DSP(数据信号处理,Digital Signal Process)使用 Harvard 架构来传输数据:
    • 更大的内存带宽
    • 更可预测的带宽

4.1.2 CISC与RISC

  • Complex instruction set computer (CISC): 复杂指令集计算机

    • 多种寻址模式、多种操作
  • Reduced instruction set computer (RISC): 精简指令集计算机

    • 加载/存储、可传递指令

image-20221030173243340

4.1.3 流水线技术

4.1.4 分类

  • 嵌入式微处理器种类繁多,按位数可分为4位、8位、16位、32位和64位。

  • 根据功能不同,嵌入式微处理器分为四种:

    1. 嵌入式微处理单元(MPU)
    2. 嵌入式微控制器(MCU)
    3. 嵌入式DSP处理器
    4. 嵌入式SoC

4.1.5 选型

选择微控制器的标准

如何选择一个适合的微服务控制器?
嵌入式系统都是实时系统,需要考虑效率

  1. 有效且经济地满足任务的计算需求

    • 速度,ROM和RAM的数量,I/O端口和计时器的数量,大小,包装,功耗

    • 容易升级

    • 单位成本

  2. 软件开发工具的可用性:

    • 汇编器,调试器,C编译器,仿真器,模拟器,技术支持(开源框架可能没有多少人维护)
  3. 微控制器的广泛可用性和可靠来源。

选择微控制器的 10 个步骤
  1. 列出所需的硬件接口(保证物理上,设备可以连接到微处理器上)
  2. 检查软件架构
  3. 选择架构
  4. 确定内存需求
  5. 开始寻找微控制器
  6. 检查成本和功率约束
  7. 检查零件可用性
  8. 选择开发套件
  9. 研究编译器和工具
  10. 开始实验

4.2 嵌入式系统的存储体系

4.2.1 存储器系统:存储器系统的层次结构

  1. 平面单空间(Flat single-space)
  2. 分段式(Segmented)
  3. 组切换(Bank-switched)
  4. 多空间存储区(Multiple-space)
  5. 虚拟内存(Virtual)
平面单空间内存 分段内存
image-20221031153610637
组切换内存 多空间内存
image-20221031153636127 image-20221031153652256

4.2.2 ROM的种类与选型

ROM 可以在工厂编程。

闪存(Flash)是现场可编程 ROM 的主要形式。

  • 电可擦除,只能块擦除。
  • 随机访问,但是写入/擦除比读取慢得多。
  • NOR 闪存更加灵活。
  • NAND 闪存更密集。

4.2.3 Flash的种类与选型

  • 非易失性存储器:闪存可以在线(in-circuit)编程。
  • 闪存可以被电擦除和重新编程。
  • 轻便、紧凑、节能且更便宜。

分类:

  • NOR:字可读取,逐块擦除。
  • NAND:按页读取(512-4K字节),逐块擦除。
    • NAND 相对便宜,擦除速度更快,顺序访问时间更短。

4.2.4 RAM的种类与选型

动态RAM(DRAM)密集,需要刷新。

  • 同步 DRAM 是主要类型。
  • SDRAM 使用时钟来提高性能,以流水线方式访问存储器。

静态RAM(SRAM)更快,密度更低,消耗更多功率。

4.2.5 Cache-

  • 并不是严格的内存架构
  • 可能经常被程序员忽略
  • 优化有效使用的关键

4.3 嵌入式系统总线

4.3.1 总线结构,常见的总线及特点

CPU总线

  • 总线允许CPU,内存,设备进行通信:共享的通讯媒体。

  • 总线是:

    • 一组电线

    • 通信协议

微处理器总线

  • 时钟提供同步。

  • 读时R/W为true(读时R/W’为false)。

  • 地址是地址线的位捆绑。

  • 数据是n位数据线束。

  • 当n bit数据就绪时,数据就绪信号发出

image-20221031161002670

系统总线配置

  • 多个总线允许并行处理:

    • 一条总线上的设备慢。

    • 快速设备位于单独的总线上。

  • 桥连接两条总线

image-20221031221056726

ARM AMBA bus

  • 两个类别:

    • AHB是高性能的。

    • APB是低速,低成本的。

  • AHB支持流水线,突发传输,拆分事务,多个总线主控。

  • 所有设备都是APB上的从设备。

image-20221031221519490

4.3.2 输入输出编程:忙等IO和中断IO

peek and poke

1
2
3
4
5
6
int peek(char *location) {
return *location;
}
void poke(char *location, char newval) {
(*location) = newval;
}
4.3.2.1 忙等(busy/wait)输出

对设备进行编程的最简单方法。使用指令测试设备何时准备就绪:

1
2
3
4
5
6
current_char = mystring;
while (*current_char != '\0') {
poke(OUT_CHAR, *current_char);
while (peek(OUT_STATUS) != 0);
current_char++;
}

同步忙等I/O

1
2
3
4
5
6
7
8
9
while (TRUE) {
/* read */
while (peek(IN_STATUS) == 0);
achar = (char)peek(IN_DATA);
/* write */
poke(OUT_DATA,achar);
poke(OUT_STATUS,1);
while (peek(OUT_STATUS) != 0);
}
4.3.2.2 中断I/O

忙等是非常低效的

  • CPU 在测试设备时不能做其他工作。

  • 很难实现同步 I/O

中断允许设备更改 CPU 中的控制流

  • 导致子例程调用以处理设备。

image-20221031230125096

4.3.3 Programming I/O:Independent I/O port. memory-mapped I/O.

通信期间选择控制寄存器或数据缓冲区的三种方法

  1. 独立的 I/O 端口:需要专门的指令来完成。
  2. 内存映射的 I/O。
  3. 混合解决方案(统一编址):混合模型包括内存映射的 I/O 数据缓冲区和用于控制寄存器的单独的 I/O 端口。

英特尔 x86 提供了输入输出说明。大多数其他 CPU 使用内存映射的 I/O。

I/O 指令不排除内存映射的 I/O

image-20221031224207967

4.3.3.1 内存映射的 I/O

优点:

  1. 在内存映射的 I/O 模式下,设备控制寄存器只是内存中的变量,并且可以与其他变量一样用 C 寻址。因此,可以完全用 C 语言编写 I/O 设备驱动程序。
  2. 在这种模式下,不需要特殊的保护机制即可阻止用户进程执行 I/O 操作。

缺点:

  1. 当前大多数嵌入式处理器都支持内存缓存。缓存设备控制寄存器将导致灾难。为了防止这种情况,必须为硬件提供选择性禁用缓存的功能。这将增加嵌入式系统中硬件和软件的复杂性。
  2. 如果只有一个地址空间,则所有内存模块和所有 I/O 设备都必须检查所有内存引用,以便确定要响应的内存引用。这会严重影响系统性能。

ARM 内存映射的 I/O:

  1. 定义设备地址:DEV1 EQU 0x1000
  2. 读写代码:
1
2
3
4
LDR r1, #DEV1 	; set up device adrs
LDR r0, [r1] ; read DEV1
LDR r0, #8 ; set up value to write
STR r0, [r1] ; write value to device

5 嵌入式系统软件知识

5.1嵌入式软件基础知识

5.1.1嵌入式软件的特点

  • 内存:
    • 有限,影响编程语言的选择以及开发工具的使用(比如编译器优化)。
  • CPU 处理能力:
    • 成本和功耗的考虑,ES 不得不采用保守的设计方案,其中的 CPU 往往只是恰好满足要求。
  • 操作系统:
    • OS(Windows/Linux)、RTOS、专有 OS 或裸机
  • 实时行为:
    • 实时系统不一定会运行得很快,但一定是可预测的,通常的术语叫做确定性
    • 实时性的要求对于 OS 的选择和程序设计都有影响
  • 开发流程:
    • ES 往往没有足够的资源进行软件开发。交叉开发对于工具的选择有很大影响。
    • 开发过程也不同,编辑/编译/调试的循环是一样的,但执行程序这一步却非常复杂,需要把代码转移到目标机上或者在某种环境下运行。
  • 执行流程:
    • 多数嵌入式设备从开机开始就会运行某个程序,该程序会一直运行到系统关机。这个程序可能存储在 ROM,也可能是从非易失性存储器转移到 RAM 中执行。
  • 每一个嵌入式设备都是不同的:
    • 可能是技术层面的:不同的 CPU 架构、内存、外设、应用程序和操作系统
    • 也可能是商业运作层面的,比如手机开发、生产的商业模式就和核磁共振扫描仪完全不同。
  • 嵌入式软件工具和组件:
    • 与桌面软件开发一样,嵌入式软件工程师需要运用工具来构建和测试软件。同时,也很可能会引入可重用的软件组件
  • 开发工具:
    • 从表面上看,嵌入式软件的开发过程和桌面软件很像:编译代码模块,然后在调试器的控制下执行。然而,并不这么简单,有着显著的不同。
    • 往往是使用交叉编译器来进行嵌入式软件的开发。
    • 有时候嵌入式应用中会直接包含小部分的汇编代码:出于对性能的考量。
    • 嵌入式链接器除了将多个对象模块和函数库例程整合在一起以外,链接器还负责在内存中正确定位代码和数据。嵌入式系统的内存映射十分复杂,对于精确性的要求也十分严格。链接器必需能够灵活地应对这些要求。
    • 嵌入式调试器并不是一个单一的组件,而是一系列对应不同运行环境的工具。借由在本地或者指令集模拟器中运行代码,代码可以仅在宿主机上运行。调试器也可以和一个目标板相连接(JTAG 或其他方式,如以太网),并执行代码。
    • 其他一些更有针对性的工具,典型的选项包括分析实时性能、代码执行时设备功耗情况的分析器。
  • 软件组件:
    • 最简单和显而易见的可重用的软件组件是库。一些库是由编译器提供的,嵌入式编译器提供的库应当是适合嵌入式环境的:可以重入、可以被存储在 ROM 中。
    • 其他可用的库,特别是针对 C++ 的库,如标准模板库 STL。这些库可能并不适合嵌入式应用,在使用时要多加小心。
    • 与硬件交互是难点之一。在 OS 内部设备驱动提供了这样的接口
    • ES 的互联性不断提高,需要不同的网络支持,TCP/IP 或总线 CAN\I2C,其他网络技术 SNMP、Zigbee、Bluetooth、WiFi 和 USB。最重要的是应该检查有效性,确保符合标准,并能和其他系统互通互联。
    • 嵌入式设备对于有组织的数据存储是有需求的,比如能够应对电源故障和支持多线程。
    • LCD(往往是触摸式的)成本减低让其能够被应用到嵌入式设计中。软件于是迎来了一项挑战:支持复杂的图像和用户界面。

5.1.2嵌入式软件的分类

  • 系统软件

    • 系统软件控制和管理嵌入式系统资源,为嵌入式应用提供支持的各种软件,如设备驱动程序、嵌入式操作系统、嵌入式中间件等。
  • 应用软件

    • 应用软件是嵌入式系统中的上层软件,它定义了嵌入式设备的主要功能和用途,并负责与用户进行交互。应用软件是嵌入式系统功能的体现,如飞行控制软件、手机软件、MP3播放软件、电子地图软件等,一般面向特定的应用领域。
  • 支撑软件

    • 支撑软件是指辅助软件开发的工具软件,如系统分析设计工具、在线仿真工具、交叉编译器、源程序模拟器和配置管理工具等。

5.1.3 嵌入式软件体系结构

  1. 轮询
  2. 有限状态机
  3. 带中断的轮询
  4. 仅有中断
  5. 函数队列调度
  6. 实时操作系统(RTOS)
轮询
1
2
3
4
5
6
7
8
9
10
11
12
13
//Round Robin / Control Loop
//Everything is a function call from the main loop
void main(void) {
while(TRUE) {
if (device_A requires service)
service device_A
if (device_B requires service)
service device_B
if (device_C requires service)
service device_C
... and so on until all devices have been serviced, then start over again
}
}
  1. 优先级: 无,一切按顺序进行。
  2. 响应时间: 所有任务的总和。
  3. 变更的影响: 重大。改变执行任务时间或添加任务会影响所有其他任务。
  4. 简单性: 没有共享数据问题
有限状态机
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
while(1) {
switch(state) {
case IDLE:
check_buttons();
LEDisplay_hex(NUM1);
if (BUTTON1 | BUTTON2 | BUTTON3)
state=SHOW;
break;
case SHOW:
NUM1=0;
if (BUTTON1) NUM1 += 0x0001;
if (BUTTON2) NUM1 += 0x0010;
if (BUTTON3) NUM1 += 0x0100;
state=IDLE;
break;
}
}
  1. 与轮询类似,但只有当前状态被执行.
  2. 每个状态决定下一个状态(非顺序执行)。
  3. 优先级: 每个状态确定下一个状态的优先级。
  4. 响应时间: 所有任务的总和。
  5. 变更的影响: 重大。更改任务的执行时间或添加任务会影响所有其他任务。
  6. 简单性: 没有共享数据问题。
带中断的轮询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
BOOL flag_A = FALSE; /* Flag for device_A follow-up processing */
/* Interrupt Service Routine for high priority device_A */
ISR_A(void) {
... handle urgent requirements for device_A in the ISR,
then set flag for follow-up processing in the main loop ...
flag_A = TRUE;
}
void main(void) {
while(TRUE) {
if (flag_A)
//中断任务优先
flag_A = FALSE
//... do follow-up processing with data from device_A
if (device_B requires service)
service device_B
if (device_C requires service)
service device_C
//... and so on until all high and low priority devices have been serviced
}
}
  1. 优先级-中断优先于主循环:优先中断
  2. 响应时间:所有任务的总和以及中断执行时间
  3. 更改的影响:对于中断服务程序而言意义不大。与轮询作为主循环相同。
  4. 共享数据-必须处理与中断服务程序共享的数据
仅有中断
1
2
3
4
5
SET_VECTOR(P3AD, button_isr);
SET_VECTOR(TIMER1, display_isr);
while(1) {
;
}
  1. 如果ISR过多,可能会有问题
  2. 如果高优先级的中断执行所需的时间比低优先级的中断所需的时间长,那么某些中断将被错过,或者您需要处理嵌套中断。
  3. 优先级-中断优先
  4. 响应时间:中断执行时间
  5. 变化的影响-对于中断服务程序而言意义不大。
  6. 共享数据-必须处理与中断服务程序共享的数据
函数队列调度
  1. 函数指针被添加到队列中。
  2. 主循环在队列中循环并执行任务。
  3. 任务或中断将新任务添加到功能队列中。
  4. 最坏的时机
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#define MAX_TASKS 20
typedef int(*FuncPtr)();
FuncPtr tasks[MAX_TASKS]
int current_task = 0;
void add_task(FuncPtr func) {
int n;
for(n=current_task+1;n<MAX_TASKS-1;n++) {
if(tasks[n]==NULL) {
tasks[n]=func;
return;
}
}
for(n=0;n<current_task;n++) {
if(tasks[n]==NULL) {
tasks[n]=func;
return;
}
}

id display_task() {
LEDisplay_hex(NUM1);
add_task(button_task);
}
void button_task() {
check_buttons();
NUM1=0;
if (BUTTON1) NUM1 += 0x0001;
if (BUTTON2) NUM1 += 0x0010;
if (BUTTON3) NUM1 += 0x0100;
add_task(display_task);
}

main() {
LEDisplay_init();
LEDisplay_clear();
init_buttons();

add_task(button_task);

while(1) {
if(tasks[current_task]==NULL) {
;
}
else {
(*tasks[current_task])();
tasks[current_task]=NULL;
}
current_task++;
if(current_task>=MAX_TASKS) current_task=0;
}
}
  1. 优先级:中断优先。任务按顺序执行
  2. 响应时间:最长任务的执行时间
  3. 变更的影响:低。中断管理优先级功能。队列管理较低的优先级。
  4. 共享数据:必须处理与中断服务程序共享的数据

函数队列优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 添加时间队列
typedef int(*FuncPtr);

typedef struct {
long timer;
int status;
FuncPtr;
} Task;

Task task_list[MAX_TASKS];

// 添加任务优先级
typedef int(*FuncPtr);

typedef struct {
int priority;
FuncPtr;
} Task;

Task task_list[MAX_TASKS];
抢占式多任务或多线程
  1. 在这种类型的系统中,低级代码段基于计时器(连接到中断)在任务或线程之间切换。这是通常认为系统具有”操作系统”内核的级别。根据所需的功能量,它或多或少地引入了管理在概念上并行运行的多个任务的复杂性。
  2. 要访问共享数据,必须通过某种同步策略来控制,例如消息队列,信号量或非阻塞同步方案。
  3. 由于这些复杂性,组织通常使用实时操作系统(RTOS),从而使应用程序程序员可以专注于设备功能而不是操作系统服务。

5.2 嵌入式操作系统基础知识

5.2.1 RTOS概念、特点、选型原则(商业化RTOS)

概念

实时操作系统(Real-time operating system, RTOS)是指面向实时运行对象,并为其服务的操作系统
实时操作系统与一般的操作系统相比,最大的特色就是“实时性”,如果有一个任务需要执行,实时操作系统会马上(在较短时间内)执行该任务,不会有较长的延时。这种特性保证了各个任务的及时执行。

特点
  • 可靠性
  • 可预测性、确定性
  • 性能
  • 紧凑性
  • 可扩展性
选型原则

5.2.2 任务管理

进程、线程、任务的概念

进程是程序的执行

线程则是某一进程中一路单独运行的程序

任务是指由软件完成的一个活动

任务的实现(任务的层次结构、任务控制块、任务的状态及状态转换、任务队列)

image-20221101150649119

image-20221101150737127

任务调度(可抢占调度、不可抢占调度、先来先服务、时间片轮转算法、优先级算法)

抢占式调度

  • 假设所有线程都有优先级
    • 静态分配的(在线程持续时间内恒定)
    • 动态分配的(可能有所不同)
  • 进一步假设内核跟踪”启用”了哪些线程(能够执行,例如在等待信号量或互斥量或时间到期之前不会被阻塞)。
  • 抢占式调度:
    • 在任何时候,具有最高优先级的已启用线程正在执行。
    • 每当任何线程更改优先级或启用状态时,内核都可以分派新线程。
实时系统及任务调度(RMS、EDF算法)

速率单调调度(RMS, Rate Monotonic Scheduling)

  • 假设使用以下命令定期调用n个任务:
    • 周期T1,…,Tn(施加实时约束)
    • 所有任务都是独立的。
    • 最坏情况执行时间(WCET)C1,…,Cn:假定没有互斥请锁、信号量或阻塞的I/O
    • 没有优先级限制
    • 固定优先级
    • 上下文切换所需的时间可以忽略不计
    • 抢占式调度
  • 定理:如果任何优先级分配产生可行的时间表,则按时段排序的优先级(最小时段具有最高优先级)也产生可行的时间表。
  • 就可行性而言,RMS是最佳的
  • 周期越短,优先级越高

EDF,Earliest deadline first(1974)

  1. 通过允许任务随时”到达”(准备就绪)来扩展EDD。
  2. 最早截止时间优先(EDF):给定n个独立任务的集合,它们具有任意的到达时间,任何在任意时刻执行所有到达任务中绝对截止时间最早的任务的算法都是最优的。最大程度地减少延迟
  3. 证明使用类似的互换参数。

截止时间最小优先级最高

RMS和EDF哪个好

  1. RMS优点:调度决策更简单(固定优先级与EDF所需的动态优先级。EDF调度程序必须维护按优先级排序的就绪任务列表。)
  2. EDF优点:
    1. 由于EDF是关于最大延迟的最优,也是关于可行性的最优选择。 RMS仅是关于可行性的最优选择。对于不可行的计划,RMS会完全阻止优先级较低的任务,从而导致无限的最大延迟。
    2. 如果RMS无法做到这一点,那么EDF可以充分利用
    3. EDF实际上减少了抢占,因此减少了上下文切换的开销。
    4. 截止时间可能与周期不同。
任务间通信(共享内存、消息、管道、信号)
同步与互斥(竞争条件、临界区、互斥、信号量、死锁)
  1. 线程访问共享资源时,它们需要使用互斥对象以确保数据完整性。
  2. 互斥体也可能使调度复杂化。

5.2.3存储管理

嵌入式系统静态和动态内存管理

5.3 嵌入式系统程序设计

5.3.1嵌入式软件开发基础知识

5.3.2嵌入式软件开发环境

交叉开发(宿主机、目标机)

编辑器、编译器、链接器、调试器、模拟器

常用嵌入式开发工具

集成开发环境

开发辅助工具

5.3.3嵌入式软件开发

Ref:

嵌入式计算系统设计原理。

嵌入式系统导论-CPS方法。

6 嵌入式实时内核(结合µC/OS-II和freertos)

6.1 实时任务调度

  • μC/OS-II是可抢占实时多任务内核,它总是运⾏就绪任务中优先级最⾼的那⼀个。
  • μC/OS-II中不⽀持时间⽚轮转法,每个任务的优先级要求不⼀样且是唯⼀的,所以任务调度的⼯作就是:查找准备就绪的最⾼优先级的任务并进⾏上下⽂切换。
  • μC/OS-II任务调度所花的时间为常数,与应⽤程序中建⽴的任务数⽆关。
  • 确定哪个任务的优先级最⾼,应该选择哪个任务去运⾏,这部分的⼯作是由调度器(Scheduler)来完成的。
    • 任务级的调度是由函数OSSched()完成的;
    • 中断级的调度是由另⼀个函数OSIntExt()完成的。

FreeRTOS是⼀个实时操作系统,所奉⾏的调度规则:

  • ⾼优先级抢占低优先级任务,系统永远执⾏最⾼优先级的任务。
  • 同等优先级的任务轮转调度。

6.2 中断与时钟

μC/OS-II系统响应中断的过程为:

系统接收到中断请求后,这时如果CPU处于中断允许状态(即中断是开放的),系统就会中止正在运行的当前任务,而按照中断向量的指向转而去运行中断服务子程序;当中断服务子程序的运行结束后,系统将会根据情况返回到被中止的任务继续运行或者转向运行另一个具有更高优先级别的就绪任务。

  1. 时钟节拍是⼀种特殊的中断;
  2. μC/OS需要⽤户提供周期性信号源,⽤于实现时间延时和确认超时。节拍率应在10到100Hz之间,时钟节拍率越⾼,系统的额外负荷就越重;
  3. 时钟节拍的实际频率取决于⽤户应⽤程序的精度。时钟节拍源可以是专门的硬件定时器,或是来⾃50/60Hz交流电源的信号。

6.3 同步与通信

所有的通信信号都被看成是事件(event), μC/OS-II通过事件控制块(ECB)来管理每⼀个具体事件。

同步可以通过开关中断实现。互斥使用信号量。

通信可以使用邮箱和消息队列实现。

6.4 存储管理(静态、动态)

μC/OS采⽤的是固定分区的存储管理⽅法

  • µC/OS把连续的⼤块内存按分区来管理,每个分区 包含有整数个⼤⼩相同的块;
  • 在⼀个系统中可以有多个内存分区,这样,⽤户的应⽤程序就可以从不同的内存分区中得到不同⼤⼩ 的内存块。但是,特定的内存块在释放时必须重新放回它以前所属于的内存分区;
  • 采⽤这样的内存管理算法,上⾯的内存碎⽚问题就得到了解决。

image-20221101160551985

为了便于管理,在µC/OS中使⽤内存控制块MCB(Memory Control Block)来跟踪每⼀个内存分区,系统中的每个内存分区都有它⾃⼰的 MCB。

7 bsp, bootloader

7.1 嵌入式系统的启动过程

image-20221101161059659

7.2 bsp,特点,与bios区别

7.2.1 bsp

BSP全称“板级⽀持包”(Board Support Packages),就是⼀段启动代码,和计算机主板的BIOS差不多,但提供的功能区别就相差很⼤。

7.2.2 特点

硬件相关性

  • 因为嵌⼊式实时系统的硬件环境具有应⽤相关性,所以,作为⾼层软件与硬件之间的接⼝,BSP必须为操作系统提供操作和控制具体硬件的⽅法。

操作系统相关性

  • 不同的操作系统具有各⾃的软件层次结构,因此,不同的操作系统具有特定的硬件接⼝形式

7.2.3 区别

BSP是和操作系统绑在⼀起运⾏,尽管BSP的开始部分和BIOS所做的⼯作类似,但是BSP还包含和系统有关的基本驱动。

BIOS程序是⽤户不能更改,编译编程的,只能对参数进⾏修改设置,但是程序员还可以编程修改BSP,在BSP中任意添加⼀些和系统⽆关的驱动或程序,甚⾄可以把上层开发的统统放到BSP中 。

7.3 引导模式

操作系统引导概念:将操作系统装⼊内存并开始执⾏的过程。

按时间效率和空间效率不同的要求,分为两种模式:

  • 不需要BootLoader的引导模式:时间效率⾼,系统快速启动,直接在NOR flash或ROM系列⾮易失性存储介质中运⾏,但不满⾜运⾏速度的要求。
  • 需要BootLoader的引导模式:节省空间,牺牲时间,适⽤于硬件成本低,运⾏速度快,但启动速度 相对慢

7.4 bootloader及其启动过程

嵌⼊式系统中的 OS 启动加载程序

引导加载程序

  • 包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader两⼤部分
  • 是系统加电后运⾏的第⼀段软件代码

相对于操作系统内核来说,它是⼀个硬件抽象层

BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的 Boot Loader 读到系统的 RAM 中,然后将控制权交给 OS Boot Loader

Boot Loader 的主要运⾏任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的⼊⼝点去运⾏,即开始启动操作系统。

8 建模

有限状态机及其应用。

有限状态机的实现。