约 3549 个字 2 行代码 22 张图片 预计阅读时间 18 分钟
Chap 3 | 物联网操作系统
章节启示录
本章节是物联网基础的第三章。复习的时候应该会标注哪些是非重点。
1.概述¶
物联网操作系统:
1. 支撑物联网大规模发展的核心软件。
2. 屏蔽了物联网硬件开发的差异性,提供了统一的编程接口,为多个应用的执行提供了运行时环境,降低了物联网应用开发的成本和时间
3. 硬件抽象是操作系统核心功能之一
与传统操作系统的区别
- 存储空间占用不同: 物联网操作系统内存占用较小,一般只有几十KB
- 内存管理方式不同: 有MMU vs. 无MMU
- OS特权模式不同: 很多物联网芯片不具有CPU特权模式,所有的指令都能访问任何硬件资源
-> 有Bug的程序可以在不受操作系统的控制下轻松地占用CPU周期
系统构成¶
两个重要概念¶
- Library OS: 在操作系统研究中,"library OS"(库操作系统)指的是将操作系统的某些功能作为库而不是作为一个单独的内核运行。这种设计允许应用程序直接调用操作系统服务,而不是通过系统调用接口。这种方法可以提高性能,因为减少了用户态和内核态之间的上下文切换,并且可以为特定应用程序定制操作系统功能。
- 微内核: 是一种操作系统内核的设计哲学,它提供了操作系统最基本的核心功能,如任务/线程管理、内存管理和进程间通信(IPC)。其他服务,如文件系统、设备驱动和网络协议等,通常作为用户态的进程运行,并通过消息传递与微内核通信。这种设计使得操作系统具有高度的模块化和灵活性,因为服务和驱动可以独立地添加、更新或替换,而不需要对整个内核进行修改。
- 宏内核: 是另一种设计哲学,它将操作系统的许多功能集成在一个大型的内核态进程中。例如Linux。
2.关键特性¶
2.1 编程模型¶
-
依据程序结构分类:
- 非模块化编程:在非模块化编程中,应用程序作为一个整体来进行设计、测试和调试
- 模块化编程:模块化编程强调将程序的功能分离为独立的、可互换的模块,使得每个模块执行某一具体功能
- 编码层面的模块化,如TinyOS组件化编程
- 二进制层面的模块化,如SOS模块化编程
-
依据执行逻辑分类:
- 基于事件驱动的编程:应用程序会实时地处理或响应系统中的事件;应用程序由多个事件处理函数构成
- 基于多线程的编程:一个线程对应一个逻辑上的任务
一个例子🌰:TinyOS & SOS
- TinyOS组件化编程: 应用由多个组件组合而成, 编译后的应用程序是单个二进制程序映像,不再保留组件化的信息
- SOS模块化编程: 应用由多个模块组成, 编译后仍有模块信息,可动态加载
一个例子🌰:事件 & 线程
-
事件驱动的编程:基于事件的编程模型可以较好地保证系统的实时性和响应性 周期性地采集传感器的读数,并通过无线通信芯片发送,应用程序实时地处理或响应系统中的事件的编程示例。
-
多线程的编程:一个线程对应逻辑上的一个任务,减少由代码分片带来的额外代码量。阻塞式的,但如果当前数据没来,CPU就被调度出去干别的事情。
2.2 调度方式¶
- 抢占式:高优先级线程会抢占低优先级线程的执行
- 非抢占式:系统一旦把处理器分配给就绪队列中的某线程后,该线程便一直执行下去,直至完成或阻塞
- 协作式:在协作式调度中,只有在线程主动交出CPU的控制权(yield())后,才可以让其他的线程得到CPU的控制权
- 时间片轮转:系统默认给每个线程分配了相同时间片的CPU资源,当某个线程的CPU时间片用完时,即使该线程的任务尚未执行完,也必须交出CPU的控制权,让其他线程执行
调度方式对原子操作的影响
在多个线程同时对共享变量x有操作权限的情况下,如何进行原子操作,才能使变量x的数值在RAM与外存之间始终保持一致?
2.3 I/O操作方式¶
-
阻塞式I/O:
当程序调用一个I/O操作时,直到该I/O操作完成,这个调用才会返回;易于编程 -
分阶段I/O:
- 把I/O操作的调用和I/O操作的完成分成了两个独立的阶段
- 代码冗长,但可以保持系统的高响应性
- 更灵活,更好控制并发
2.4 内存分配¶
- 静态内存分配(如TinyOS):
- 静态内存区域在编译时确定,通常由未初始化数据段(.bss)和初始化数据段(.data)构成
- 静态内存分配可以通过静态数组的方式来实现
- 优点:效率高、内存池中无碎片
- 缺点:不能按需申请
- 动态内存分配(如SOS):
- 动态内存区域在运行时确定
- 通过malloc申请,通过free释放
- 优点:可以按需分配
- 缺点:内存池中容易出现碎片、可能造成安全隐患
2.5 软件更新¶
- 软件更新方式:
- 有线更新:例如通过串口、以太网等
- 无线更新(OTA, over the air):例如通过WiFi
- Bootloader:BootLoader是设备在加电后执行的第一段代码。BootLoader在完成CPU和相关硬件的初始化之后,会将操作系统或固化的应用程序装载到内存中,然后跳转到操作系统所在的空间,启动操作系统运行。
- 具体更新步骤如下:
- 在操作系统启动前,通过 BootLoader 查找升级文件。
- 找到文件后,擦除 Flash 中存储的旧文件。
- 在 Flash 中写入升级的文件。
- 检查新写入的文件是否正确,若正确则重启设备以加载新的文件执行,反之则重新烧写文件,有些设备也可以回滚到原来的版本。
不同的更新方法
- 基于整个镜像的软件更新:对软件系统的所有部分进行更新
- 基于模块化的软件更新:将软件镜像细分为各个模块,根据需求选择其中的某些模块进行更新
- 基于差分的软件更新:将旧版本与新版本的代码做差分,得到升级部分的补丁即差分文件;可以对整个镜像进行差分,也可以对模块进行差分
软件更新——差分
- 差分文件的两种指令:
- COPY指令: COPY1
2 2 (5 Byte) - ADD指令: ADD1
m (3+m Byte)
- COPY指令: COPY1
例子:
旧文件: A B C D E A C B C (9 Byte)
新文件: W A B C D E A C B C (10 Byte)
差分文件:ADDCOPY 9 0 (7 Byte)
- 影响差分文件大小的两个重要因素:
- 差分算法:给定两个文件,计算最小差分文件
- 相似性保持技术:保持代码功能前提下,增加新旧代码之间的相似性。
常见的差分算法:bsdiff、xdelta3、HDiffPatc
2.6 网络服务¶
- 传统传感网的网络协议及服务:
- 主要关注多跳自组织的问题,大多是基于IEEE 802.15.4标准的低功耗局域网协议
- 典型的传感网网络协议包括数据收集协议,数据分发协议,时间同步协议等。
- 物联网的网络协议及服务:
- 通信技术与协议增多:BLE、ZigBee、WiFi HaLow、LoRaWAN、NB-IoT等
- 学术关注点:干扰共存、异构互联
2.7 AI支持能力-TinyML¶
TinyML:(微型机器学习)是机器学习的一个分支,旨在将模型部署到微控制
器和其他低功耗边缘设备。
常见优化技术¶
-
模型压缩:通过权重剪枝、量化和知识蒸馏等方法,减少模型大小
- 剪枝:设定阈值判断训练好的模型权重的重要性; 剪掉小于阈值的权重连接; 微调剪枝后的模型
- 量化:将模型参数从 32 bit 或 64 bit 浮点数变为使用 8 bit或更低的定点数表示。
- 知识蒸馏:把一个大模型或者多个模型(教师模型)学到的知识迁移到另一个轻量级模型(学生模型)
-
高效架构:设计紧凑高效的模型结构,如 MobileNetV2
- 硬件加速:充分利用微控制器的硬件特性进行优化,如DS
3. 典型物联网操作系统¶
3.1 Contiki OS¶
Contiki OS 是一款开源、高度便携、多任务的操作系统
适用于资源有限的无限传感器网络
Contiki OS 专为具有少量内存的微控制器(MCU)而设计
-
关键特性:
支持多线程的编程“风格”,而不是支持多线程的编程,有很多限制
主要特点:基于协作式的调度模式、使用单个堆栈实现、不能使用局部变量
-
网络服务:
- 基于uIP 的TCP/IP协议栈:uIP 将TCP/IP协议栈精简为必须的最小的功能集合,减少内存占用
- 服务端监听 45 号端口,当有数据到来时,反馈“ok”给客户端。
- 客户端向 IP地址为 192.168.0.1 的服务端发起连接。当连接成功时,客户端向服务端发送字符串“hello”。
3.2 RIOT¶
RIOT是一个专门面向物联网场景的实时多线程操作系统
RIOT OS基于微内核实现,所有的系统服务包括时钟、网络协议栈、网络服务等,都是通过创建独立的线程来实现
-
特点:
- 开发者友好
- 资源占用低
- 网络支持好
-
关键特性:
-
模块化系统设计:
- 几乎所有的硬件设备同样被抽象成了模块,如CPU、外设等
- 模块的使用方法如代码所示。在Makefile中导入了dht温湿度传感器的模块以及系统的计时器模块xtimer
-
网络协议栈:RIOT OS中包含了GNRC协议栈
GNRC实现基于RIOT多线程机制。系统为协议栈中的每一层均分配了一个独立的线程。并且底层协议的线程优先级普遍高于高层协议的线程优先级例如:MAC层的线程优先级最高,应用层协议的线程优先级最低。
-
Sensor Actuator Uber Layer (SAUL): IOT在设备的驱动和用户之间增加了一个传感器及执行器抽象层(SAUL)。通过SAUL,用户可以使用统一的代码对各类的传感器和执行器进行数据读取和控制
-
每个外围设备在SAUL中使用了saul_reg_t类型的数据结构进行抽象,包含一个名为
saul_driver_t
的数据结构。所有的设备通过链表的形式进行存储 -
SAUL的驱动提供统一的读写接口,包括统一的
phydat_t
数据类型用于存储传感器数据和用于控制执行器的参数;type属性表示该设备的类型 -
通过SAUL对开发板上所有传感器进行数据读取的代码:
-
3.3 AliOS Things¶
面向 IoT 领域的轻量级物联网嵌入式操作系统 AliOS Things,适用于小型物联网基础设备,可应用在智能家居、智慧城市等领域。
-
特点:
- 开发简易
- 服务丰富
- 优异性能
- 更新便捷
-
关键特性:
-
Rhino内核:
- 内存占用小
- 低功耗:Rhino内核提供了空闲CPU模式
- 实时性与多任务:Rhino 提供了两种调度策略:基于优先级的抢占式调度和循环调度。对于两种调度策略,调度首选优先级最高的任务。
-
网络服务:
- uMesh: 提供了自组织网络和实现设备间本地互联的能力。 uMesh的特点是自组织、自我修复和多跳,适用于需要大规模部署的场景。
- SAL: 加速具有不同连接能力的MCU通信芯片的开发
- LwIP: 深度定制和优化的协议栈,包括IPv4/IPv6、 TCP/UDP、 ICMP、 ARP等
- LoRaWAN支持:支持LoRaWAN的Class A和Class C两种模式的开发
3.4 HarmonyOS¶
-
关键特性:
-
多内核设计: HarmonyOS主要分为内核层、系统服务层、框架层和应用层,支持根据实际需求裁剪某些非必要的子系统或功能/模块。
-
针对IoT领域的设备,HarmonyOS包括LiteOS-A和LiteOS-M两个内核:
-
LiteOS-A主要针对标准设备(参考内存≥128MB),可以支持有MMU的设备进行虚拟内存映射
-
LiteOS-M则主要针对微设备(参考内存≥1MB)及迷你设备(参考内存≥128KB)这类没有MMU的设备。
-
-
-
分布式软总线技术:
- 分布式软总线:参考计算机硬件总线,在1+8+N设备间搭建一条“无形”的总线
- 分布式数据管理:用户数据不再与单一物理设备绑定,
- 分布式任务调度:构建统一的分布式服务管理(发现、同步、注册、调用)机制
- 分布式设备虚拟化:实现不同设备的资源融合,共同形成一个超级虚拟终端