术语
术语名称 | 描述 |
物联网 | 顾名思义,物联网就是物物相连的互联网。 |
NB-IoT/LPWA | NB-IoT是IoT领域一个新兴的技术,支持低功耗设备在广域网的蜂窝数据连接,也被叫作低功耗广域网LPWAN,该项技术是目前华为公司最重要的物联网技术之一。 |
LiteOS SDK | LiteOS SDK是Huawei LiteOS软件开发工具包(Software Development Kit),包括端云互通组件、FOTA、JS引擎、传感框架等内容。 |
南向设备 | 用于采集数据的嵌入式设备,比如STM32开发板,或者温湿度采集的传感器等。 |
北向应用 | 用于查看IoT云平台上南向设备上报数据或者给南向设备下发控制命令的手机APP或者PC端的应用程序。 |
设备profile | 用于描述南向设备具有的能力以及上报的数据的格式的一组json格式文件,这些文件需要上传到IoT云平台上。 |
编解码插件 | 用于将南向设备上报的私有数据解析成设备profile描述的并且IoT云平台能够识别和存储的数据,以及将北向应用下发的命令编码成南向设备能够识别的数据格式的一组函数组成的jar文件。简而言之就是南向设备和云平台之间的一个数据转换的程序。 |
AT指令 | AT指令集是从终端设备(Terminal Equipment,TE)或数据终端设备(Data Terminal Equipment,DTE)向终端适配器(Terminal Adapter,TA)或数据电路终端设备(Data Circuit Terminal Equipment,DCE)发送的。本文通过AT指令操作WIFI或者GSM模组。 |
端云互通组件 | 端云互通组件是华为物联网解决方案中,资源受限终端对接到 IoT云平台的重要组件。 |
华为云IoT | 华为云IoT是面向运营商和企业/行业领域的统一开放云平台,支持SIM和非SIM场景的各种联接和联接管理,是华为公司面向IoT解决方案的关键平台部件。主要分为连接管理平台,设备管理平台和应用使能平台等多个部分,负责联通端侧设备与北向应用的核心产品。可以支撑千万级的海量物联网连接。 |
RESTful Web API | REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。目前华为云IoT北向应用提供的就是这样一套规范性API。 |
LwM2M | 轻量化机器对机器协议 |
CoAP | 轻量级受限应用层协议 |
MQTT | 消息队列遥测传输 |
DTLS | 数据传输安全协议 |
FOTA | 固件远程升级 |
UART | 通用异步收发器(异步串行通信口) |
简介
Huawei LiteOS是华为面向IoT领域,构建的轻量级物联网操作系统,可广泛应用于智能家居、个人穿戴、车联网、城市公共服务、制造业等领域。
Huawei LiteOS开源项目目前支持 ARM64、ARM Cortex-A、ARM Cortex-M0,Cortex-M3,Cortex-M4,Cortex-M7 等芯片架构。
优势
- 高实时性,高稳定性。
- 超小内核,基础内核体积可以裁剪至不到10K。
- 低功耗,配套芯片整体功耗低至uA级。
- 支持功能静态裁剪。
License
Huawei LiteOS遵循BSD-3开源许可协议。
架构框图
Huawei LiteOS支持多种芯片架构,如Cortex-M series、Cortex-R series、Cortex-A series等,可以快速移植到多种硬件平台。Huawei LiteOS也支持 UP(单核)与 SMP(多核)模式,即支持在单核或者多核的环境上运行。
除基础内核外,Huawei LiteOS还包含了丰富的组件,可帮助用户快速构建物联网相关领域的应用场景及实例,主要包含以下组成部分:
- 基础内核:包括不可裁剪的极小内核和可裁剪的其他模块。极小内核包含任务管理、内存管理、中断管理、异常管理和系统时钟。可裁剪的模块包括信号量、互斥锁、队列管理、事件管理、软件定时器等。
- 内核增强:在内核基础功能之上,进一步提供增强功能,包括C++支持、调测组件等。调测组件提供了强大的问题定位及调测能力,包括shell命令、Trace事件跟踪、获取CPU占用率、LMS等。
- 文件系统:提供一套轻量级的文件系统接口以支持文件系统的基本功能,包括vfs、ramfs、fatfs等。
- 系统库接口:提供一系列系统库接口以提升操作系统的可移植性及兼容性,包括Libc/Libm/POSIX以及CMSIS适配层接口。
- 网络协议栈:提供丰富的网络协议栈以支持多种网络功能,包括CoAP/LwM2M、MQTT等。
- 业务组件:构建于上述组件之上的一系列业务组件或框架,以支持更丰富的用户场景,包括OTA、GUI、AI、传感框架等。
- IDE(Huawei LiteOS Studio):基于LiteOS操作系统定制开发的一款工具。它提供了界面化的代码编辑、编译、烧录、调试等功能。
硬件支持
架构 | 系列 |
ARM | Cortex-M0 |
Cortex-M0+ | |
Cortex-M3 | |
Cortex-M4 | |
Cortex-M7 | |
Cortex-A7 | |
Cortex-A9 | |
Cortex-A53 | |
ARM64 | Cortex-A72 |
RISC-V | RV32 |
C-SKY | CK802 |
代码
LiteOS代码入口
INT32 main(VOID) { BoardConfig(); HardwareInit(); PRINT_RELEASE("\n********Hello Huawei LiteOS********\n" "\nLiteOS Kernel Version : %s\n" "build data : %s %s\n\n" "**********************************\n", HW_LITEOS_KERNEL_VERSION_STRING, __DATE__, __TIME__); UINT32 ret = OsMain(); if (ret != LOS_OK) { return LOS_NOK; } OsStart(); return 0; }
首先进行内存结束地址配置BoardConfig(),硬件初始化HardwareInit(),然后打印Huawei LiteOS的版本信息;
接着执行OsMain()初始化Huawei LiteOS内核及例程,在OsMain()函数中会创建用户任务,其任务处理函数为app_init();
最后调用OsStart()开始任务调度,Huawei LiteOS开始正常工作。
LiteOS的代码目录结构说明
关于代码树中各个目录存放的源代码的相关内容简介如下:
一级目录 | 二级目录 | 三级目录 | 说明 |
arch | arm | cortex_a_r | A核架构支持 |
cortex_m | M核架构支持 | ||
arm64 | arm64架构支持 | ||
csky | cskyv2 | cskyv2架构支持 | |
riscv | rvm32 | riscv架构支持 | |
build | LiteOS编译系统需要的配置及脚本 | ||
compat | cmsis | liteos提供的CMSIS-RTOS 1.0和2.0接口 | |
components | ai | ai(基于mindspore)算子库实现 | |
connectivity | agent_tiny | agent_tiny端云互通组件,包括公共头文件、示例代码、客户端实现代码、操作系统适配层代码 | |
lwm2m | lwm2m协议实现 | ||
mqtt | MQTT开源协议实现 | ||
nb_iot | LiteOS NB-IoT API | ||
fs | devfs | devfs文件系统 | |
fatfs | fatfs文件系统 | ||
kifs | kifs文件系统 | ||
littlefs | littlefs文件系统 | ||
ramfs | ramfs文件系统 | ||
spiffs | spiffs文件系统 | ||
vfs | 虚拟文件系统 | ||
gui | 开源LittlevGL图形库 | ||
language | 语言相关组件,含lua | ||
lib | cjson | c语言json库 | |
log | 日志等级控制 | ||
media | 媒体相关组件,含libpng、openexif、opus、upup、 | ||
net | at_device | AT设备适配层 | |
at_frame | LiteOS AT框架API | ||
ifconfig | ifconfig shell命令实现 | ||
los_iperf | 网络带宽测试工具 | ||
lwip/lwip_port | lwip驱动及OS适配代码 | ||
lwip/lwip-2.1.2 | lwip协议实现 | ||
lwip/ppp_port | lwip协议ppp端口支持 | ||
pcap | 网络抓包工具 | ||
ping | ping shell命令实现 | ||
sal | socket通讯支持 | ||
tftp_server | tftp服务 | ||
ota | 固件升级代码 | ||
security | mbedtls/mbedtls_port | mbed TLS的OS适配代码 | |
mbedtls/mbedtl-2.16.8 | mbed TLS协议实现 | ||
openssl | openssl协议 | ||
sensorhub | include | sensor manager头文件 | |
src | sensor manager的源码实现 | ||
utility | 解析工具,含bidireference、curl、fastlz、freetype、harfbuzz、iconv、iniparser、json-c、jsoncpp、libxml2、sqlite、thttpd、tinyxml2 | ||
demos | agenttiny_lwm2m | lwm2m协议 demo | |
agenttiny_mqtt | mqtt 协议demo | ||
ai | ai的demo | ||
dtls_server | dtls协议demo | ||
fs | 文件系统demo | ||
gui | gui的demo | ||
ipv6_client | Ipv6协议demo | ||
kernel | api | 供开发者测试LiteOS内核的demo示例代码 | |
include | API功能头文件存放目录 | ||
language | 语言相关组件的demo | ||
lms | LMS的demo | ||
media | 媒体相关组件的demo | ||
nbiot_without_atiny | NB-IoT demo | ||
sensorhub | gyro | 基于sensorhub传感框架定时读取MPU6050陀螺仪原始数据的demo | |
trace | Trace的demo | ||
utility | 解析工具的demo | ||
doc | 此目录存放的是LiteOS的使用文档和API说明等文档 | ||
driver | base | LiteOS驱动框架 | |
interrupt | LiteOS系统中断接口 | ||
timer | LiteOS系统定时器接口 | ||
uart | LiteOS系统串口接口 | ||
include | components各个模块所依赖的头文件 | ||
kernel | base | LiteOS基础内核代码,包括任务、中断、软件定时器、队列、事件、信号量、互斥锁、tick等功能 | |
debug | LiteOS内核调测代码,包括队列、信号量、互斥锁及任务调度的调测 | ||
include | LiteOS基础内核内部使用的头文件 | ||
mem | LiteOS中的内存管理相关代码 | ||
sched | 任务调度支持,包括对多核的调度支持 | ||
shellcmd | LiteOS中与基础内核相关的shell命令,包括memcheck、task、systeminfo、swtmr等 | ||
extended | cppsupport | C++兼容适配层底层接口 | |
cpup | CPU占用率统计接口 | ||
include | extended目录所需的头文件 | ||
lms | LMS(实时检测内存操作合法性算法)的库文件 | ||
lowpower | 低功耗框架相关代码 | ||
trace | trace事件跟踪,用于实时记录系统运行轨迹 | ||
include | LiteOS开源内核头文件 | ||
init | LiteOS内核初始化相关代码 | ||
lib | huawei_libc | LiteOS自研libc库和适配的posix接口 | |
libc | LiteOS适配的musl libc库 | ||
libsec | 华为安全函数库 | ||
zlib | 开源zlib库 | ||
osdepends | liteos | LiteOS提供的部分OS适配接口 | |
shell | src | 实现shell命令的代码,支持基本调试功能 | |
include | shell头文件 | ||
targets | bsp | 通用板级支持包 | |
CB2201 | CB2201(ck802)开发板的开发工程源码包 | ||
Cloud_STM32F429IGTx_FIRE | 野火STM32F429(ARM Cortex M4)开发板的开发工程源码包 | ||
GD32E103C_START | GD32E103C_START(ARM Cortex M4)开发板的开发工程源码包 | ||
GD32F303RGT6_BearPi | GD32F303RGT6_BearPi(ARM Cortex M4)开发板的开发工程源码包 | ||
GD32VF103V_EVAL | GD32VF103V_EVAL(riscv)开发板的开发工程源码包 | ||
HiFive1_Rev1_B01 | HiFive1_Rev1_B01(riscv)开发板的开发工程源码包 | ||
qemu-virt-a53 | Coretex A53的qemu开发工程源码包 | ||
realview-pbx-a9 | Coretex A9的qemu开发工程源码包 | ||
STM32F072_Nucleo | STM32F072_Nucleo(ARM Cortex M0)开发板的开发工程源码包 | ||
STM32F103_FIRE_Arbitrary | 野火STM32F103(ARM Cortex M3)霸道开发板的开发工程源码包 | ||
STM32F407_ATK_Explorer | 正点原子STM32F407(ARM Cortex M4)探索者开发板的开发工程源码包 | ||
STM32F769IDISCOVERY | STM32F769IDISCOVERY(ARM Cortex M7)开发板的开发工程源码包 | ||
STM32L4R9I_Discovery | STM32L4R9IDISCOVERY(ARM Cortex M4)开发板的开发工程源码包 | ||
STM32L073_Nucleo | STM32L073_Nucleo(ARM Cortex M0+)开发板的开发工程源码包 | ||
STM32L431_BearPi | 小熊派STM32L431(ARM Cortex M4)开发板的开发工程源码包 | ||
STM32L476_NB476 | 深创客STM32L476(ARM Cortex M4)开发板的开发工程源码包 | ||
STM32L496_Nucleo | STM32L496 NUCLEO-144(ARM Cortex M4)开发板的开发工程源码包 | ||
STM32L552_Nucleo | STM32L552 Nucleo(ARM Cortex M33)开发板的开发工程源码包 | ||
tools | build | LiteOS支持的开发板编译配置文件 | |
menuconfig | LiteOS编译所需的menuconfig脚本 | ||
Makefile | LiteOS Makefile | ||
.config | 开发板的配置文件,如果用户不重新选择开发板,默认为野火挑战者STM32F429开发板的配置文件 |
内核
内核架构
Huawei LiteOS基础内核包括不可裁剪的极小内核和可裁剪的其他模块。
极小内核包含任务管理、内存管理、中断管理、异常管理和系统时钟。
可裁剪的模块包括信号量、互斥锁、队列管理、事件管理、软件定时器等。
Huawei LiteOS支持 UP(单核)与 SMP(多核)模式,即支持在单核或者多核的环境上运行。
各模块简介
- 任务管理
提供任务的创建、删除、延迟、挂起、恢复等功能,以及锁定和解锁任务调度。支持任务按优先级高低的抢占调度以及同优先级时间片轮转调度。
- 内存管理
提供静态内存和动态内存两种算法,支持内存申请、释放。目前支持的内存管理算法有固定大小的BOX算法、动态申请的bestfit算法和bestfit_little算法。
提供内存统计、内存越界检测功能。
- 硬件相关
提供中断管理、异常管理、系统时钟等功能。
中断管理:提供中断的创建、删除、使能、禁止、请求位的清除功能。
异常管理:系统运行过程中发生异常后,跳转到异常处理模块,打印当前发生异常的函数调用栈信息,或者保存当前系统状态。
Tick:Tick是操作系统调度的基本时间单位,对应的时长由每秒Tick数决定,由用户配置。
- IPC通信
提供消息队列、事件、信号量和互斥锁功能。
消息队列:支持消息队列的创建、删除、发送和接收功能。
事件:支持读事件和写事件功能。
信号量:支持信号量的创建、删除、申请和释放功能。
互斥锁:支持互斥锁的创建、删除、申请和释放功能。
- 软件定时器
软件定时器提供了定时器的创建、删除、启动、停止功能。
- 自旋锁
多核场景下,支持自旋锁的初始化、申请、释放功能。
- 低功耗
Run-stop:即休眠唤醒,是Huawei LiteOS提供的保存系统现场镜像以及从系统现场镜像中恢复运行的机制。
Tickless:Tickless机制通过计算下一次有意义的时钟中断的时间,来减少不必要的时钟中断,从而降低系统功耗。打开Tickless功能后,系统会在CPU空闲时启动Tickless机制。
- 维测
CPU占用率:可以获取系统或者指定任务的CPU占用率。
Trace事件跟踪:实时获取事件发生的上下文,并写入缓冲区。支持自定义缓冲区,跟踪指定模块的事件,开启/停止Trace,清除/输出trace缓冲区数据等。
LMS:实时检测内存操作合法性,LMS能够
检测的内存问题包括缓冲区溢出(buffer overflow),释放后使用(use after free),多重释放(double free)和释放野指针(wild pointer)。
Shell:Huawei LiteOS Shell使用串口接收用户输入的命令,通过命令的方式调用、执行相应的应用程序。Huawei LiteOS Shell支持常用的基本调试功能,同时支持用户添加自定义命令。
- C++支持
Huawei LiteOS支持部分STL特性、异常和RTTI特性,其他特性由编译器支持。
内核启动流程
- Huawei LiteOS提供一套自有 OS接口,同时也支持POSIX和CMSIS接口。请勿混用这些接口。混用接口可能导致不可预知的错误,例如:用POSIX接口申请信号量,但用Huawei LiteOS接口释放信号量。
- 开发驱动程序只能用Huawei LiteOS的接口,上层APP建议用POSIX接口。
POSIX(Portable Operating System Interface of UNIX)是一种用于操作系统的接口标准,它定义了操作系统应该为应用程序提供的接口。POSIX标准的目标是实现源代码级别的软件可移植性,即为一个POSIX兼容的操作系统编写的程序,应能在任何其他的POSIX操作系统上编译和执行,即使这些操作系统来自不同的厂商。
CMSIS(Cortex Microcontroller Software Interface Standard)则是ARM与各个微控制器供应商、工具供应商和软件解决方案提供商共同开发的Cortex微控制器软件接口标准。它的目标是让微控制器和软件供应商能够使用一致的软件结构来开发Cortex微控制器的软件。
POSIX和CMSIS接口都是为了实现软件的可移植性和一致性,但POSIX更关注于操作系统级别的接口标准,而CMSIS则更专注于微控制器软件的接口标准。