嵌入式系统概论期末复习
嵌入式系统概论复习
lecture 1 - 嵌入式系统概述
嵌入式系统的定义
-
“嵌入式系统”实际上是“嵌入式计算机系统”的简称
-
IEEE(国际电气和电子工程师协会)的定义:嵌入式系统是“用于控制、监视或者辅助操作机器和设备的装置” (Devices used to control, monitor, or assist the operation of equipment, machinery or plants)。
该定义是从应用上考虑的,嵌入式系统是软件和硬件的综合体,还可以涵盖机电等附属装置
-
国内普遍被认同的定义:嵌入式系统是“以应用为中心,以计算机技术为基础,软硬件可裁减,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统”。
嵌入式系统就是一个具有特定功能或用途的隐藏在某种设备中的计算机软硬件集合体,没有固定的特征形状。
嵌入式系统三要素
- 嵌入性:嵌入到对象体系中,有对象环境要求
- 专用型:软、硬件按对象要求设计、裁减
- 计算机:实现对象的智能化功能
无处不在的嵌入式
CPS
信息物理系统,Cyber-Physical System (CPS),计算进程和物理进程的统一体,集计算、通信、控制于一体的下一代智能系统,由嵌入式系统、互联网和控制器组成
WSN
无线感知网络,Wireless sensor network(WSN),是由许多在空间中分布的自动装置组成的一种无线通信计算机网络,这些装置使用传感器协作地监控不同位置的物理或环境状况(比如温度、声音、振动、压力、运动或污染物)。无线传感器网络的发展最初起源于战场监测等军事应用。而现今无线传感器网络被应用于很多民用领域,如环境与生态监测、健康监护、家居自动化以及交通控制等。
IOT
物联网,Internet of Things (IoT) ,通过射频识别(RFID)、红外感应器、全球定位系统、激光扫描器等信息传感设备,按约定的协议,把任何物品与互联网相连接,进行信息交换和通信,以实现智能化识别、定位、跟踪、监控和管理的一种网络概念
- 实现任何时间、任何地点,人、机、物的互联互通
- 互联、协同
- 面向生产的物联网技术开发被称为“工业4.0”
嵌入式系统组成
- 嵌⼊式系统⼀般由嵌⼊式硬件和软件组成
- 硬件以微处理器为核⼼集成存储器和系统专⽤的输⼊/输出设备
- 软件包括:初始化代码及驱动、嵌⼊式操作系统和应⽤程序等,这些软件有机地结合在⼀起,形成系统特定的⼀体化软件
- 从上至下依次为:应用软件 - 中间件 - 运行/实时内核 - 驱动 - 系统硬件
与通用计算机的区别
嵌入式系统的特点
-
嵌入式系统通常是形式多样、面向特定应用的
- 一般用于特定的任务
- 通常都具有低功耗、体积小、集成度高等特点
- 应用程序和操作系统两种软件的一体化程序
-
嵌入式系统得到多种类型的处理器和处理器体系结构的支持
- 可采用多种类型的处理器和处理器体系结构
-
嵌入式系统通常极其关注成本
- 一次性的开发成本NRE(Non-Recurring Engineering)成本
- 产品成本:硬件BOM、外壳包装和软件版税等
- 批量产品的总体成本=NRE成本+每个产品成本*产品总量
- 每个产品的最后成本=总体成本/产品总量=NRE成本/产品总量+每个产品成本
-
嵌入式系统有实时性和可靠性的要求
- 大多数实时系统都是嵌入式系统,嵌入式系统多数有实时性的要求
- 一般要求具有出错处理和自动复位功能
-
嵌入式系统使用的操作系统一般是适应多种处理器、可剪裁、轻量型、实时可靠、可固化的嵌入式操作系统
- 嵌入式操作系统规模小
-
嵌入式系统开发需要专门工具和特殊方法
- 开发环境包括专门的开发工具(包括设计、编译、调试、测试等工具),采用交叉开发的方式进行
嵌入式系统分类
-
按嵌入式处理器的位数来分类
- 4,8位已经大量应用
- 16位
- 32位成为主流
- 64位⾼度复杂的、⾼速的嵌⼊式系统已开始采⽤
-
按应用来分类
- 移动互联网、可穿戴设备、生物仿真、环境工程、信息通讯、智能农业、智慧交通等。
-
按速度分类
- 强实时系统, 其系统响应时间在毫秒或微秒级;
- ⼀般实时系统, 其系统响应时间在⼏秒的数量级上,其实时性的要求⽐强实时系统要差⼀些;
- 弱实时系统, 其系统响应时间约为数⼗秒或更⻓。这种系统的响应时间可能随系统负载的轻重⽽变化。
-
按确定性来分类
- 硬实时系统:系统对系统响应时间有严格的要求,如果系统响应时间不能满⾜,就要引起系统崩溃或致命的错误。
- 软实时系统:系统对系统响应时间有要求,但是如果系统响应时间不能满⾜,不会导致系统出现致命的错误或崩溃。
-
按嵌入式系统软件复杂程度来分类
- 循环轮询系统、有限状态机系统、前后台系统、单处理器多任务系统、多处理器多任务系统。
lecture 2 - 嵌⼊式系统设计⽅法
嵌入式系统设计所面临的挑战
- 需要多少硬件?
- 如何满足时限需求,如何处理多项功能在时间上的协同关系?
- 如何降低系统的功耗?
- 如何设计以保证系统可升级?
- 如何保证系统可靠地工作?
传统的嵌入式开发过程
1.系统在一开始就被划分为软件和硬件两大部分
2.软件和硬件独立进行开发设计
3.经常采用“硬件优先”方法
问题:
1.软硬件之间的交互受到很大限制:凭经验划分软硬件,软硬件之间的相互性能影响很难评估。
2.系统集成滞后,一次性工程费用过高。
3.设计质量差、设计修改难、研制周期不能得到保障。
软硬件协同设计 HW/SW Co-design
1.软硬件协同设计是指对系统中的软硬件部分使用统一的描述和工具进行集成开发,可完成全系统的设计验证并跨越软硬件界面进行系统优化。
2.软硬件协同设计可以通过协同作用来实现系统级目标
3.软硬件协同设计提供分析方法和综合方法提高嵌入式系统设计的可预测性,在告诉设计者性能是否满足的同时,让设计者评估潜在的设计方法。
4.已成为主流技术。
软硬件划分(影响软硬件折衷方案——双重性、速度、灵活性、开销,双重性为前提)
1.设计中必须决定什么功能由硬件实现,什么功能由软件实现。
2.硬件和软件具有双重性,是划分决策的前提。
3.软硬件变动对系统的决策造成影响。
通常由软件实现的部分:操作系统功能(任务调度、资源管理、设备驱动);协议栈(TCP/IP);应用软件框架。
通常由硬件实现的部分:基本系统,物理接口,基本逻辑电路。
双重部分:算法(加密解密、编码解码、压缩解压);数学运算(浮点运算、FFT)。
软硬件技术对系统结构的影响:硬软件的设计呈现融合渗透的趋势;系统设计更加趋于协同设计,在增加灵活性的同时增加了风险。
lecture 3 - 嵌⼊式微处理器
硬件平台包含CPU,总线bus,存储器memory,I/O设备等
流行的微处理器:ARM,MIPS,X86
冯诺依曼结构
- 将程序指令存储器和数据存储器和并在一起的存储器结构
- 程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同
- CPU寄存器: 程序计数器(PC),指令寄存器(IR),通用寄存器等
哈佛结构
特点:
- 使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存;
- 使用独立的两条总线,分别作为CPU与每个存储器之间的专用通信路径,而这两条总线之间毫无关联
应用:
大多数DSP使用哈佛架构来处理流数据
- 更大的内存带宽
- 更可预测的带宽
改进的哈佛结构:
- 使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存;
- 具有一条独立的地址总线和一条独立的数据总线,利用公用地址总线访问两个存储模块(程序存储模块和数据存储模块),公用数据总线则被用来完成程序存储模块或数据存储模块与CPU之间的数据传输;
- 两条总线由程序存储器和数据存储器分时共用。
RISC VS CISC
RISC:精简指令集计算机
- load/store
- 流水线指令
CISC:复杂指令计算机
- 多种寻址模式
RISC-V
- 简单,完全开源且免费
- 将基准指令和扩展指令分开,可以通过扩展指令做定制化的模块和扩展(基准指令确定后将不会再有变化,这是RISC-V稳定性的重要保障)
- 32,64,128位指令集
嵌入式微处理器的分类
- 位数
- 4,8,26,32,64位
- 功能
- 嵌入式微处理单元(MPU)
- 嵌入式微处理器就是和通用计算机的处理器对应的CPU
- 功能和微处理器基本一样,是具有32位以上的处理器,具有较高的性能
- 具有体积小,功耗少,成本低,可靠性高的特点.
- 有的可提供工业级应用
- 流行的嵌入式微处理器:ARM,MIPS
- 嵌入式微处理器就是和通用计算机的处理器对应的CPU
- 嵌入式微控制器(MCU)
- 嵌入式微控制器就是将整个计算机系统的主要硬件集成到一块芯片中,芯片内部集成ROM/EPROM, RAM, 总线, 总线逻辑, 定时/计数器, Watchdog, I/O, 串行口等各种必要功能和外设.
- 特点
- 一个系列的微控制器具有多种衍生产品
- 单片化,体积大大减小,功耗和成本降低,可靠性提高;
- 是目前嵌入式工业的主流,约占嵌入式系统50%的份额;
- 多是8位和16位处理器
- 流行的MCU:通用系列(8051,MC683xx,Cortex-M0/3/4/7),本通用系列(I2C,CAN BUS等)
- 嵌入式DSP处理器
- 嵌入式DSP是专门用于信号处理方面的处理器,其在系统结构和指令算法方面进行了特殊设计,具有很高的编译效率和指令执行速度。
- 应用:数字滤波,频谱分析,FFT
- 流行的DSP:德州仪器(T1),模拟器件公司(ADI),摩托罗拉公司
- 嵌入式SoC
- 嵌入式SoC是追求产品系统最大包容的集成器件。绝大多数系统构件都在一个系统芯片内部
- SoC芯片可以有效地降低电子/信息系统产品的开发成本,缩短开发周期,提高产品的竞争力
- 特点:
- 结构简洁
- 体积小、功耗小
- 可靠性高
- 设计生产效率高
- 流行的SoC:高通骁龙,海思
- 嵌入式微处理单元(MPU)
FPGA
FPGA 是一种以数字电路为主的集成芯片
现场可编程门阵列,具有可编程特性的的集成电路
DSP与FPGA
嵌入式微处理器的特点
基础:通用处理器
与通用微处理器的区别:
- 体积小、重量轻、可靠性高
- 功耗低
- 成本低:片上存储、引脚与封装、代码密度
- 工作温度、抗电磁干扰、可靠性等方面增强
ARM架构
-
典型的RISC结构
-
丰富的寄存器
-
加载/存储体系结构
-
简单寻址模式
-
统一和固定长度的指令字段
-
-
增强功能
-
每条指令控制ALU和移位器
-
自动递增和自动递减寻址模式
-
多个加载/存储
-
条件执行
-
-
结果
-
高性能
-
低代码大小
-
低功耗
-
低硅面积
-
选择微处理器的原则
- 高效、经济地满足任务的计算需求
- 速度,ROM和RAM的数量,I/O端口和定时器的数量,尺寸,封装,功耗
- 易于升级
- 单位成本
- 软件开发工具的可用性
- 汇编器,调试器,C编译器,仿真器,模拟器,技术支持
- 广泛的可用性和可靠的微控制器来源
选择微处理器的十个步骤
列出硬件接口、检查软件架构、选择体系结构、确定内存需求、搜索微控制器、检查成本和功率约束、检查零件可用性、选择一个开发包、研究编译器和工具、开始实验
lecture 4 - 存储器架构
对许多应用来说,存储系统对整个系统性能的影响比对数据流水线的影响更大
复杂性:
- 在同一个嵌入式系统中,通常需要组合各种存储技术
- 至少需要一些非易失性存储和一些易失性存储
- 多种选择
- 层次结构往往是必须的
- 处理器架构的地址空间被分解成若干子空间来提供不同类型的存储器访问
易失性存储器
断电时内容消失的存储器
随机存储存储器(RAM)
SRAM
- 静态RAM,SRAM:速度快,面积大
- 动态RAM,DRAM:保持数据的时间很短,需要定期刷新,比SRAM更不稳定
在嵌入式系统中的应用
- 大多数嵌入式系统都包括一个SRAM,许多ES也会包括DRAM
- 因为只利用SRAM不能提供足够大的存储容量
- 影响程序执行时间
- 被访问的存储器地址是映射到SRAM还是DRAM
- DRAM可能在忙于刷新时被请求访问,因此DRAM刷新周期会引起访问时间的变化
- 访问历史也可以影响存取时间
非易失性存储器
不需要持续供电来保留存储在计算设备中的数据或程序代码
- 只读存储器(ROM),或掩模ROM(Mask ROM):内容在芯片工厂就已经固定
- 电可擦除可编程ROM(EEPROM)
- 快闪存储器(Flash)
- 有比较快的读取时间,但比SRAM和DRAM慢
- 频繁访问的数据在程序使用之前从flash转移到RAM中
- 写入时间大大超过读取时间,而且写入的次数是有限的
- SLC:速度快寿命长,存储密度低稳定性好,成本高,约10万次擦写寿命,多数应用高端企业级产品
- MLC:速度一般寿命一般,成本一般,约3000—10000次擦写寿命,应用民用中高端SSD上
- TLC,速度慢,成本最低,使用寿命也最短,约1000次擦写寿命
- 类型
- NOR:按块擦除,擦除和写入时间较长,但能够像RAM那样访问
- NAND:以块为单位,一个数据块是数百或数千比特,擦除和写入速度比较快,按页读取(512-4K字节)
- 有比较快的读取时间,但比SRAM和DRAM慢
- 磁盘存储器
固件
固件(firmware)一般存储于设备中的电可擦除只读存储器或FLASH芯片中,一般可由用户通过特定的刷新程序进行升级的程序
可固化(ROMable):可被编程到ROM芯片中的机器语言。作为“只读”芯片不能更新,可固化程序必须使用RAM或磁盘来保存变化的数据。
- 代码将从ROM正确执行,不需要复制到RAM,但是RAM可能更快
- 代码和数据不能混用,除了常量数据
存储器层次结构
精确的分层机构取决于技术参数,也取决于应用领域
-
处理器寄存器
-
缓冲存储器:高速缓存、地址转换高速缓存(TLB,也称快表)以及暂存存储器(SPM)。
-
工作存储器(或主存储器、主存):实现了处理器存储地址所涵盖的存储器。通常,其容量在几MB到几GB之间,并且是易失的
-
flash、磁盘等非易失性存储,也可基于互联网的存储器解决方案(如云)
cache
高速缓存的架构对应用程序的执行时间具有很大影响
高速缓存潜在地提高了存储系统的能效
在设计时预测缓存是否命中是很困难的,并且这对实时性能的精确预测而言也是一个负担
多级cache
暂存存储器
SPM,也叫紧耦合内存TCM
- SPM和主存统一编址,每当某个简单的地址解码器给出一个SPM地址范围内的地址时,SPM就被访问
- SPM通常和处理器集成在一个芯片上
- 功耗低、速度快
存储器访问时间难以预测
- 虚拟存储器(Virtual Memory):使各种存储技术看起来是一个连续的地址空间
- 地址转换:把地址空间的逻辑地址转换成一种存储技术上的物理地址,转换通常是由一个专门硬件协助完成,称为转换后备缓冲器(Translation Lookaside Buffer,TLB),加速地址转换
因此,很难预测或理解访问存储器的时间需要多久,因而嵌入式系统设计人员通常比一般程序员需要更深入地理解存储器系统
lecture 5 - 基于总线的计算机系统
I/O接口与设备
IO接口为了能够充当设备与计算机的桥梁,需要多个寄存器
- 数据寄存器
- 控制寄存器
- 状态寄存器
分类
- 从属关系
- 系统设备:操作系统启动时已经在系统中注册的标准设备(例如NOR/NAND闪存,触摸面板等)
- 这些设备的操作系统中有设备驱动程序和管理程序
- 用户应用程序只需要调用操作系统提供的标准命令或函数就可以使用这些设备
- 用户设备:操作系统启动时未在系统中注册的非标准设备(典型的设备包括SD卡、u盘等)
- 通常设备驱动程序是由用户提供的。用户必须以某种方式将这些设备的控制权转移到操作系统进行管理
- 系统设备:操作系统启动时已经在系统中注册的标准设备(例如NOR/NAND闪存,触摸面板等)
- 使用
- 专用设备:同一时间只能被一个进程使用的设备。对于多个并发进程,每个进程使用设备是互斥的。一旦操作系统将设备分配给一个特定的进程,它将被该进程独占,直到该进程使用后释放它
- 共享设备:可被多个进程同时寻址的设备。共享设备必须是可寻址的,并且是随机寻址的。共享设备机制可以提高每个设备的利用率
- 虚拟设备:通过虚拟技术将一台独占设备虚拟成多台逻辑设备,供多个用户进程同时使用, 通常把这种经过虚拟的设备称为虚拟设备
类别
- 特征
- 存储设备:用于存储信息的设备。嵌入式系统中的典型例子包括硬盘、固态硬盘、NOR/NAND闪存
- I/O设备
- 输入设备:输入设备负责将信息从外部输入到内部系统,如触摸面板、条形码扫描仪等
- 输出设备:输出设备负责将嵌入式系统处理后的信息输出到外部世界,如液晶显示器、扬声器等
- 信息传输单元
- 块设备:这种类型的设备以数据块为单位组织和交换数据
- 是一种结构化设备,典型的设备是硬盘
- 在I/O操作中,即使只是一个单字节的读/写,也应该读或写整个数据块
- 字符设备:这类设备以字符单位组织和交换数据
- 是一种非结构化设备,字符设备有很多种,如串口、触摸面板、打印机等
- 字符设备的基本特征是传输速率低且不可寻址,当字符设备执行I/O操作时,经常使用中断
- 块设备:这种类型的设备以数据块为单位组织和交换数据
I/O设备
通常I/O设备由两部分组成,机械部件和电子部件(电子部分称为设备控制器或适配器)
应用
8251 UART,通用异步收发器,包括了RS232、RS449、RS423、RS422和RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称,规定了通信口的电气特性、传输速率、连接特性和接口的机械特性等内容
可编程I/O
在通信过程中选择控制寄存器或数据缓冲区的三种方法
-
独立I/O端口
-
内存映射I / O
-
混合解决方案,混合模型包括内存映射的I/O数据缓冲区和用于控制寄存器的独立I/O端口
Intel x86提供了in、out指令,大多数其他cpu使用内存映射I/O
独立I/O端口
优点:
- I/0独立编址,不占用内存空间
- 使用I/O指令,程序清晰,很容易看出是I/O操作还是存储器操作
- 译码电路比较简单(因为I/0端口的地址空间一般较小,所用地址线也就较少)
缺点:
- 只能用专门的I/0指令,访问端口的方法少
内存映射I/O
优点:
- 在内存映射I/O模式中,设备控制寄存器只是内存中的变量,可以像其他变量一样在C语言中寻址。因此,I/O设备驱动程序可以完全用C语言编写
- 在这种模式下,不需要特殊的保护机制来阻止用户进程执行I/O操作
缺点:
-
目前大多数嵌入式处理器都支持内存缓存。缓存设备控制寄存器会导致灾难。为了防止这种情况,必须为硬件提供选择性禁用缓存的功能,这将增加嵌入式系统中硬件和软件的复杂性
-
如果只有一个地址空间,所有内存模块和所有I/O设备必须检查所有内存引用,以决定响应哪一个,这将严重影响系统性能
ARM 内存映射I/O
定义设备地址:
1 | DEV1 EQU 0x1000 |
读/写代码:
1 | LDR r1,#DEV1 ; set up device adrs |
忙等I/O
最基本的方式:使用指令测试设备忙闲
1 | current_char = mystring; |
将字符从输入设备复制到输出设备
1 | while (TRUE) { |
中断I/O
忙/等IO是非常低效的,CPU在测试设备时不能做其他工作,很难同时进行I/O
中断允许设备改变CPU中的控制流,调用子例程来处理设备
中端接口
中断行为
-
基于子程序调用机制
-
中断强制下一条指令是预定义地址的子程序调用
中断物理接口
-
CPU与设备之间通过CPU总线连接
-
CPU和设备握手
-
设备发出中断请求
-
CPU在能够处理中断时确认中断
示例
字符I/O处理程序
1
2
3
4
5
6
7
8
9
10
11
12
13 void input_handler() {
achar = peek(IN_DATA);
gotchar = TRUE;
poke(IN_STATUS,0);
}
void output_handler() {
}
中断驱动的主程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 main() {
while (TRUE) {
if (gotchar) {
poke(OUT_DATA,achar);
poke(OUT_STATUS,1);
gotchar = FALSE;
}
}
other processing....
}
使用缓冲区的中断I/O
优先级和向量
有两种机制允许我们使中断更灵活具体
-
优先级:决定哪个中断首先得到CPU
-
向量:决定每种类型的中断调用什么代码
机制是正交的:大多数cpu都提供这两种机制
优先级中断
中断优先级
- 屏蔽:在挂起的中断完成之前,不会识别优先级低于当前优先级的中断
- 不可屏蔽中断(NMI):最高优先级,从不被屏蔽(通常用于断电)
中断向量
允许不同的设备由不同的代码处理:提高灵活性,定义服务于来自设备的请求的中断程序的能力,向量号作为存储在内存中的中断向量表的索引
中断向量表
中断向量获取:
通用中断机制
中断序列
-
CPU确认请求
-
设备发送向量
-
CPU调用中断处理程序
-
软件处理请求
-
CPU恢复前台程序状态
中断开销的来源
-
中断处理程序执行时间
-
中断机制开销
-
寄存器保存/恢复
-
流水线相关的开销
-
缓存相关的开销
中断设计指南
-
首先,在布局中断映射之前,不要考虑为新的嵌入式系统编写任何代码,列出每个中断,并描述程序应该做什么
-
上述中断设计图是一份预算,预计在什么情况下中断需要花费的时间
-
粗略估计每个ISR的复杂度
-
ISR的基本原则是保持处理程序简短
-
当然,短是用时间来衡量的,而不是用代码大小来衡量的。避免循环。避免冗长复杂的指令(重复的动作,可怕的数学,等等)
-
在ISR中尽快重新启用中断。先做硬件关键和不可重入的事情,然后执行中断启用指令。给其他ISR机会去做他们的事情
可重入
在嵌入式世界中,例程必须满足以下条件才能重入
- 它以原子方式使用所有共享变量,除非将每个共享变量分配给函数的特定实例
- 它不调用不可重入的函数:调用函数继承了被调用函数的可重入问题
- 它不以非原子的方式使用硬件:如果处理一个设备需要多个I/O操作,就会出现重入问题
原子变量
在计算机世界中,“原子的”是指不能被中断的操作
保持代码可重入性
-
第一条经验法则是避免共享变量。全局变量是没完没了的调试问题和代码失败的根源。使用自动变量或动态分配内存。
-
最常见的方法是在不可重入代码期间禁用中断。
-
信号量
总线
总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线
总线是:(1)一组传送线路,(2)相关的通信协议
总线协议
-
总线协议决定设备如何通信
-
总线上的设备经历一系列的状态
-
协议由状态机指定,协议中的每个参与者都有一个状态机
-
可包含异步逻辑行为
总线复用
系统总线配置
多总线允许并行:一个总线连接慢速设备,另一个独立总线连接高速设备
桥连接两个总线
lecture 6-1 - 嵌⼊式软件系统概述
嵌入式软件的特点
与桌面软件的对比
- 内存:有限,影响编程语言的选择以及开发工具的使用(比如编译器优化)
- CPU处理能力:成本和功耗的考虑,ES不得不采用保守的设计方案,其中的CPU往往只是恰好满足要求。
- 操作系统:OS(Windows/Linux)、RTOS、专有OS或裸机
- 实时行为:实时系统不一定会运行得很快,但一定是可预测的—通常的术语叫做确定性;实时性的要求对于OS的选择和程序设计都有影响
- 开发流程:ES往往没有足够的资源进行软件开发。交叉开发对于工具的选择有很大影响;开发过程也不同,编辑/编译/调试的循环是一样的,但执行程序这一步却非常复杂,需要把代码转移到目标机上或者在某种环境下运行
- 执行流程:多数嵌入式设备从开机开始就会运行某个程序,该程序会一直运行到系统关机。这个程序可能存储在ROM,也可能是从非易失性存储器转移到RAM中执行
- 每一个嵌入式设备都是不同的:可能是技术层面的,不同的CPU架构、内存、外设、应用程序和操作系统也可能是商业运作层面的,比如手机开发、生产的商业模式就和核磁共振扫描仪完全不同
- 嵌入式软件开发工具
- 软件组件
软件/硬件的权衡
-
微处理器的选择
- 可能影响软件效率
-
内存大小和组合
- 尽可能晚的决定存储器可能的确切数量和搭配(rom/ram的混用)
- ROM/RAM互换性,调试时使用RAM替换大部分的ROM
-
需认真考虑设计中包含哪些外设
- 需要重点考虑硬件费用
- 有时可由软件替代[如定时器]
调试
- 在线仿真器ICE
- 模拟CPU的功能,可以完全仿真芯片的行为
- 价格昂贵,难以普及,没有广泛使用
- 监控调试器
- 需要通信通道
- 因为占用系统资源的问题,在一些严格的场合下不适合使用
- 片上调试
- 价格便宜,易于实现,广泛使用
- 例如,JTAG是边界扫描测试的一个标准协议,SWD(Serial Wire Debug)仿真器
自检
- I / O电路
- “loop back”是有用的
- 板载开关
- 用于配置或模式选择
- 状态显示
- 可能是字符或只是LED
- LED至少可以有3种状态:开、关、闪烁
软件系统层次结构
为何要为实时系统建立模型
-
辅助测试和完善最终系统
-
更重要的是,模型利用它所知的系统属性来描述整个系统,并能够被用于对系统特性的进一步研究
-
实时工程师使用程序模型来开发软件和硬件,以便能将整个实时系统全盘考虑
-
模型使得工程师能够预测程序的运行,从而满足系统的性能需求和功能需求
模型间的差异
-
一些模型易于编写,但调试不易
-
难于编写,但调试容易
-
一些模型使得程序运行得更快,但需要付出更多内存资源消耗的代价
-
模型准确性与鲁棒性
嵌入式系统的可视化程序模型
实时系统有两种基本的程序模型
- 将实时应用视为单个执行线程
- 将实时应用视为多个执行线程
取决于需要构建什么类型的系统
单线程程序模型优缺点
优点
-
编程和再编程非常快速简单
-
改变系统响应特性的同时,往模型上添加新功能插件也相当容易
缺点
-
在于应用领域的限制
-
难以做到安全地再编程
-
很难应用到不同行为或不同环境的运行系统中去
多线程程序模型的优缺点
优点
-
允许将系统工作划分为几个逻辑阶段,然后编写相互独立的程序来处理各自的工作
-
所有处理过程并行
-
如果有更高吞吐量的需求,工程师可以在任务中引入新的通信和协作模型
缺点
- 可能引入资源竞争
lecture 6-2 - 嵌⼊式软件架构综述
嵌入式软件架构
分为两部分:
- 业务逻辑
- 实时依赖硬件的逻辑
抽象层将所需操作的高级请求转换为操作所需的低级命令
嵌入式软件架构模式
对于基于微控制器的系统来说,最常用的模式包括:
-
非结构化单体架构
- 很容易构建,但很难维持规模和移植
- 与应用层的应用程序紧密耦合
-
分层架构:当今嵌入式应用程序中最常用的架构
- 将应用程序的逻辑划分为若干独立的层,仅通过定义良好的抽象层进行交互
- 试图通过将应用程序分解为独立的层来改善非结构化单体架构的高耦合性
-
事件驱动架构:对于实时嵌入式应用程序和与能耗相关的应用程序非常有意义
- 通常利用中断来立即响应事件
- 事件驱动的体系结构通常使用消息队列、信号量和事件标志来表示系统中发生了事件
- 优势:
- 具有相对的可扩展性
- 软件模块通常具有高内聚性
- 具有低耦合性
- 缺点:无论何时需要做任何事情,都有额外的开销和复杂性
-
微服务架构:将应用程序构建为为业务领域开发的小型自治服务的集合
- 微服务本质上是低耦合的,使得微服务易于维护和可测试,开发人员可以快速扩展或移植微服务
- 围绕系统的业务逻辑组织的。业务逻辑(有时称为业务功能)是系统行为的业务规则和用例
- 缺点:
- 在架构上,增加设计的复杂性
- 其次,由于具有其他体系结构中可能不需要的通信特性,它们可能会增加额外的开销和内存需求
- 架构的分散性也意味着实时的、确定性的行为可能更具挑战性。实时和响应可能有额外的抖动
- 可能会增加开发时间和预算
实时嵌入式软件常用的设计模式
单核,多核,发布和订阅模型,RTOS模式,处理中断和低功耗设计
管理外设数据
主要的设计理念之一是数据决定设计。在设计嵌入式软件时,必须遵循数据
可以使用几种不同的设计机制,例如
- 轮询
- 中断
- 直接存储器访问(DMA)
这些设计机制中的每一种都有几个设计模式,可用于确保不会遇到数据丢失
外设轮询
从外设收集数据的最直接的设计机制是让应用程序定期轮询外设,以查看是否有任何数据可供管理和处理
轮询
- 优先级 - 无,一切按顺序运行
- 响应时间 —— 所有任务的总和
- 变化的影响 —— 显著,修改任务的执行时间或添加任务会影响所有其他任务
优点:
- 简单,没有共享数据问题
缺点:
-
浪费处理周期,在资源受限或低功耗系统中这些周期可能会显著增加
-
在处理外设时可能会有很多抖动和延迟
watchdog看门狗
看门狗是一个定时器,要求程序每隔一段时间向其输出一个信号,如果超过了WDT的规定时间,就给MCU发送一个复位信号,使其复位,实 现嵌入式系统在无人状态下的连续工作
看门狗是用于检测单片机程序运行状态的芯片,作用是防止单片机收到干扰后跑飞,导致程序崩溃的情况出现,可以及时将单片机复位,使之 正常运行,工作原理是看门狗的一个接口与单片机的一个I/O控线引脚相连,系统运行后,开启看门狗定时器,如果定时器没有在限定时间内 复位,则表示单片机已经跑飞,此时定时器会将单片机复位
有限状态机
类似于轮询,但只执行当前状态
每个状态决定下一个状态(非顺序执行)
-
优先级 —— 每个状态决定下一个状态的优先级
-
响应时间——所有任务的总和
-
变化的影响——显著,修改任务执行时间或添加任务会影响所有其他任务
-
简单性——没有共享数据问题
中断设计模式
中断应用程序的正常流程,以允许中断处理程序运行代码来处理系统中发生的事件
当设计ISR时,我们希望中断尽可能快地运行(以最小化中断)
- 避免内存分配操作,如声明非静态变量、操作堆栈或使用动态内存
- 尽量减少函数调用,以避免时钟周期开销、不可重入函数或阻塞函数的问题
前后台系统:ISR(中断服务处理)
带有中断的轮询
-
优先级-中断优先于主循环,中断的优先级
-
反应时间-所有任务的总和或中断执行时间
-
变更的影响-对中断服务例程的影响较小。与主循环的轮询相同。
-
共享数据——必须处理与中断服务例程共享的数据
优点:
-
不需要浪费CPU周期来检查数据是否准备好
-
获取数据的延迟是确定的
-
抖动被最小化
缺点:
-
中断的设置可能比较复杂
-
必须小心不要使用频繁触发的中断
-
当使用中断来接收数据时,开发人员必须仔细管理他们在ISR中所做的工作。开发人员经常需要使用ISR来处理所需的即时操作,然后将处理和非紧急的工作卸载给应用程序,从而增加了软件设计的复杂性。
数据获取/存储相关的中断设计模式
线性数据存储,乒乓缓冲/双缓冲,环形/循环缓冲区,带有信号量的循环缓冲区,带有事件标志的循环缓冲区,消息队列
- 线性数据存储设计模式:中断服务程序可以直接访问的共享内存位置
- 线性数据存储可能是危险的:
- 线性数据存储是经常遇到竞态条件的地方
- 用于存储应用程序和ISR之间的数据的共享变量也需要声明为volatile,以防止编译器优化
- 数据存储必须由互斥锁保护,以防止竞态条件
- 线性数据存储可能是危险的:
- 乒乓缓冲区/双缓冲区设计模式
- 旨在帮助缓解数据存储遇到的一些竞态条件问题
- 环形缓冲区设计模式
- 环形缓冲区,也被称为循环缓冲区或者环形队列,是一种数据结构类型,它在内存中形成一个环形的存储空间
- 环形缓冲区的特点是其终点和起点是相连的,形成一个环状结构。这种数据结构在处理流数据和实现数据缓存等场景中具有广泛的应用
- 在中断中接收到的实时数据可以从外设中移除并存储在循环缓冲区中。因此,中断可以尽可能快地运行,同时允许应用程序代码自行处理循环缓冲区。使用循环缓冲区有助于确保数据不丢失,中断速度快,合理地处理数据
- 带有通知的循环缓冲区设计模式
- 应用程序需要轮询缓冲区以查看是否有新的可用数据
- 信号量和事件标志
- 在大多数实时操作系统中,使用事件标志比使用信号量更有效
- 应用程序需要轮询缓冲区以查看是否有新的可用数据
- 消息队列设计模式
- 类似于使用带有信号量的线性缓冲区
- 消息队列通常需要更多的RAM、ROM和处理能力
DMA
DMA,全称Direct Memory Access,即直接存储器访问
无需CPU的交互情况下在RAM和外设之间以及内部传输数据
DMA控制器将外设数据传输到循环缓冲区的设计模式
DMA控制器可以显著提高外设和应用程序之间的数据吞吐量。此外,可以利用DMA控制器减轻CPU运行ISR来传输数据的负担,并最大限度地减少浪费的计算周期
RTOS(实时操作系统)应用程序设计模式
在RTOS应用程序中,通常有两种类型的同步
- 资源同步:决定了对共享资源的访问是否安全
- 活动同步:决定执行是否已达到特定状态
资源同步
确保需要访问资源(如内存位置)的多个任务或任务和中断以协调的方式进行,从而避免竞争条件和内存损坏。
可以通过三种方式处理资源同步
- 中断锁定
- 当系统任务禁用中断以在任务和中断之间提供资源同步时,就会发生中断锁定
- 中断锁定可能是有用的,但在实时嵌入式系统中可能会导致许多问题
- 抢占锁定
- 抢占锁可用于确保任务在执行临界区期间不间断,抢占锁在临界区期间临时禁用RTOS内核抢占调度程序
- 抢占锁是一种比中断锁更好的技术,因为关键的系统中断仍然允许运行;但是,更高优先级的任务在执行时可能会延迟。抢占锁还会给系统带来额外的延迟和抖动。还有一种可能性是,由于内核的抢占式调度器被禁用,高优先级任务的执行可能会延迟。
- 互斥锁:保护共享资源的最安全、最推荐的方法之一是使用互斥锁
- 互斥锁通过创建一个对象来保护临界区,该对象的状态可以被检查,以确定是否可以安全访问共享资源,其唯一目的是为共享资源提供互斥
- 互斥锁不会禁用中断,它不会禁用内核的抢占调度程序
- 保护共享资源的互斥锁的一个潜在问题是,开发人员需要知道它的存在!
活动同步
活动同步是关于协调任务执行的。
在使用实时操作系统时,可以使用许多活动同步模式来协调任务执行
- 单向同步
- 任务到任务:单向同步使用二值信号量或事件标志来同步任务
- 中断到任务:可以在中断和任务之间同步和协调任务执行,不同之处在于,在ISR给出信号量或事件标志之后,ISR将继续执行,直到完成为止
- 单向同步也可以与计数信号量一起使用
- 双向同步:两个任务在它们之间的两个方向上进行协调
- 同步多个任务之广播设计模式
- 允许多个任务阻塞,直到给定信号量、出现事件标志,甚至将消息放入消息队列
- 任务或ISR可以提供由多个任务使用的二值信号量广播。广播可能无法在所有实时操作系统中实现,必须检查RTOS是否支持
- 如果不支持广播,则可以创建由任务或中断给出的多个信号量。从设计的角度来看,使用多个信号量并不优雅,从实现的角度来看也不高效,但有时在软件中就是这样。
- 发布和订阅模型
- 在物联网领域广泛使用
- 在许多情况下,物联网设备将启动电源,连接到云,然后订阅它想要接收的消息主题。该设备甚至还可以发布特定的主题
- ROS使用
- 会导致应用程序占用更大的内存
- 在物联网领域广泛使用
IOT(物联网)
打破了传感器任务和任何需要使用数据的任务之间的依赖关系
系统完全可扩展
- 如果突然需要使用传感器数据进行故障处理,不必回头重新构建系统或添加另一个依赖项。相反,创建一个订阅传感器数据的故障任务。该任务将获得操作和检测故障所需的数据
低功耗应用程序设计模式
主要模式是尽可能地保持设备关闭
- 事件驱动中,事件之间没有实际工作要做时,应该将微控制器置于适当的低功耗状态,并关闭任何非必要的电子设备
- 除非发生唤醒事件,否则系统处于低功耗状态
- 实际工作完成后,系统恢复到低功耗状态
建议:
使用内置tickless模式的RTOS,或者可以扩展系统tick以使微控制器休眠更长时间的RTOS
- 例如,FreeRTOS有一个可以启用的tickless模式。开发人员可以添加自定义代码来管理低功耗状态。当系统进入睡眠状态时,系统节拍被自动缩放,因此发生的系统节拍更少!
多核架构
- 同构多核,对称多核处理具有相同处理器架构的两个核
- 异构多核架构,每个处理核心都有不同的底层架构
- 例如, Cypress PSoC 64具有用于用户应用程序的Arm Cortex-M4和作为安全处理器的Arm Cortex-M0+。这两个核心也不必以相同的时钟速度运行。例如, Arm Cortex-M4的工作频率为150mhz,而Arm Cortex-M0+的工作频率为100mhz
人工智能用例
其理念是一个核心用于运行机器学习推理,而另一个核心用于实时控制
实时控制用例
多核微控制器系统中经常使用的另一个用例是让每个核心管理实时控制能力。
安全解决方案用例
另一个流行用例是用应用程序管理安全解决方案
- 例如,开发人员可以使用内置在多核中的硬件隔离,将其中一个作为安全处理器,处理安全操作和信任根。另一个核心为正常应用空间。数据可以通过共享内存在内核之间共享,但内核之间只能通过处理器间通信(IPC)请求进行交互。
lecture 7-1 - 嵌⼊式系统建模
建模、设计、分析
-
建模是通过模拟加深对系统理解的过程。
- 模型是对系统的模拟,并反映系统的特性,模型指定了系统的功能。
-
设计是创建系统的结构。指定系统如何完成其功能。
-
分析是通过剖析获得对系统更深⼊理解的过程。具体说明系统为什么能够完成其功能(或者⽆法完成模型认为其能完成的功能)
建模
是对所研究的系统、过程或概念的一种表达形式
使用模型的目的是要给出系统的抽象视图,每个模型都表示一组对象以及这些对象之间的相互关系
模型的基本特征
-
简单
-
经得起理论检验
-
高表现力
- 简洁的表示,可以提高生产率
-
提供逻辑推理能力
-
可执行:仿真/验证
-
可综合:通常要求设计正交性
-
能够适应各种不同的任务
-
描述不存在歧义,易于理解易于修改
常见的系统建模技术
- 面向状态的建模
- 有限状态机Finite State Machines
- 面向活动的建模
- 数据流图/过程模型,把系统描绘成一组与数据或者执行的相关性有关的活动的集合
- 面向结构的模型
- 框图
- 着重强调系统的物理构成
- 面向数据的模型
- 实体-关系图
- 异构模型
- 综合前四种模型特征
- 表达复杂系统的多种不同视图
基于模型的设计
创建嵌入式系统各个部分的数学模型(物理世界,控制系统,软件环境,硬件平台,网络,传感器和执行器)
从模型构造实现:
- 目标:构造自动化,就像编译器一样
- 实际上,只有部分是自动构造的
分类
-
周期性与事件驱动
- 周期性的例子:流式应用、处理器……
- 事件驱动:反应式(由环境中的变化触发)
-
实时
- 硬实时、软实时
-
控制、数据、通信
-
并行,地理距离
- 高度并发与顺序执行;分布式系统
-
确定性与非确定性
- 可预测性的程度
嵌入式系统模型的用途
-
通过使用现代建模软件工具,可以离线仿真的方式进行设计和执行初始验证
-
可以使用模型来作为所有后续开发阶段的基础
-
将降低出错风险,通过在整个开发过程中执行验证和确认测试来缩短开发周期
-
以系统模型为基础,可以更快、更可靠地进行设计评估和预测
-
这种迭代方法可以在性能和可靠性方面改进设计
-
由于模型的可重用性以及对物理原型的依赖的减少,降低了资源成本
-
通过使用代码自动生成技术,可以减少开发错误和开销
为何为嵌入式系统建模?
-
一个良好的集成建模方法可以大大减少系统文档、设计、测试和实际实现之间的偏差。
-
对于某些嵌入式系统的问题,建模方法可以直接带来额外的效率和准确性的提高
软件建模
通常使用某种形式的软件建模作为切入或制定应用程序的整体设计的最初方法
软件模型在格式、详细程度和功能方面有显著不同
- 一些软件模型是行为的
- 有些只是直观地帮助理解和构建
- 另一些则更多地用作框架,以确保类似应用程序之间的一致性,或促进工程师团队之间的沟通。
面临的挑战是,要知道哪种类型和级别的模型最适合当前的具体情况和问题
建模语言
建模语言有明确的定义和标准语法,用于表示结构和功能参与者及其随时间变化的主要关系
建模语言有多种形式:
-
图形、文本
-
面向文档、仿真或执行
-
专注于体系架构层面内容、实现层面内容
C代码: 文本, 执行, 实现层面的语言
基于时间的仿真:图形、实现、仿真工具
状态图:图形化、架构和实现工具
数据流:图形化、架构和实现软件
V图承诺 :通常用于描述一个嵌入式建模开发周期
何时为嵌入式系统建立模型
-
任务和安全关键型应用:特指故障可能导致巨额损失,对企业声誉造成伤害或严重损坏
- 软件建模、软件工程最优方法和正式行业标准等都要结合起来,以促进和保障嵌入式系统的安全和可靠
-
高度复杂的应用程序和系统
- 现代汽车动力传动控制系统受益于建模技术,因为需要不断调整满足各种要求,包括:控制废气排放,日益严格的标准,更好的燃油经济性,满足客户的要求,提供卓越的性能和舒适度等
- 上述目标既相互关联又相互冲突
-
大型开发团队
- 庞大的开发团队面临几个关键问题的挑战:通信问题,地域分散和语言不同,工具差异
- 建模可以帮助解决上述一些问题:
- 建模可以帮助嵌入式项目不同团队内明确的沟通,设计一个有用的、能够准确表示项目动态的系统模型,可以方便沟通
- 嵌入式模型提供了项目一致性的表达,而不是依赖于翻译书面文档
- 要求保持软件模型可以在工具之间共享
-
没有其他选择(当没有原型时)
- 当嵌入式系统不存在 — 当设计的硬件尚未完成或芯片尚未准备好,这样的情形,建模、模拟、仿真和原型机设计都是非常有用的方法
- 尚未发布的芯片,因为项目大小或成本的关系,不能开发原型机,软件模型可以很有帮助
缺陷检测的时间和成本
-
使用正确建模和仿真技术并不只是获得一个更好的设计,还可以节约成本以及更快的完成开发
-
建模结合软件工程最优方法将有助于解决大多数缺陷
lecture 7-2 - 有限状态机FSM
反应式系统
反应式(reactive)系统就是指能够持续地与环境进行交互,并且及时地进行响应
大多数实时系统都是反应式系统,如通信网络、看门狗和家庭应用(洗衣机、微波炉和洗碗机等)等
特征
- 其特征是事件驱动,当系统接收到一个外部事件时,需要对事件进行处理,然后产生响应
- 反应式系统可以定义为系统可能的输入/输出事件序列的集合、条件、动作和时序约束
- 对反应式系统建模的主要模型包括有限状态机、行为有限状态机、协同设计有限状态机、UML状态图(UML StateCharts)、程序状态机和通信交互进程等
FSM定义
- 有限状态机(finite-state machine,FSM)又称有限状态自动机(finite-state automaton,FSA),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型
- 状态存储关于过去的信息,就是说:它反映从系统开始到现在时刻的输入变化。
- 转移指示状态变更,并且用必须满足确使转移发生的条件来描述它。
- 动作是在给定时刻要进行的活动的描述。有多种类型的动作:
- 进入动作(entry action):在进入状态时进行
- 退出动作(exit action):在退出状态时进行
- 输入动作:依赖于当前状态和输入条件进行
- 转移动作:在进行特定转移时进行
应用
有限状态机是在自动机理论和计算理论中研究的一类自动机。在计算机科学中,有限状态机被广泛用于建模应用行为、硬件电路系统设计、软件工程,编译器、网络协议等研究。
FSM应⽤实例
汽车警报器
吃豆人
⻆⾊AI可以建模为⼀系列认知状态,环境事件可以迫使状态发⽣迁移
吃⾖⼈中的幽灵有四种⾏为:
- 在迷宫中随机漫步
- 当吃⾖⼈在视线范围内追逐吃⾖⼈
- 当吃⾖⼈吃了⼀个能量球时,逃离吃⾖⼈
- 回到中央基地再⽣
Internet Protocols: TCP
FSM特性
(next_states, output) = Φ(state, event)
有限状态机具有两个重要特性:
- 确定性:如果对于每个状态,每个输入值最多可激活一个转移,则称这样的状态机具有确定性,这意味着Φ(S,E)是单一值
- 可接受性:如果对于每个状态,每个输入都有至少一个可能的转移,则称这样的状态机为可接受的,定义了每个可能的状态和输入值
Moore机和Mealy机
状态模型是单线程的
- 任何时候只有一个状态是有效的
Moore状态模型:意味着输出完全由当前状态决定,与输入信号的当前值无关
- 非反应性,输入对输出的影响要到下一个时钟周期才能反映出来
- 结构简单,状态数量大于等于对应的mealy机中的数量
Mealy状态模型:意味着输出既依赖于当前状态,也与输入信号的当前值有关
- 往往更加精简
- 即时对输入产生输出,即响应速度快
可相互转换,mealy机也可转换成大致等效的Moore机,差别只是输出产生于下一个响应,而非当前响应
等价&优化
对所有的输入具有相同输出的两个FSM被称为等价
等价不需要同构(相同形状)——也就是说,两个等价的FSM不需要有相同的图,甚至不需要有相同数量的状态!
等价使优化成为可能:优化一个FSM意味着缩减状态机的状态数目,同时保证状态机能实现同样功能
非确定性FSM
- 当下一个状态或输出有多个值时,FSM被称为非确定性的
- 五元组中,转移关系表示状态和输入值映射到可能的(下一状态,输出值)对集,初始状态不是一个元素而是一个集合,可以有多个初始状态
- 在嵌入式系统建模中的主要用途:
- 环境建模:对于隐藏与环境如何运作无关的细节非常有用
- 机器人不确定的行为
DFAs与 NFA
形式上,确定有限状态自动机(DFA, Deterministic Finite Automaton)和非确定有限状态自动机(NFA)是等价的(幂集构造)
在实践中,NFA通常更简洁
常规FSM建模
问题:
- 经常过度指定
- 由于缺乏组合潜力,可伸缩性较差
- 不支持并发
简单的解决方案:在模型中引入层次结构
状态图: 层次FSM
- StateCharts语言由David Harel于1987年提出
- 支持层次结构模型及并发
- 状态图支持:
- 将状态重复分解为AND/OR子状态
- 动作
- 活动
- 判定式
- 历史
- 同步(即时广播)通信机制
层次FSM模型
-
扩展有限状态机
-
层次结构:
- 状态a“包含”一个FSM
- 处于a状态意味着FSM处于a状态
- a的状态称为OR状态
- 用于对抢占和例外进行建模
-
并发性:
- 两个或两个以上FSM同时处于活动状态
- 状态称为AND状态
层次化状态图
-
FSM将处于S的⼦状态之⼀
-
⽀持从/到⼦状态的转移
- 初始状态(默认)
- 历史
定义
默认状态机制
指定超状态变为活跃时将要激活的特定⼦状态
- 伪状态,不是⼀个状态
历史机制
-
采用这个机制,就可能回到超状态退出之前最后一个活跃子状态
- 给定输入m, S返回到S离开之前的状态(可以是A、B、C、D或E)
-
在第一次进入S时,应用默认机制
-
历史和默认机制可以组合使用
并发
与型超状态(AND-super-state):无论什么时候包含状态S的系统在进入S状态时都将进入S的所有子状态中
- FSM处于超状态的所有(直接)子状态
- 与或型超状态不同,需要多个控制点
进入和离开与型超状态
进入与型超状态时所进入的子状态可以被单独定义,可以是历史、默认及显示转移的任意组合
StateCharts图中的状态
- 与型状态
- 或型状态
- 基本状态
定时器
-
鉴于嵌入式系统对时间进行建模的需求,StateCharts提供了定时器
-
进入包含定时器的状态一段时间后,超时(timeout)将会发生,且系统将离开这个指定状态
-
定时器可以被分层使用
应答机层次结构中使用定时器
StateCharts中的边的标号
- 生成的输出可用边的标号来指定
- 在StateChart中标记转移的表达式的一般语法是“事件[条件]/动作”(event[condition]/action),其中
- event是指触发转移的事件
- condition部分隐含了变量值的测试或对系统当前状态的测试
- action部分描述FSM对状态转移的反应
- 对于每个转移,事件、条件和动作都是可选的
条件转移
StateCharts的优势
-
层次结构允许任意嵌套与型和或型超状态
-
StateMate的语义定义在足够详细的层次上
-
大量的商业仿真工具可用
- StateMate, StateFlow, BetterState,…
-
可在后端将StateCharts转换为C或VHDL,从而支持软件或硬件实现
StateChart的不足
-
生成的C程序可能效率低下
-
生成的硬件可能更糟
-
难以应用于分布式应用程序
-
没有结构化层次的描述
例子:自动饮料售卖机
假设有一台自动饮料售卖机:
-
开机后,机器等待投币
-
当投入一个25分硬币时,机器等待另一个25分硬币
-
当第二枚硬币存入时,机器进入等待状态
-
当使用者按下“可乐”键时,就会出现可乐
-
当使用者拿起瓶子时,机器再次进入等待状态
-
当用户按下“雪碧”或“健怡可乐”时,就会出现雪碧或健怡可乐
-
当使用者拿起瓶子时,机器再次进入等待状态
⾃动饮料售卖机 1.0
自动饮料售卖机V1.1
瓶子会在机器里卡住
- 当瓶子卡住时,指示器会自动通知系统
- 当这种情况发生时,机器将不再接受任何钱币或释放任何饮料瓶,直到饮料瓶被清理干净
- 当被卡住的饮料瓶被清空时,机器将再次进入等待状态
状态机需要修改
层次FSM
层次结构允许
- 合理的默认活动
- 在多个地方可以增强行为
- 考虑被卡住的恢复行为
- 所需的状态数量大幅减少
- 易于添加扩展状态语义
- 增强状态和条件动作
如何在软件中进行有效的实现?
- 层次FSM比FSM更复杂,成本更高
- 但是要在表现力与复杂性和可维护性之间进行权衡
Lecture 8 - eos
实时系统
一个实时系统是指计算的正确性不仅取决于程序的逻辑正确性,也取决于结果产生的时间,如果系统的时间约束条件得不到满足,将会发生系统出错。
术语
- 确定性:如果一个系统始终会为某个已知输入产生相同的输出,则该系统是确定性的
- 非确定性系统的输出具有随机变化特征
- 截止时限:截止时限就是必须完成某项任务的有限时间窗口,指明计算何时必须结束
分类
- 硬实时软件系统:有一组严格的截止时限,且错过一个截止时限就会认为系统失败
- 飞机传感器,自动驾驶系统,航天器,行星探测器
- 软实时软件系统:会试图满足截止时限要求,但如果错过了某个截止时限也不会认为系统失败。但是,在这样一个事件中,软实时系统可能会降低其服务质量以改进其响应能力
- 音频和视频传输软件
- 准实时软件系统:会将截止时限之后交付的信息/计算视为无效。与软实时系统一样,准实时系统在错过某个截止时限后不会认为系统失败,并且如果错过了某个截止时间,准实时系统可能会降低服务质量
- 财务预测系统,机器人装配线
嵌入式操作系统
嵌入式操作系统在智能系统发挥越来越大的作用
近年国内嵌入式操作系统市场规模整体保持稳定
实时操作系统
- 实时操作系统(Real-Time Operating System, RTOS)是支持构建实时系统的操作系统
- 许多嵌入式系统都是实时系统,因此,用于该类的操作系统必须是实时操作系统
- 实时计算机系统同时需要实时运行的操作系统和提供确定性执行的用户代码
- 非实时操作系统上的确定性用户代码和实时操作系统上的非确定性用户代码都不会产生实时性能
RTOS and GPOS(通用操作系统)
相似的功能
多任务级别,软件和硬件资源管理,为应用提供基本的OS服务,从软件应用抽象硬件
RTOS从GPOS中分离出来的不同功能
-
嵌入式应用上下文中具有更好的可靠性
-
满足应用需要的剪裁能力
-
更快的特性
-
减少内存需求
-
为实时嵌入式系统提供可剪裁的调度策略
-
支持无盘化嵌入式系统,允许从ROM或RAM上引导和运行
-
对不同硬件平台具有更好的可移植性
RTOS关键要求
-
操作系统的时间行为必须是可预测的
- 任何调度策略都必须是确定性的
- 为了避免关键事件处理过程中的不可预测延迟,禁止中断的时间必须尽可能短
-
操作系统必须管理线程和进程的调度
-
一些系统要求操作系统管理时间
- 对时间精度的要求可能会有所不同
- 一些与环境的连接可用来获取精确的时间信息,如GPS或移动网络
-
操作系统必须是快速的
-
可靠性
-
简洁紧凑
为何使用RTOS
-
可被复用的标准软件组件
-
灵活性
-
响应时间
RTOS类别
-
快速专有内核
-
对于标准操作系统的实时扩展
- RT_PREEMPT:Linux内核补丁,该内核补丁会将Linux的调度器修改为完全可抢占
- Xenomai:一个符合POSIX标准的协同内核(或管理程序),是一个可以提供与Linux内核协作的实时内核,Linux内核会被视为实时内核调度器的空闲任务(最低优先级任务)
- RTAI:一个协同内核(co-kernel)的替代解决方案
对于标准操作系统的实时扩展
优点:
-
可配备标准操作系统的API,具有GUI、文件系统等
-
标准OS的增强功能也可很快速地应用在嵌入式领域
-
非实时进程不会影响实时进程
缺点:
-
设备驱动程序存在一些问题,为避免冲突,有必要将设备划分为由实时进程处理的和由标准OS处理的两大类型
-
实时进程不能使用标准OS的服务,因此,诸如文件系统访问、GUI等所有优秀特性对于实时进程一般是不可用的
最流行的嵌入式操作系统
Embedded Linux,FreeRTOS,Ubuntu
国产嵌入式操作系统
- HUAWEI Lite OS鸿蒙操作系统
- “道系统”操作系统DeltaOS
- SylixOS实时操作系统
物联网操作系统
物联网(IoT)源于大量廉价、小巧、节能的通信设备(或物)
从硬件上看,物联网是由异构硬件组成的
物联网操作系统的要求-内存/异构硬件
- 内存占用小:正确的权衡性能,方便的API,操作系统内存占用小
- 支持异构硬件:可以配备各种各样的通信技术
物联网操作系统的要求-网络连接/节能
- 网络连接:物联网中使用的通信技术不仅包括各种各样的低功耗无线电技术,还包括各种有线技术
- 节能:许多物联网设备使用电池或其他有限的能源,为上层提供节省能源的方案,尽量利用这些功能本身
物联网操作系统的要求-实时
- 实时功能:物联网通用操作系统的另一个要求是RTOS
物联网操作系统的要求-安全
需求(和挑战)是提供必要的机制(密码库和安全协议),同时保持灵活性和可用性
挑战还包括物联网架构中各个部分的数据完整性、身份验证和访问控制
调度模型
两种调度器
- 抢占式调度器
- 非抢占(或合作)调度器
内存分配
内存是以静态还是动态的方式分配是一个重要的问题
动态内存分配需要在运行时处理内存不足等情况,这可能很难处理
基于堆的malloc实现通常会导致内存碎片,从而导致系统更快地耗尽内存
网络缓存管理
两种可能的解决方案:
- 复制内存(memcpy())
- 在几个层之间传递指针
编程模型
物联网操作系统领域的典型编程模型可分为:
- 事件驱动系统
- 多线程系统
编程语言
对于一个操作系统的编程语言,主要的选择有:
- 通常是ANSI C或C++
- 特定于操作系统的语言
驱动模型和硬件抽象层
灵活、合理方便的驱动接口对于物联网操作系统至关重要
调试工具
编程语言的选择也预先决定了可能使用的工具,包括用于调试的工具,完善的工具链通常包括相应的调试工具
一个常见的辅助工具是使用printf()和类似的工具在串行接口上进行简单的调试,例如USART
特征集
操作系统可以分为内核和更高级别的功能
除了网络协议之外,在低端物联网设备的操作系统中,更高层的特性还包括空中更新OTA、动态加载和链接,或用于轻量级加密和解密的库
测试
处理与硬件相关的测试部分(如设备驱动程序的测试)的一种广泛使用的方法是使用硬件仿真工具,如MSPSim或Emul8
与物联网相关的操作系统分类
-
事件驱动的操作系统
- 最初针对无线传感器网络领域开发的操作系统最常见的方法
- 关键思想是,系统上的所有处理都是由(外部)事件触发的,通常由中断发出信号
- 虽然这种方法在内存消耗和低复杂度方面是有效的,但它对程序员施加了一些重要的约束
-
多线程操作系统
- 通常会引入一些内存开销,这是由于堆栈预留空间造成的,而运行时开销则是由于上下文切换造成的
-
纯RTOS
- 主要关注实现实时保证的目标,正式的验证、认证和标准化通常是至关重要的
- 为了允许模型检查和形式化验证,会对开发人员施加严格的约束
Lecture 8-2 - 实时调度
实时系统所需的调度策略
是一个任务集合,需要调度策略
- 优先级排序约束
- 时间约束:截止时限?任务可能被要求在不早于某一特定时间执行?任务可能相互依赖,也可能相互合作形成一个应用程序?可能不相关,只是共享处理器资源?
调度程序
面临并发程序或一组程序要执行时,调度程序决定接下来执行哪个任务
- 多处理器调度程序
- 决定下一步执行哪个任务
- 由哪个处理器来执行,即处理器分配
- 调度决策是执行任务的决策
- 分配:应该由哪个处理器执行任务
- 排序:每个处理器按什么顺序执行相应的任务
- 定时:每一项任务什么时候执行
调度程序分类 - 根据决策制定的时间
- 完全静态调度程序:在系统设计时制定三项决策
- 明确规范
- 通常不需要信号和互斥锁
- 可通过定时来实现互斥和优先序约束
- 在大多数现代微处理器上难以实现,因为执行时间难以准确预测,而且通常具有数据依赖性
- 静态顺序调度程序/离线调度程序:在设计时完成任务的分配和排序,但直到任务运行时才确定每个任务的物理执行时间
- 可能受一些因素影响,比如是否获取互斥锁,是否满足优先序约束
- 不会根据一个信号或互斥锁的状态改变任务的顺序
- 在线调度程序
- 静态分配调度程序:在设计时制定任务的分配,其他决策在任务运行时制定
- 完全动态调度程序:在任务运行时制定所有的决策
任务模型
调度程序可能做出很多有关任务的假设,这样的假设集称为调度程序的任务模型
-
假设调度开始之前知道所有要执行的任务
-
支持任务的到达
-
支持任务反复执行,可能是无休止的,也可能是周期性的
-
任务是突发性的,重复出现但时间不规律,任务的两次执行时间间隔有一个下限
-
优先序约束:如果执行 i 必须优先于 j ,可以写成 i<j
-
任务执行可以有一些先决条件才开始或恢复执行
- 得到互斥锁
任务的周期
作业(job):一个任务的每次执行被称为一个作业
周期任务:每隔 $ T_{i} τ_{i}$ 被称为周期任务,$ T_{i}$被称为他们的周期
偶发任务:如果连续释放任务$ τ_{i}$ 的间隔长度有一个下界,该任务就被称为是偶发任务
- 在实际应用中,偶发任务经常被当作周期任务进行处理,其周期为相邻任务实例到达时刻的最小时间时隔
非周期任务:既不是周期的也不是偶发的任务
超周期:令τ是一个周期或偶发的任务系统,该系统的超周期被定义为每个独立任务周期的最小公倍数
与任务执行相关的时间
时限约束
如果进程没有在截止时限前完成会发生什么?
- 硬截止时限:如果错过,系统将失败
- 具有硬时限的调度称为硬实时调度
- 软截止时限:反应不需要严格执行的设计决策,最好满足时限要求,但是错过了也不算错误
- 软实时调度
- 也许会试图采取一些补偿性的措施,例如使用近似数据或者切换到特殊安全模式
- 简单的措施避免错误数据的扩散,例如电话中插入一段寂静,或者干脆置之不理
优先级
假设每个任务都有优先级号,调度程序总是执行优先级最高的任务
- 通常用最小的优先级号表示
- 固定优先级:任务整个执行过程中其优先级保持不变
- 动态优先级:在执行过程中任务的优先级是可变的
非抢占式调度与抢占式调度程序
- 非抢占式优先级调度程序:通过优先级决定当前任务完成之后执行哪个任务,不中断一个正在执行的任务而去执行另外一个
- 抢占式优先级调度程序
- 假设:(1)所有任务都有优先级静态分配(在任务的持续时间内是常量)或者动态分配(可以变化);(2)内核跟踪哪些任务是“激活的”
- 抢占式调度:
- 在任何时刻,支持任务的到达,执行最高优先级的被激活任务
- 当任何任务改变优先级或激活状态时,内核可以调度一个新任务
调度程序的度量
可行调度,CPU利用率,调度开销:制定调度决策所需的时间,延迟,总完成时间
可行调度
-
调度策略的选择取决于应用程序的目标
-
最简单的目标就是所有的任务执行都符合他们的时限
- $ f_{i}$ ≤ $ d_{i}$ ,满足以上条件的调度称为可行调度
-
对于具有可行调度的每个任务集(符合任务模型)都产生可行调度的调度程序称为可行性最优
利用率
-
指处理器用于执行任务时间(对闲置时间)的百分比
-
适合周期性执行的任务
-
每当处理器的使用率小于或等于100%时都能实现可行调度的调度算法无疑是可行性最优的
-
通常假设没有调度开销:
- U = (CPU time for useful work)/ (total available CPU time)
延迟
-
对于任务集T,最大延迟定义为:
- $ L_{max} = \underset{i \in T}{max}(f_{i}-d_{i})$
-
对于一个可行调度,值为0或负数
-
也可用于比较非可行调度,对于软实时程序,可以容许最大延迟值为正数,只要不是太大
总完成时间/总时程
$ M = \underset{i \in T}{max}f_{i}-\underset{i \in T}{min}r_{i}$
性能指标,而非实时要求
嵌入式调度与通用调度
通用调度试图避免使进程无法访问CPU
- 公平性=对CPU的访问
嵌入式系统必须满足截止期限
- 低优先级的进程可能很长时间不会运行
调度程序何时被调用
- 非抢占式调度程序
- 任务完成时被调用
- 抢占式调度程序
- 在计时器中断时
- 在I/O中断时
- 操作系统服务被调用
- 任务试图获得互斥锁
- 任务测试信号
lecture 8-3 - 实时调度 - 调度异常
调度异常
- 互斥
- 优先级反转:互斥的危险
- 当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,因此造成高优先级任务被许多具有较低优先级任务阻塞,实时性难以得到保证。
- 优先级继承
- 优先级继承解决了优先级反转
- 优先级继承是当任务A申请共享资源S时,如果S正在被任务C使用,通过比较任务C与自身的优先级,如发现任务C的优先级小于自身的优先级,则将任务C的优先级提升到自身的优先级,任务C释放资源S后,再恢复任务C的原优先级。这种方法只在占有资源的低优先级任务阻塞了高优先级任务时才动态的改变任务的优先级,如果过程较复杂,则需要进行判断。
- 优先级天花板
- 优先级反转:互斥的危险
- 多处理器调度
- Richard异常
考虑互斥
当线程访问共享资源时,它们需要使用互斥来确保数据的完整性
互斥也会使调度复杂化
PIP
算法
- 作业是根据其动态优先级调度的,具有相同优先级的作业以FCFS规则执行
- 当作业 $ J_{i} J_{i}$被阻塞,否则就进入临界区
- 当作业被阻塞时,它将其动态优先级传递给持有该信号量的作业$ J_{k} J_{k} P_{k}$ = $ P_{i}$的优先级执行其临界区的其余部分(它继承被它阻塞的所有作业的最高优先级的优先级)
- 当$ J_{k} J_{k} P_{k}P_{k} J_{k}$阻塞的作业的最高优先级
- 优先级继承是可传递的,即如果1被2阻塞,2被3阻塞,则3通过2继承1的优先级
死锁
低优先级的任务⾸先启动并获取锁a,然后被⾼优先级的任务抢占,⾼优先级的任务获取锁b,运⾏,在尝试获取锁a时被阻塞。然后低优先级的任务尝试获取锁b时被阻塞,不可能再执⾏下去
优先级上限协议
- 每个锁或信号量都被分配了一个优先级上限,该上限等于可以锁定它的最高优先级任务的优先级
- 只有当任务T的优先级严格高于其他任务当前持有的所有锁的优先级上限时,任务T才能获得锁
- 这可以防止一些死锁的发生
- 有一些扩展支持动态优先级和锁的动态创建
OCPP & ICPP
原始优先级上限协议(OCPP):在OCPP中,当更高优先级的任务 Y 试图获取任务 X 锁定的资源时,任务 X 的优先级会被提升到资源的优先级上限,确保任务 X 尽快完成其临界区,以解锁资源;只有当一个任务的动态优先级高于其他任务锁定的所有资源的优先级上限时,才允许该任务锁定资源,否则,任务将阻塞,等待资源
立即优先级上限协议(ICPP):在ICPP中,当一个任务锁定一个资源时,它的优先级立即被提升为资源的优先级上限,因此任何可能锁定资源的任务都无法被调度
- 从调度的角度来看,这两种上限方案的最坏情况是相同的。然而,也有一些不同之处
- ICPP比OCPP更容易实现,因为不需要监视阻塞关系
- ICPP导致更少的上下文切换,因为阻塞是在首次执行之前进行的
- ICPP需要更多的优先级传递,因为这发生在所有资源使用中
- OCPP仅在实际发生阻塞时才更改优先级
脆弱性
一般来说,所有线程调度算法都是脆弱的:微小的更改可能会产生意想不到的严重后果
- 定理(Richard Graham, 1976):如果一个具有固定优先级、执行时间和优先级约束的任务集在固定数量的处理器上按照优先级进行调度,那么增加处理器数量、减少执行时间或削弱优先序约束可能增加调度时长
Richard异常
增加处理器数量
贪心调度
基于优先级的调度是“贪⼼的”。对于本例,更智能的调度程序可以推迟调度5、6或7,使处理器空闲⼀个时间单元
- 贪心调度可能是唯一可行的选项
- 如果任务只有在其前序任务完成后才“到达”(调度器才获知),那么贪⼼调度可能是唯⼀可⾏的选项
减少计算时间
弱化优先序约束
Lecture 9-1 - 实时内核-任务管理
µC/OS-II
是一个可移植的、可固化的、可扩展的、抢占式的、实时确定性的多任务内核,适用于微处理器、微控制器和DSP
面向安全性至关重要的市场的可靠性
为了证明软件系统的可靠性和安全性,软件认证是至关重要的。μC/OS-II目前在大量高级别的安全关键设备中实现
应用
- 航空电子设备——用于火星好奇号漫游者
- 医疗设备/器械
- 数据通信设备
- 白色家电(电器)
- 移动电话,pda, MID
- 工业控制
- 消费电子产品
- 汽车
文件结构
任务优先级
-
μC/OS-II最多可管理64个任务
-
μC/OS-II保留了四个最高优先级的任务和四个最低优先级的任务作为系统任务
-
μC/OS-II实际使用的优先级只有两个:OSTaskCreate和OS_LOWEST_PRIO-1(参见OS_CFG.H)
-
留给多达56个应用程序任务
-
优先级越低,任务优先级越高
-
在μC/OS-II版本中,任务优先级号也作为任务的标识符
空闲任务和统计任务
- 内核总是创建一个空闲任务OSTaskIdle()
- 总是设置为最低优先级,OS_LOWEST_PRIOR
- 当所有其他任务都未在执行时,空闲任务开始执行
- 应用程序不能删除该任务
- 空闲任务的工作就是把32位计数器OSIdleCtr加1,该计数器被统计任务所使用
- 统计任务OSTaskStat(),提供运行时间统计
- 每秒钟运行一次,计算当前的CPU利用率
- 其优先级是OS_LOWEST_PRIOR-1
- 可选
任务控制块TCB
任务控制块 OS_TCB是描述一个任务的核心数据结构,存放了它的各种管理信息,包括任务堆栈指针,任务的状态、优先级,任务链表指针等
一旦任务建立了,任务控制块OS_TCB将被赋值
1 | typedef struct os_tcb |
栈指针
- OSTCBStkPtr:指向当前任务栈顶的指针
- OSTCBStkBottom:指向任务栈底的指针
- OSTCBStkSize:栈的容量
- 用可容纳的指针数目而不是字节数(Byte)来表示
链表指针
- 所有的任务控制块分属于两条不同的链表
- 单向的空闲链表(头指针为OSTCBFreeList)
- 双向的使用链表(头指针为OSTCBList)
- OSTCBNext、OSTCBPrev:用于将任务控制块插入到空闲链表或使用链表中
- 每个任务的任务控制块在任务创建的时候被链接到使用链表中,在任务删除的时候从链表中被删除
- 双向连接的链表使得任一成员都能快速插入或删除
空闲TCB链表
- 所有的任务控制块都被放置在任务控制块列表数组OSTCBTbl[]中
- 系统初始化时,所有TCB被链接成空闲的单向链表,头指针为OSTCBFreeList
- 当创建一个任务后,就把OSTCBFreeList所指向的TCB赋给了该任务,并将它加入到使用链表中,然后把OSTCBFreeList指向空闲链表中的下一个结点
指针数组(指向相应TCB)
状态的转换
任务就绪表
每个任务的就绪态标志放入在就绪表中
就绪表中有两个变量
- OSRdyGrp:在OSRdyGrp中,任务按优先级分组,8个任务为一组OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务
- OSRdyTbl[ ]:任务进入就绪态时,就绪表OSRdyTbl[ ]中的相应元素的相应位也置位
根据优先级确定就绪表
若OSRdyGrp及OSRdyTbl[]的第n位置1,则应该把OSRdyGrp及OSRdyTbl[]的值与$ 2^n 2^n$的n=0-7的8个值先计算好存在数组OSMapTbl[7]中
- 假设优先级为12的任务进入就绪状态,12=1100b,则OSRdyTbl[1]的第4位置1,且OSRdyGrp的第1位置1,相应的数学表达式为:
- OSRdyGrp |= 0x02
- OSRdyTbl[1] |= 0x10
使任务进入就绪态
- 如果prio是任务的优先级,即任务的标识号,则将任务放入就绪表,使任务进入就绪态的方法是
- OSRdyGrp |= OSMapTbl[prio>>3];
- OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07]
- 假设优先级为12——1100b
- OSRdyGrp |= OSMapTbl[12>>3] (0x02);
- OSRdyTbl[1] |= 0x10;
使任务脱离就绪态
将任务就绪表OSRdyTbl[prio>>3]相应元素的相应位清零,而且当OSRdyTbl[prio>>3]中的所有位都为零时,即该任务所在组的所有任务中没有一个进入就绪态时,OSRdyGrp的相应位才为零
任务的调度
- μC/OS-II是可抢占实时多任务内核,总是运行就绪任务中优先级最高的那一个
- μC/OS-II中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换
- μC/OS-II任务调度所花的时间为常数,与应用程序中建立的任务数无关
调度器
确定哪个任务的优先级最高,应该选择哪个任务去运行,这部分的工作是由调度器(Scheduler)来完成的
- 任务级的调度是由函数OSSched()完成的
- 中断级的调度是由另一个函数OSIntExt()完成的
根据就绪表确定最高优先级
两个关键:
-
将优先级数分解为高三位和低三位分别确定(64个任务版本)
-
高优先级有着小的优先级号
-
通过OSRdyGrp值确定高3位
- 假设OSRdyGrp=0x08=0x00001000,第3位为1,优先级的高3位为011
-
通过OSRdyTbl[3]的值来确定低3位
- 假设OSRdyTbl[3]=0x3a,第1位为1,优先级的低3位为001,3*8+2-1=25
源代码
1 | void OSSched (void) |
源代码中使用了查表法
freertos的任务优先级调度示意
FreeRTOS 是一个实时操作系统,所奉行的调度规则:
- 高优先级抢占低优先级任务,系统永远执行最高优先级的任务
- 同等优先级的任务轮转调度
任务级的任务切换OS_TASK_SW()
- 保护当前任务的现场
- 恢复新任务的现场
- 执行中断返回指令
- 开始执行新的任务
任务切换OS_TASK_SW()的代码
1 | Void OSCtxSw(void) |
给调度器上锁
- OSSchedlock():给调度器上锁函数,用于禁止任务调度,保持对CPU的控制权(即使有优先级更高的任务进入了就绪态)
- OSSchedUnlock():给调度器开锁函数,当任务完成后调用此函数,调度重新得到允许
lecture 9-2 - 实时内核-任务之间的通信与同步
事件控制块ECB
所有的通信信号都被看成是事件(event), μC/OS-II通过事件控制块(ECB)来管理每一个具体事件
1 | ECB数据结构 |
事件控制块ECB数据结构
任务和ISR之间的通信方式
- 一个任务或ISR可以通过事件控制块ECB(信号量、邮箱或消息队列)向另外的任务发信号
- 一个任务还可以等待另一个任务或中断服务子程序给它发送信号,对于处于等待状态的任务,还可以给它指定一个最长等待时间
- 多个任务可以同时等待同一个事件的发生,当该事件发生后,在所有等待该事件的任务中,优先级最高的任务得到了该事件并进入就绪状态,准备执行
等待任务列表
- 每个正在等待某个事件的任务被加入到该事件的ECB的等待任务列表中,该列表包含两个变量OSEventGrp和OSEventTbl[ ]
- 在OSEventGrp中,任务按优先级分组,8个任务为一组,共8组,分别对应OSEventGrp 当中的8位
- 当某组中有任务处于等待该事件的状态时,对应的位就被置位,同时OSEventTbl[]中的相应位也被置位
- lecture 10 - bsp-bootloader
嵌入式系统的启动过程
- 上电复位、板级初始化阶段
- 系统引导/升级阶段
- 引导
- 将系统软件从NOR Flash中读取出来加载到RAM中运行 -> 解决成本及Flash速度比RAM慢的问题
- 不需将软件引导到RAM中而是让其直接在NorFlash上运行
- 将软件从外存(如NandFlash、CF卡、MMC等)中读取出来加载到RAM中 -> 成本更低
- 升级
- 可通过网络进行远程升级或通过串口进行本地升级
- 远程升级一般支持TFTP、FTP、HTTP等方式
- 本地升级可通过Console口使用超级终端或特定的升级软件进行
- 引导
- 系统初始化阶段
- 进行操作系统等系统软件各功能部分必需的初始化工作
- 系统初始化阶段需要按特定顺序进行,如内核->网络->文件系统
- 应用初始化阶段
- 进行应用任务的创建,信号量、消息队列的创建和与应用相关的其它初始化工作
- 多任务应用运行阶段
- 各种初始化工作完成后,系统进入多任务状态,操作系统按照已确定的算法进行任务的调度,各应用任务分别完成特定的功能
bsp,特点,与bios区别
BSP全称“板级支持包”(Board Support Packages),说的简单一点,就是一段启动代码,和计算机主板的BIOS差不多,但提供的功能区别就相差很大
特点
- 硬件相关性
- 因为嵌入式实时系统的硬件环境具有应用相关性,所以,作为高层软件与硬件之间的接口,BSP必须为操作系统提供操作和控制具体硬件的方法
- 操作系统相关性
- 不同的操作系统具有各自的软件层次结构, 因此,不同的操作系统具有特定的硬件接口形式
与BIOS区别
- BIOS主要是负责在电脑开启时检测、初始化系统设备(设置栈指针,中断分配,内存初始化…)、装入操作系统并调度操作系统向硬件发出的指令
- BSP是和操作系统绑在一起运行,尽管BSP的开始部分和BIOS所做的工作类似,但是 BSP还包含和系统有关的基本驱动
- BIOS程序是用户不能更改,编译编程的,只能对参数进行修改设置,但是程序员还可以编程修改BSP,在BSP中任意添加一些和系统无关的驱动或程序,甚至可以把上层开发的统统放到BSP中
引导模式
操作系统引导概念:将操作系统装入内存并开始执行的过程
- 不需要BootLoader的引导模式:时间效率高,系统快速启动,直接在NOR flash或ROM系列非易失性存储介质中运行,但不满足运行速度的要求
- 需要BootLoader的引导模式:节省空间,牺牲时间,适用于硬件成本低,运行速度快,但启动速度相对慢
bootloader及其启动过程
BOOTLOADER的生命周期
- 初始化硬件,如设置UART(至少设置一个),检测存储器等
- 设置启动参数,告诉内核硬件的信息,如用哪个启动界面,波特率.
- 跳转到操作系统的首地址.
- 消亡
Lecture11 - 物联⽹概述+
定义,术语
定义
- 物联网(英语:Internet of Things,简称IoT)是一种计算设备、机械、数字机器相互关系的系统,具备通用唯一识别码(UID),并具有通过网络传输数据的能力,无需人与人、或是人与设备的交互
- 物联网,Internet of Things (IoT) ,通过射频识别(RFID)、红外感应器、全球定位系统、激光扫描器等信息传感设备,按约定的协议,把任何物品与互联网相连接,进行信息交换和通信,以实现智能化识别、定位、跟踪、监控和管理的一种网络概念
术语
- 设备:在物联网中,具有强制性通信能力和选择性传感、激励、数据捕获、数据存储和数据处理能力的设备
- 物:在物联网中,“物”指物理世界(物理装置)或信息世界(虚拟事物)中的对象,可以被标识并整合入通信网
IOT特征
- 智能:从生成的数据中提取知识
- 架构:一个支持许多其他架构的混合架构
- 复杂的系统:一组动态变化的对象
- 规模:可伸缩性
- 时间:数十亿并行和同时发生的事件
- 空间:定位
- 一切都是服务:将资源作为服务消费
IOT的优势和不足
优势
- 技术优化:物联网技术有助于技术的改进和提高
- 改进的数据采集:传统的数据采集有其局限性和被动使用的设计,物联网促进了对数据的即时行动
- 减少浪费:物联网提供实时信息可使资源被有效的管理
- 提高客户参与度:物联网允许你通过发现问题和改进流程来改善客户体验
不足
- 安全:物联网技术创造了一个连接设备的生态系统,尽管有足够的安全措施,但系统可能缺乏足够的认证控制
- 隐私:物联网的使用,在没有用户积极参与的情况下,暴露大量的个人数据,这就产生了很多隐私问题
- 灵活性:主要涉及到与另一个系统的集成,在这个过程中涉及到许多不同的系统
- 复杂性:物联网系统的设计也相当复杂,此外部署和维护也不是很容易
- 合规性:物联网有自己的一套规则和法规,然而,由于法规遵循的复杂性,其任务是相当具有挑战性的
应用
- 消费者物联网用例
- 智能家居类:智能灌溉、智能车库门、智能门锁、智能灯、智能恒温器和智能安全系统
- 智能家居行业发展主要分为三个阶段:单品连接,物物联动,平台集成
- 可穿戴设备类:健康和运动跟踪器、智能服装/可穿戴设备
- 宠物类:宠物定位系统、智能狗狗门
- 智能家居类:智能灌溉、智能车库门、智能门锁、智能灯、智能恒温器和智能安全系统
- 零售、金融和营销
- 任何以消费者为基础的商业交易场所,如定向广告,信标(如近距离感知客户)作为营销分析,资产跟踪,如库存控制、损失控制和供应链优化,资产保险跟踪
- 医疗健康
- 医疗保健物联网用例:家庭患者护理,预测性和预防性医疗的学习模型,痴呆症患者和老年人护理和跟踪
- 智慧城市Smart City
- 通过环境感知进行污染控制和监管分析,城市范围小气候天气预报,按需废物管理服务,智能交通灯控制和模式化,改善交通流量和燃油经济性
- 智慧安防
- 城市的安防从过去简单的安全防护系统向城市综合化体系演变
- 引入物联网技术后可以通过无线移动、跟踪定位等手段建立全方位的立体防护
- 智能电网Smart Grids
- 智能电网基本上承诺以自动化方式提取消费者和电力供应商的行为信息,以提高配电的效率、经济和可靠性,优化资源的使用
- 能源产业物联网用例
- 石油钻井平台数千个传感器和数据点分析,提高效率;远程太阳能电池板监控和维护;核设施的危险分析;智能电表、气表和水表
- 智能制造
- 智能工厂和工业 4.0 项目需要安全可靠的物联网设计
- 数字化工厂的核心特点是:产品的智能化、生产的自动化、信息流和物资流合一
- 工业和制造业物联网用例
- 对新旧设备进行预防性维护;通过实时需求提高产量;节能
- 智慧交通
- 智能公交车、共享单车、汽车联网、智慧停车以及智能红绿灯、充电桩、高速无感收费等
- 智慧物流
- 集仓储、运输、配送、信息服务等多功能于一体,优化社会物流资源配置
- 实现物流各环节精细化、动态化、可视化管理,提高物流系统智能化分析决策和自动化操作执行能力,提升物流运作效率
- 运输业和物流业物联网用例
- 车队跟踪和位置感知;市政车辆的规划、路线和监控;冷藏运输和食品配送安全
- 农业和环境物联网用例
- 智能灌溉和施肥技术,以提高产量;智能照明在巢式或家禽养殖中的应用;牲畜监控和资产跟踪
lecture12 - IoT 技术+
IoT多样化的技术环境
- 硬件(端设备)
- 用于开发设备软件、固件和API的集成开发环境(IDE)
- 通信(RFID、NFC、6LowPAN、Zig Bee、蓝牙、WiFi、2G/4G/5G)
- IoT协议(CoAP、RESTful HTTP、MQTT、XMPP)
- 网络骨干网(IPv4、IPv6、UDP、6LowPAN)
- 软件 (RIOT OS、Contiki OS、Eclipse IoT)
- 云平台/数据中心
- 机器学习算法和软件
物联网软件、硬件、连接
- 物联网软件:若干物联网技术已接近成熟,包括边缘人工智能、基于物联网的流分析、监督和非监督机器学习
- 物联网硬件:现有物联网技术被归类为相当成熟或主流包括cpu、mcu、gpu、安全芯片、FPGA和边缘网关
- 物联网连接:eSIM、mesh网络、5G和Wi-Fi 6,接近成熟
进步最快的技术
- 智能传感器
- 在过去的三年中,围绕传感器的技术发展出现了高潮,这些传感器旨在解决各种边缘应用程序的延迟、数据吞吐量和安全性问题
- 新型传感器嵌入了数据处理功能,可以在更靠近传感器的地方处理数据,并对用户界面或执行器作出响应
- 推动智能传感器应用的一些应用包括可穿戴医疗设备,如血糖监测器,以及基于人工智能的制造质量控制
- Wi-Fi 6:相当成熟
- 显著提高速度和网络容量,为接入点提供最佳吞吐量。其吞吐能力几乎是Wi-Fi 5的4倍
- 路由器、网关和客户场所设备(cpe)是Wi-Fi6在过去三年中快速普及的关键设备
- gpu
- 优化gpu以训练AI深度学习模型,为物联网应用同时处理多个计算,并将gpu引入数据中心,因为它们具有并行处理能力,这使其更加成熟
IoT面临的挑战
技术上的挑战
- 安全Security
- 互联Connectivity
- 兼容性和寿命Compatibility and Longevity
- 标准Standards
- 智能分析与动作Intelligent Analysis & Actions
商业上的挑战
社会性问题
lecture13 - IOT平台
概念
物联网平台是一种多层技术,能够在物联网领域中直接提供、管理和自动化连接设备。通过使用灵活的连接选项、企业级安全机制和广泛的数据处理能力,无论硬件多样化如何都将硬件连接到云
对于开发者来说,物联网平台提供了一套随时可用的功能,极大地加快了联网设备应用程序的开发,同时兼顾了可扩展性和跨设备兼容性
物联网平台起源于物联网中间件的形式,其目的是充当硬件层和应用层之间的中介
功能领域
- 使设备连接管理简单
- 设备连接性是任何物联网产品的重要组成部分
- 连接管理平台还可以提供工具来跟踪数据消耗、在不同网络或服务线路之间切换设备
- 接收、存储和发送数据
- 数据管理是另一个需要关注的关键功能,因为需要一个中央集线器来管理和综合设备收集的数据
- 物联网平台作为终端设备生成数据的接收点
- 帮助企业可视化设备数据并提供关键的见解
- 许多物联网平台都配备了易于使用的数据仪表板,可以根据需要自定义查看的数据
- 设备管理可视化的目标是快速提供关于系统正在发生何事的见解,这样就可以在异常成为问题之前处理它们
- 提供特定于应用程序的支持和数据
- 利用来自多个信息源的输入,将它们与有关特定应用程序的上下文连接起来
- 是否有知识渊博、反应灵敏的支持团队
- 需要平台提供商提供的持续支持和专业知识的数量取决于团队的规模以及项目的范围和重点
- 提供健壮的安全
- 最小权限原则也适用于物联网平台级别
- 要实现最有效的安全控制,寻找一种允许基于角色的访问控制的物联网平台,以便为团队中的每个人分配不同的职责和权限
- 提供支持物联网解决方案特定需求的定制
- 许多平台都提供了一定程度的定制,但要确保选择的平台能够适应需要它做的任何事情
- 一些物联网平台还允许添加任务管理工具,以简化团队成员之间的协作。
- 一致的产品交付和平台更新
- 寻找定期对系统进行更新和升级的物联网平台提供商
- 一些平台开始提供主动管理功能
lecture14 - IOT平台关键技术+
设备管理,主要功能,物模型、设备影子、数字孪生(概念、价值)
设备管理
- 设备管理服务, 可以帮助对所有连接的设备, 在全球范围内进行规模化的注册、查看及远程管理
- 设备管理在设备接入基础上,提供了更丰富完备的设备管理能力,简化海量设备管理复杂性,节省人工操作,提升管理效率
主要功能
物联网平台提供功能丰富的设备管理服务,包括不限于:
生命周期;设备分组;设备影子;物模型;数据解析;数据存储;在线调试
物模型
- 物模型(Thing Model)是对设备在云端的功能描述,包括设备的属性、数据、服务和事件
- 物联网平台通过定义一种物的描述语言来描述物模型,称之为 TSL(即 Thing Specification Language),采用JSON格式,可以根据TSL组装上报设备的数据
设备影子
- 物联网平台提供设备影子功能,用于缓存设备状态
- 设备影子是一个 JSON 文档
- 每个设备有且只有一个设备影子,设备可以通过MQTT获取和设置设备影子来同步状态
应用:
- 网络不稳定,设备频繁上下线
- 多程序同时请求获取设备状态
- 设备掉线 / 指令携带时间戳
数字孪生
数字孪生,英文名叫Digital Twin(数字双胞胎),也被称为数字映射、数字镜像
数字孪生,是充分利用物理模型、传感器更新、运行历史等数据,集成多学科、多物理量、多尺度、多概率的仿真过程,在虚拟空间中完成映射,从而反映相对应的实体装备的全生命周期过程
价值
- 可见性: 数字孪生能够实现机器操作的可见性,以及制造工厂或者机场中大型的互联系统的可见性
- 预测性: 使用多种建模技术(基于物理和基于数学的),数字孪生模型能够用于预测机器未来的状态
- 假设分析: 通过适当设计的接口,可以很容易的与模型进行交互,并且对模型询问假设问题,来模拟现实中无法创建的各种条件
- 对行为进行理解和解释的记录与沟通机制:数字孪生模型能够作为一种沟通和记录机制,能够对单独的机器或者机器的集合的行为进行理解和解释
- 连接不同的系统:比如后端的业务应用
边缘计算
基于云的IOT解决方案不足
- 对于大规模边缘的多源异构数据处理要求,无法在集中式计算线性增长的计算能力下得到满足
- 数据在用户和云数据中心之间的长距离传输将导致高网络时延和计算资源浪费
- 大多数终端用户处于网络边缘,通常使用的是资源有限的移动设备,具有低存储和计算能力以及有限的电池容量,所以有必要将一些不需要长距离传输到云数据中心的任务分摊到网络边缘端
- 云计算中数据安全性和隐私保护在远程传输和外包机制中将面临很大的挑战,使用边缘计算处理数据则可以降低隐私泄漏的风险
边缘/边缘计算概念
我们将“边缘”定义为数据源和云数据中心之间的任何计算和网络资源
边缘计算与雾计算是可以互换的
- ISO/IEC JTC1/SC38:边缘计算是一种将主要处理和数据存储放在网络的边缘节点的分布式计算形式
- 国际标准组织ETSI的定义为在移动网络边缘提供 IT 服务环境和计算能力,强调靠近移动用户,以减少网络操作和服务交付的时延,提高用户体验
优势
用途
通信协议
主流技术
多协议接入方案
通过协议转换网关实现泛协议设备接入?