<关键字> 中国移动oneos 、开发环境 、开机自启动、 shell 、单元测试、 源码分析
1、oneos系统
1.1 开发手册
OneOS是中国移动针对物联网领域推出的轻量级操作系统,具有可裁剪、跨平台、低功耗、高安全等特点,支持ARM Cortex-M、MIPS、RISC-V等主流芯片架构,兼容POSIX、CMSIS等标准接口,支持MicroPython语言开发,提供图形化开发工具,能够有效提升开发效率并降低开发成本,集成公共组件,适用于安全易用的物联网产品。
移动官网提供完善的oneos开发文档 https://os.iot.10086.cn/v2/doc/homePage

也可参考RT-Thread的资料,https://www.rt-thread.org/document/site/#/
1.2 开发工具
OneOS开发环境是基于命令行的OneOS-Cube,在对应工程目录下,执行menuconfig配置系统,scons编译构造。具体操作说明:https://os.iot.10086.cn/v2/doc/detailPage/documentHtml?idss=157071776529260544&proId=156799478777782272

1.3 软件框架
OneOS总体架构采用分层设计,主体由驱动、内核、组件、安全框架组成,采用一个轻量级内核加多个系统组件的模式。

与freeRTOS只包括内核相比,oneos支持通用组件或第三方库,尤其对接移动平台方便,遵循 Apache 2.0 license 开源协议,任意使用。
1.4 内核
Oneos内核提供任务管理调度、任务间同步与通信、定时器、内存管理等常用RTOS功能,与常规的RTOS如freeRTOS相比,仅有几点小区别:
1、任务,创建task后需要额外调用才启动,不同于freeRTOS创建所有的task后统一启动调度,全部task都开始执行。这种各task独立启动的,需要注意先后关系,不能task1启动后就向task2的队列发消息,此时队列可能为NULL且发送前没有判断,会导致重启。
2、消息队列,其动态创建和发送接口类似,但接收队列消息需要传入的参数不同,需要传入期望接收的字节大小。巧合的是项目使用的消息队列都是同一个结构体,如果不一致,需要特殊处理。
3、工作队列,将task进行了一定封装,不需要为处理某个事件而新建task,交给系统提前创建的task统一执行,执行结束后触发回调函数,这样多个长时间运行但不经常触发的,可以交给工作队列处理,该功能在UIS8910中系统自带。
4、邮箱,Oneos特有的,可理解为简化版的消息队列。
关于freeRTOS基础可以参考FreeRTOS基础及其应用 (入门简化版)。
1.5 组件
正如前面提到,如何使用oneos,移动官网有详细的说明,本文只是介绍oneos的基本开发流程,分析其部分功能的实现方式,后续以其设备框架、SHELL和单元测试三部分为主。
2、系统移植
2.1 开发流程
基于oneos的开发方式和以往不同,先将原始工程编译生成库,全部复制到oneos工程,再基于oneos系统开发业务逻辑,其开发环境和原始工程开发环境无关。Oneos工程编译生成的bin文件下载到设备,完整版本支持microPython,可以导入python文件直接运行。

可能部分功能比较特殊,使用原始库文件无法实现,例如获取系统某个参数。
在原始工程开发,可以直接将客制化代码插入某个接口拦截,基于oneos开发时尽量避免,但是实在不行也只能这样。这样操作后,原始工程编译成功,但链接肯定失败,但不影响结果,只要输出lib库即可。
2.2 操作系统适配
如果没有原始SDK,要运行oneos,直接将原始库,例如STM32原厂HAL库复制到oneos/thirdparty即可;但是有基础SDK,且SDK是基于其它RTOS开发,则其库要在oneos运行,需要进行适配转换,存在两种方式。
以目前支持cat1网络比较火的两个芯片平台为例。
紫光展锐UIS8910平台使用freeRTOS,且基本开源,因此可以将UIS8910工程中的freeRTOS系统接口,其函数内容替换使用oneos的接口实现。
翱捷ASR1603平台使用threadX,且已封库,因此是在oneos工程,将oneos的系统内核接口函数内容使用ASR1603提供的库实现。

前者UIS8910是oneos直接在底层替换了freeRTOS,相当于只运行了一套较为干净的oneos;后者完全是将两套RTOS的接口互相匹配,且中间并不是一对一替换。
2.3 风险与限制
原始工程开发函数是直接调用,引入oneos框架后,内核适配、驱动框架增加了代码量,运行效率也存在一定损失。
对网络modem相关的操作,oneos使用AT通信,其阻塞方式对原有应用逻辑存在较大影响,不如原始API便捷。
3、系统组件
3.1 编译器关键字
重点介绍section关键字,后续章节都与其有关,section主要作用是将函数或者变量放在指定段中,可在指定的地方取函数执行。
//main.c
//section demo
#include "stdio.h"
int __attribute__((section("my_fun"))) test1(int a,int b)
{
return (a+b);
}
int test(int b)
{
return 2*b;
}
int __attribute__((section("my_fun"))) test0(int a,int b)
{
return (a*b);
}
int __attribute__((section("my_val"))) chengi;
int __attribute__((section("my_val"))) chengj;
int main(void)
{
int sum,c,j;
chengi=1,chengj=2;
sum=test1(chengi,chengj);
c=test(100);
j=test0(chengi,chengj);
printf("sum=%d,c=%d,j=%d\r\n",sum,c,j);
return 0;
}
编译生成map文件:

本文详细介绍了中国移动的OneOS操作系统,它是一个轻量级物联网操作系统,支持多种芯片架构和标准接口。OneOS的开发环境基于命令行,采用分层设计,包括内核、组件和安全框架。内核功能包括任务管理、同步通信等,与FreeRTOS有细微差别。系统移植涉及内核适配和组件转换,可能存在效率损失。OneOS支持设备框架、自动初始化、Shell工具和单元测试,还集成了MicroPython。文章还讨论了Python在嵌入式开发中的应用。
最低0.47元/天 解锁文章
1201





