RTOS内容学习部分主要包含“从0写一个RTOS操作系统”和“ROTS内核应用开发”,常见的RTOS包含μC/OS-II、freetos、RT-Thread、LiteOS几种事实操作系统。ROTS的引入原因主要如下:
RTOS内核对比
Freertos的系统功能更为纯粹,可以用于各种需要实时系统的场景。rtthread具备各种第三方组件,尤其是网络组件相关,在物联网产品领域具有很强的优势,可以帮助开发人员配合组件快速完成物联网产品的开发。LiteOS华为大量集成在自己的物联网设备中,包含大量网络云接入接口。
一直在使用rtos作为主要开发内容,却没有详细了解过rtos的内核实现机制。最近一个月,抽了点时间将freertos和rtthread的内核代码看了下,了解了实时系统的实现机制和设计思想。这里学习freertos的代码,先看朱大神的freertos基础篇和高级篇的详细介绍,然后啃源码;搞懂了基本的设计思想和代码的实现逻辑。下面简单列一下自己了解到的两个系统的实现差异。
一、创建任务
两个系统都支持创建静态系统任务和动态任务。区别如下:
freertos 创建的任务添加到就绪任务链表,创建完成后,若调度器已经运行,则可直接参与调度。
rtthread 创建的线程添加到挂起任务列表,创建线程后,需要主动调用start_up,将线程移到就绪任务列表,参与调度。
二、delay
两个系统都支持delay和delayutil。区别如下:
freertos 系统有专用的delay超时计数链表。delay的任务按照超时时间依次排列在超时计数链表中,等待超时时间到达,将其移至就绪任务链表参与调度。
rtthread 系统的每个线程控制块结构体中都定义了一个软件定时器结构体,delay延时函数调用时,将会启动线程自带的软件定时器,完成delay操作,delay超时时间满足时,触发软件定时器超时callback,将任务从挂起列表移到就绪列表参与调度。
三、信号量
两个系统都支持使用信号量。区别如下:
freertos 系统的信号量也是队列,只不过队列的长度为0。freertos使用宏定义封装了计数信号量和二值信号量。
rtthread 系统信号量只支持计数信号量,在创建信号量时传入信号量的初始值。系统中没有二值信号量的接口。可以通过初始值设置1,作为二值信号量使用。
四、邮箱
邮箱与消息队列不同,邮箱常用于传输一个地址,可以直接引用数据,进行数据传输。但是消息队列的实现机制是提前分配好队列最大长度个队列项的内存,在传输数据时,将要发送的数据拷贝到申请的队列内存中,实现的是数据的拷贝。
freertos 系统不支持邮箱
rtthread 系统支持邮箱,邮箱传输的数据大小只有4字节,一般用于传输一个地址,引用这个地址进行数据的传输。
五、时间片
两个系统都支持时间片轮转的机制。时间片轮转是指就绪任务列表中有至少两个相同优先级的最高任务。需要按照轮流执行固定的时间tick进行任务调度。共享cpu资源。两个系统的区别如下:
![](/qrcode.jpg)
freertos 系统需要主动打开时间片轮转的宏定义才会开启这个功能,在task调度切换时,每个task只能执行1个tick。
rtthread 系统在创建thread的时候可以直接传入时间片参数,在thread调度切换时,将按照创建时传入的时间片占用CPU资源,进行相同优先级thread的调度。
六、优先级
freertos 系统的优先级定义为,优先级数值越大,task的优先级越高。
rtthread 系统的优先级定义为,优先级数值越小,thread的优先级越高。优先级为0的thread,优先级最高。
ES32 SDK 支持的 RTOS 内核用例
ES32 SDK 为用户提供了 FreeRTOS、RT-Thread-Nano和 Huawei LiteOS 的内核用例,如下图所示。用户可以通过这些用例学习 RTOS 的使用。
RTOS细节说明
FreeRTOS
FreeRTOSFreeRTOS由美国的Richard Barry于2003年发布,与众多半导体厂商合作密切,是目前市场占有率最高的RTOS。遵循 GPLv2+ 许可协议。
FreeRTOS仅仅只是一个操作系统内核,需外扩第三方的 GUI(图形用户界面)、TCP/IP 协议栈、FS(文件系统)等组件才能实现较复杂的系统。不像 RT-Thread 有丰富的组件和软件包生态,可以快速实现丰富多样 IoT 系统。
RT-ThreadRT-Thread 版权属于上海睿赛德电子科技有限公司,于 2006 年 1 月首次发 布,初始版本号为 0.1.0,经过10来年的发展,如今主版本号已经升级到 4.0.3, 累计开发者达到数百万,在各行各业产品中装机量达到了惊人的数亿台, 占据国产 RTOS 的鳌头。其遵循 Apache-2.0 开源授权模式。
RT-Thread 整体结构如下:
RT-Thread操作系统进程管理算法和Linux中RT调度器中的RR调度相同,在严格优先级的基础上增加了时间片轮训。
它具体包括以下部分:
- 内核层:RT-Thread 内核,是 RT-Thread 的核心部分,包括了内核系统中对象的实现,例如多线程及其调度、信号量、邮箱、消息队列、内存管理、定时器等;libcpu/BSP(芯片移植相关文件 / 板级支持包)与硬件密切相关,由外设驱动和 CPU 移植构成。
- 组件与服务层:组件是基于 RT-Thread 内核之上的上层软件,例如虚拟文件系统、FinSH 命令行界面、网络框架、设备框架等。采用模块化设计,做到组件内部高内聚,组件之间低耦合。
- RT-Thread 软件包:运行于 RT-Thread 物联网操作系统平台上,面向不同应用领域的通用软件组件,由描述信息、源代码或库文件组成。RT-Thread 提供了开放的软件包平台,这里存放了官方提供或开发者提供的软件包,该平台为开发者提供了众多可重用软件包的选择,这也是 RT-Thread 生态的重要组成部分。软件包生态对于一个操作系统的选择至关重要,因为这些软件包具有很强的可重用性,模块化程度很高,极大的方便应用开发者在最短时间内,打造出自己想要的系统。RT-Thread 已经支持的软件包数量已经达到 300+。
- IDE:RT-Thread Studio
RT-Thread 内核结构如下:
内核处于硬件层之上,内核部分包括内核库、实时内核实现。
内核库是为了保证内核能够独立运行的一套小型的类似 C 库的函数实现子集。这部分根据编译器的不同自带 C 库的情况也会有些不同,当使用 GNU GCC 编译器时,会携带更多的标准 C 库实现。
Huawei LiteOS
华为 LiteOS 是一款 “开源免费” 的实时操作系统,面向 IoT 领域轻量级物联网操作系统, 广泛应用于智能家居、个人穿戴、车联网、城市公共服务、制造业等领域,大幅降低设备布置及维护成本,有效降低 开发门槛、缩短开发周期。遵循 BSD-3 开源许可协议。
LiteOS 整体结构如下:
主要包含以下组成部分:
- 基础内核:包括不可裁剪的极小内核和可裁剪的其他模块。极小内核包含任务管理、内存管理、中断管理、异常管理和系统时钟。可裁剪的模块包括信号量、互斥锁、队列管理、事件管理、软件定时器等。
- 内核增强:在内核基础功能之上,进一步提供增强功能,包括C++支持、调测组件等。调测组件提供了强大的问题定位及调测能力,包括shell命令、Trace事件跟踪、获取CPU占用率、LMS等。
- 文件系统:提供一套轻量级的文件系统接口以支持文件系统的基本功能,包括vfs、ramfs、fatfs等。
- 系统库接口:提供一系列系统库接口以提升操作系统的可移植性及兼容性,包括Libc/Libm/POSIX以及CMSIS适配层接口。
- 网络协议栈:提供丰富的网络协议栈以支持多种网络功能,包括CoAP/LwM2M、MQTT等。
- 业务组件:构建于上述组件之上的一系列业务组件或框架,以支持更丰富的用户场景,包括OTA、GUI、AI、传感框架等。
- IDE:Huawei LiteOS Studio。
Huawei LiteOS 内核结构如下:
Huawei LiteOS 自开源社区发布以来,围绕 NB-IoT 物联网市场从技术、生态、解决方案、商用支持等多维度使能合作伙伴,构建开源的物联网生态,目前已经聚合了 50+MCU 和解决方案合作伙伴,共同推出一批开源开发套件和行业解决 方案,帮助众多行业客户快速的推出物联网终端和服务,客户涵盖众多行业,为开发者提供 “一站式” 完整软件平台,有效降低开发门槛、缩短开发周期。
Huawei LiteOS 基础内核包括不可裁剪的极小内核和可裁剪的其他模块。极小内核包含任务管理、内存管理、中断管理、异常管理和系统时钟。可裁剪的模块包括信号量、互斥锁、队列管理、事件管理、软件定时器等。Huawei LiteOS 支持 UP(单核)与 SMP(多核)模式,即支持在单核或者多核的环境上运行。