汪礼超:腾讯物联网操作系统TencentOS tiny 软件架构解析与实践

2019-07-31 18:41:22 浏览数 (1)

7月27日,腾讯云开发者社区技术沙龙第24期“物联网技术与应用”圆满落幕。本期沙龙特邀请腾讯云技术专家对腾讯云全栈物联网产品进行了深度揭秘,针对腾讯云IoT全栈产品中的IoT平台、边缘计算、物联网安全、物联网操作系统、AIoT这五个产品进行全面的技术剖析和满满干货分享。下面是汪礼超老师关于腾讯物联网操作系统TencentOS tiny的相关技术及应用的分享。

讲师介绍:汪礼超,腾讯云高级工程师。曾先后在大疆、华为从事嵌入式软件及物联网操作系统相关研发工作。加入腾讯后,主要负责腾讯物联网操作系统TencentOS tiny软件架构设计和研发,有丰富的嵌入式软硬件开发及物联网项目经验。

今天我们将主要从以下四个层面和大家进行探讨,首先我们来了解TencentOS tiny的项目背景及简介。我们知道在2009年的时候,温家宝总理第一次在无锡提出物联网“感知中国”战略,那个时候起物联网开始蓬勃发展。特别是2015-2016年的时候,随着低功耗广域网技术的推出,比如说NB-IoT,LoRa这种新兴技术的提出来,物联网基本上成一个井喷式的发展。原来我们的物联网是短距的一些通信,像WI-FI、蓝牙这种,但是随着广域网的发展,物联网真正能够铺开面,实现广域大范围的连接。

据权威数据的统计,仅2018年的时候国内的物联网市场就已经达到1万亿。到2020年预测数据是可以达到1.5亿的。针对这么大的一个市场,我们腾讯也在整个loT领域有完整的生态链产品布局,前面我们的同事也介绍过,目前来说我们基本上能支持物联网在整个生态链条里面各种行业应用,包括生活物联、智慧城市、公共事业、智能制造、智慧能源等等。其实我们TencentOS tiny物联网操作系统在这个生态领域也扮演非常重要的角色,他是我们整个生态链底层最关键的一环。

举个例子,我们知道云的发展非常迅速,云上有非常多的人工智能模型以及大数据的模型。如果这些模型缺少数据,也是没有用武之地的。那么我们端侧物联网操作系统,在底层担任一个非常重要的角色,他的一个主要作用是为云侧引流,把我们终端设备或者说哑终端通过操作系统这样一个终端软件做使能,把他变成一个智慧化的终端,把数据送到云端。这样云端的边缘计算也好,大数据分析也好,才能真正能结合业务场景做一些具体的分析,真正使终端设备智能化。我们的物联网操作系统就能够一定程度上促进整个物联网的生态、乃至我们腾讯主导的产业物联网的发展。

接下来我们详细了解一下我们TencentOS tiny到底是什么样的产品。TencentOS tiny是我们腾讯面向物联网领域开发的一个实时操作系统,他具有低功耗、低资源占用、模块化以及安全可靠等特性,主要的目的是希望能够简化物联网终端的开发,让我们的终端厂家或者芯片模组厂家,真正在开发自己业务的时候,能比较简单的去实现自己的业务功能。那么基于我们这个OS,我们提供了最精准的RTOS内核,以及在RTOS内核上提供了一个丰富的IOT组件,包括我们主流的物联网协议栈以及腾讯云SDK的支持,方便我们终端设备及业务快速的接入到我们腾讯云的物联网开发平台。我们目前已经跟主流的芯片和模组厂商达成了合作,包括意法半导体以及我们国内的华大半导体,通过我们OS使能这些芯片或者是模组,从而让业务能快速接入到我们的平台,从而支持智慧城市以及多种物联网行业的应用。当然我们希望有更多的合作伙伴加入到我们这个行业来,跟我们一起来扩展物联网终端的生态,共同促进我们整个行业的发展。

接下来我简单介绍一下我们TencentOS tiny在2019年下半年短期规划。今天这个会议之后,我们会开启一个内测,也就是说8月初的时候我们正式会开启内测,等一下我会给大家提供一个报名方式,大家可以通过这个方式来报名参加我们的内测。预计10月份的时候,我们会正式把所有的TencentOS tiny源码放到GITHUB上正式的开源,也欢迎大家跟我们一起贡献代码一起扩展生态。正式开源之后,我们会逐步寻求一些商业合作的机会,尽量有一些标杆项目真正商业落地。预计在年底的时候我们会树立几个比较好的标杆项目,有兴趣的朋友可以跟我们一起来合作,做一些比较好的商业案例。

接下来我详细介绍一下我们TencentOS tiny的软件架构。下边这张图是我们TencentOS tiny架构全景,我们先从这个架构图的最低往上看,首先我们是OS支持CPU和MCU,目前来说主要是ARM CORTEX系列。我们知道ARM CORTEX系列在物联网领域基本上是占比60%到70%的市场份额。未来我们还会考虑支持更多的IP和架构。比如说ESP8266以及新的开源架构RISC-V,也欢迎大家一起跟我们共建这个CPU生态。

往上我们会提供一些CPU外设的驱动管理以及板级驱动包的管理,还有我们基本外设的管理。像很多开发的朋友都遇到了一些硬件适配非常难,业务层调用底层的硬件非常复杂,我们会在OS上面提供统一的框架来帮大家减少我们硬件的差异。

在这个驱动上面是我们的操作系统的内核,我们的内核相比业界更简洁,整个架构更清晰。我们减少了一些复杂的操作,支持90%可能会用到的一些功能,其他功能支持都做了优先级。所以我们整个内核体积会非常轻量,代码非常清晰,开源之后大家可以看一下。虽然这个内核比较精简轻量,但是也会支持主流芯片的一些功能。比如说,任务管理、实时调度、时间管理、中断管理、内存管理、异常处理,还有IPC组件都是支持的。

在内核的上层,我们也支持主流的OS适配层,比如说CMSIS。 使用这种CMSIS接口给用户业务层来调用,可能从其它平台迁移过来非常简单。我们的基础内核上层也构建了非常多的IOT组件以及连云的一些支持,比如说左侧是我们整个IOT协议上的支持,目前来说主要支持,像上层的应用层协议,也支持我们安全连接的一些协议。往下层我们会支持很多链路层的一些协议,比如网络WI-FI、BLE、LoRa、NB-IoT等等。当然可能大家在平时的物联网场景中,使用最多是通信模组。大家都知道更多的是通过AT指令交互,在这个层面上我们为了简化用户的工作量,也提供了一个AT框架适配层。希望是屏蔽复杂的AT交互逻辑,把一些AT命令处理,比如异步收发的机制尽量简化,用我们的框架来管理。用户只需要调上层的API就可以了,从而简化下面的网络模组的适配工作量,也简化业务层次的调用逻辑。

除了这个协议栈,我们也提供了一些丰富的框架,主要有设备框架、文件系统、OTA升级、KV存储等,OTA、JS引擎、KV存储我们还在规划,其他的功能现在我们已经完成开发。往上我们也会提供一些标准的API,我们希望这些API尽量简洁,能够支撑连云业务,不希望暴露复杂的接口给用户,复杂操作尽量屏蔽在下层。用户在使用这些API连云,基本上只需要初始化,可能填一个IP、端口就初始化好了,接下来业务只要发数据,收数据就可以了,完成后再关闭连云的链接。大部分业务调用四个接口就能解决问题。我们后续会尽量让所有的联网方式往这个目标去靠。在API上层,我们会提供常用物联网的参考案例,比如说如何去连腾讯云的平台,我怎么去使用文件系统或者使用我的低功耗框架,这些都会提供一些基础案例给用户做参考,用户可以基于这些demo做一些扩展,更方便开发自己的物联网应用。

在物联网通信过程中,我们也会支持一些安全框架。比如说腾讯的TID安全的认证,在我们的端侧OS也会作为一个组件集成进来。以及我们OS自已有提供的一些白盒加密以及TLS认证和数据加密的支持。总体而言,我们的TencentOS tiny有以下几个优势。第一个,我们最小的内核可以达到RAM0.6KB,ROM1.8KB,而且我们基于一个典型的LORA模组,测试了一个烟感应用的资源数据,大概RAM占3.3KB,ROM占12KB的样子,这个是包括所有的OS内核底层的驱动以及我们简单的测试业务,大概是这么一个体量。

第二个低功耗。这里我们实测最低的休眠功耗可以达到2个微安,这个基于我们OS内部的一个Tickless机制,也就是说你没有业务的时候,OS会让芯片处于一个休眠的状态,另外我们对一些常用高耗电外设提供了外设功耗的管理方式。但是这个需要用户去配置,根据具体的业务去调整,我们只提供这个框架供内核层调用,而且要求用户外设在硬件上做一些支持。

另外刚才讲到我们OS有丰富的IoT组件,这里主要是一些IoT协议栈,还有AT框架以及我们支持的OTA升级。目前来说我们OTA升级有支持分块压缩以及差分的方式,这个在后续会逐步的开源出来。

另外还有一个可靠的安全框架。我会有一些多样化的安全分级方案,很多对安全不敏感的业务,他可能并不关心这个数据被泄露,你可能只需要认证就可以了,跟平台完成一个认证,你不需要在数据加密做很多,可能选择级别比较低的安全方案就可以了,这样你的成本可能就下来了。我们提供了大概有五个层次的安全分级方案,供用户选择。你可以根据自己的业务需求进行选择,均衡你的成本控制。

良好的可移植性。我们所有的组件,包括内核以及上面的IoT组件框架,都做好了高度解耦,尽量把跟其他模块之间的连接都做成可适配的层次。我们TencentOS tiny会保持包容的心态,比如说大家在物联网开发中,原先业务使用了其他的操作系统,那么你不想切操作系统的内核,我们也欢迎大家使用TencentOS tiny的组件,我们认为组件也是我们OS的一部分。使用了我们组件,也就是使用了我们的OS。所以说在很多组件的适配层上,我们都做了兼容性优化,欢迎大家去移植使用。

另外一个方便的调试手段。目前来说我们是唯一提到这样的概念,因为很多物联网的终端设备是在一个荒郊野外或者很远的地方,他出现问题的时候,非常难定位。为了能够让我们去减少这个问题,当终端出现问题的时候,最后一次死机了,会把一些信息记录下来,他再重启的时候首先把错误数据上报云端,也就是说错误的一些信息,包括出现问题的状况,我们可能在云端就能查到,不需要开发人员到偏远的地区,到现场去定位,这也是增加一个调试手段,让大家的物联网业务问题定位更简单。

接下来我们看一下到底如何使用我们的TencentOS tiny,这里有一个简单的开发引导。如图所示,是我们一个简单的入门流程。首先大家需要熟悉我们的源码结构,然后移植我们的基础内核,然后大家可以创建我们的TencentOS tiny 的任务,再学习我们任务之间的IPC通信,以及学会怎么在我们的OS上进行内存管理。这个完成之后,接下来是网络上面的联网支持,比如说学会使用我们的AT框架,怎么使用腾讯云的(CSDK)上云。

首先我们来看一下TencentOS tiny整体的源码目录,这个目录很长,我一个一个讲。第一个目录主要是放置我们TencentOS tiny支持的IP和架构,比如说我们支持ARM中断,调度汇编以及tick相关的代码就存放在这个目录。BOARD目录是我们支持的一些开发板或者说一些硬件列表,这里我只放了一个,是我们的定制开发板。Component主要放置我们OS上面的组件,比如说IOT协议栈,比如说COAP、MQTT以及我们腾讯云的(C-SDK)。FS主要放的是文件系统,Security主要是放我们TencentOS tiny的安全协议代码,以及我们白盒加密的一些安全特性代码。Device会放一些网络模组的驱动,比如说我们常用的一些网络模组BC35、BC26,模组的一些驱动放在这下面。DOC开发文档的目录,到时候大家重点需要关注DOC目录,这里面有非常多的开发指南,以及SDK的说明,以及我们开发板的使用指南等等。kernel主要分为基础内核和头文件,以及PM是我们低功耗框架的一些源码。

NET目录这个部分主要是我们提供的网络适配框架、AT框架以及我们封装的API适配框架。这个是设备通信层的适配框架,还有这个是腾讯定制模组的AT框架,前面我们同事也介绍过的,OS也是支持定制模组接入的。Osal目录是OS基础内核抽象层API,主要是兼容业界的ARM CMSIS OS标准。PLATFORM主要是我们支持的一些芯片板级的驱动。这个HAL是内核头文件定义的针对具体某个芯片的驱动实现,如串口、GPIO的实现,会分不同的芯片厂商放在这个上面,基本上替大家做好了移植,大家不需要自己去适配,或者说大家可以参考这个模版,按自己需要实现的平台实现就可以了。Test的目录主要是放我们整个TencentOS tiny测试框架及测试用例,目前来说我们整个OS的内核包括我们所有组件,都有非常多的测试用例。Test会做稳定性的测试或者是极端性的测试,保证我们内核的稳定性。Tools主要存放的是我们TencentOS tiny提供的一些工具,比如说有一些自动化脚本,包括一些配置文件的生成,会放一些工具在上面。

介绍完源码之后,我们看一下到底去怎么移植,我们移植的时候一般只需要关注这四个目录就可以了。

这个是我们TencentOS通用的移植步骤,我这里会把移植步骤做一个简单的描述。我不会展开,因为具体的移植流程会在我们的文档里面会有详细的体现。首先第一步我们需要准备目标硬件,如果你选用的是我们官方支持的模版硬件,不需要做移植。如果你使用自己的MCU,你可能需要做一下移植。移植的基本步骤,我们先介绍一下定制开发板,刚才我们在外面也展示了,主要是联合合作伙伴做的一个开发板,方便大家来体验TencentOS tiny内核以及一些功能。目前来说,这个板他有一个好处是左侧可以去扩展不同的传感器,右侧支持非常多不同的联网方式,比如说WI-FI、蓝牙这些都是支持的,大家可以根据情况选择不同的方式。

大家准备好硬件之后,再选择一个编译环境,当前我们TencentOS支持三个编译器,KEIL、IAR、GCC。大家需要准备一个芯片对应的裸机工程,能运行基本功能,比如说串口printf打印,STM32系列芯片都可以用CubeMX自动生成。在这个基础上,把内核的源码和头文件加到我们的工程里面来,去配置好tick中断,我们的系统是需要tick中断去支持的。另外修改系统的配置项,这里面可以对我们整个内核的模块进行配置,包括你要不要使用信号量,你要不要使用队列等。最后一个是编写一些测试任务进行移植验证就可以了。

接下来我展开讲一下OS内核里面的一些使用方式。首先我们了解一下我们TencentOS的启动流程。在芯片上电之后,我们首先会做一个板级初始化,主要做什么事情?主要是初始化一些比如说时钟、串口、GPIO等基本的外设。接下来就可以进行内核初始化,初始化内核之后,你再去创建自己想创建的任务,调用TOS START就可以启动这个内核,进行任务调度。目前来说主要常见的任务创建流程主要是自己写这个业务函数入口,配置好任务优先级,调用这个创建就可以了,这边有一个简单的事例,整个OS的任务创建流程都有的。右边是我们任务模块提供的API,都是非常精简,常用的。

接下来要学会怎么去用我们的IPC通信模块。我们目前基础内核IPC通信模块主要包括互斥量、信号量、事件、队列。互斥量主要是用于共享资源的互斥排他性访问保护。这个说白了是一个锁,我要用这个资源先锁了,用完了之后再释放,让其他有机会去使用这个资源。信号量也是我们任务间同步的一个机制,主要解决生产者和消费者的问题。比如说我们在消费需要调用PEND去等待这样一个资源,他会调用一个POST去释放,然后通知刚才PEND的任务去使用。同样还有事件,但事件不同于信号量,他可能释放一个事件触发多个任务去响应这个事件。队列可能会提供一些任务之间的数据传递,不单单是同步,可能更多在任务中间传递整个的数据。右边我们IPC所有的接口都在这里,大家都可以参考这个接口API去使用。

OS内存管理。我们当前主要有两个内存管理模块,一个是支持动态内存的堆内存管理,还有一个是静态内存的块内存管理,其实基本的使用流程都差不多。刚开始我们需要在配置文件里面把这个功能模块使能了,我们需要调用函数去创建一个内存池。同样块内存的使用方式也非常类似的,我们申请一个内存池然后去分配释放。另外我们的基础内核也还包括系统管理、时间管理、软件定时器、功耗管理等模块。这个我不展开,详细的使用办法可以参考我们的开发指南。

下面我重点介绍一下TencentOS tinyAT通信模组适配框架,模组的适配框架。我们知道在平时的物联网产品中使用了非常多的通信模组,而且不同厂家的模组AT指令都不太一样。那么业务在使用的时候也不一样。假如说我由于一些特殊的原因,需要更换模组,那么这个去适配起来非常麻烦,或者说你需要做很多的一些变更,从而带来非常大的开发工作量。这里我们希望提供这样一个AT框架能帮忙去屏蔽通信模组复杂的数据流处理逻辑,去简化我们上层业务调用的逻辑,从而减少一些开发的工作量。这里我们主要针对几类的模组进行处理。

第一个是通用的空口TCP/IP模组。比如说我们一些WI-FI、NBIoT、2G模组他支持普通的TCI/IP通道,我们基于这些模组去做一层SAL层的框架。另外比如说LORAWAN模组,因为LORA WAN所有的操作,其实都差不多,我们会归一类做一个适配API。另外我们同事提到的腾讯定制模组,我们也会针对定制模组提供一API。那么这样上层用户他所有调用API的形式都是一样的,不会变化。

那所有的差异在哪解决?差异在我们的框架及我们通信模组库里解决,也就是说我们会在串口硬件下面,通信模组库里面建立一个庞大的生态库,不说100%,希望越来越多增加模组驱动,支持市面上60-70%的通信模组,把市场上主流的都覆盖进来。对于厂家或者是物联网产品开发者,需要选择这个模组的时候,他可以到我们库这个里面来选择,他免去了封装,不需要做移植。因为我们整套都是可以跑通的,直接调上层的API就能完成。比如说选择了ESP8266,他也不用适配,直接调用上层API,使用我们腾讯云CSDK直接上云去了。基本上对模组的适配工作量等于零,对于其他的,比如腾讯定制模组也是一样的。

这里需要讲一个区别是什么呢?腾讯定制的模组,包括LORA WAN和SAL的一个区别,SAL因为只提供了基本的TCP IP通道,所以你在上面还需要做应用层的协议,比如说C-SDK。但是腾讯定制模组把C-SDK直接植入到模组里面去,也就是说他的AT模组集成了应用层协议直接对接到云。所以说这个是有一个区别的。我们同一个框架上能把这几种不同的情况都支持起来,尽量减少用户处理这个AT指令包括数据的收发复杂的问题。当然有人问到你的模组费假如没有支持怎么办?不用担心,我们也提供了非常多的参考例子,实际上是AT指令不同,你可以自己根据我们这个框架,把你的模组AT指令填进去就可以了。比如说我们可能需要适配的是初始化连接SEND这样AT的一个实现。这里举了一个简单的例子,ESP8266的一个操作,他对外API这个参数其实是一定,说具体里面的AT实现可能每家模组都不一样,你做一下修改就可以了,整个框架不会做太大的变更。

如何基于TencentOS tiny及腾讯C-SDK来实现我们的上云。左侧的图是基于TencentOS内核的腾讯C-SDK,也就是说我们把腾讯云的C-SDK也纳入到我们TencentOS tiny的一部分,也是一个核心的上云组件。我们集成过来跟嵌入式是有一些区别的,我们会在这个基础上做一些优化。这里我先说一下,我们把C-SDK植入到我们的OS里面之后,大家可能不需要自己去做,这个东西在我们的OS里面,不会让你直接操作。

第二个我们TencentOS tiny会向下去建立多种的联网方式,我刚才也讲了,会支持不同的通信模组的接入,你选择其中一个就可以了,向上的业务也简化了。另外我们刚才说了对于资源受限的情况,对于腾讯云的C-SDK也做了一些优化和裁剪,尽量降低我们终端使用C-SDK的成本。在我们的文档里面也会详细介绍,告诉大家怎么使用腾讯的C-SDK上云,这里我不会展开讲。到时候申请内测之后拿到源码以后,我们会有详细的介绍。

Q:您好,我想问一下如果通信不好,比如我这个东西采集一些数据,如果通信不好会不会有些数据有缓存或者有些存储的数据?

A:这个看是在端侧还是在云侧,如果在端侧,你的通信模组在发送的时候他会有一个缓存区的。包括输入数据也是一样的,你发过来也是这样做处理的。你没有发送完成,没有收到一个ACK的话,不会去发下一个的。接收的数据会一直往一个里面去放,不会说把他丢掉。而且协议上会保障在通信的时候,比如说MQTT通信,你一定要确认QoS设置选项,你要确定他收到ACK之后,你才能认为发送出去了,没有成功的话只能重发。

Q:您好,我问一下他这个怎么跟安卓studio结合,去开发APP。

A:首先我们TencentOS tiny主要是在端侧,在端侧他不会有应用APP的开发,当然我们在后续也会想办法在端侧去开发这种端侧应用。但是在嵌入式的方面一般不会直接开发,安卓的应用包括小程序都是在平台,你可以理解为平台的右侧去开发小程序。也就是说我们的数据送到云端之后,你调用腾讯云的一些API去开发应用程序,获取到云,通过云端下发命令到平台,平台再下发到我们OS这一级。

0 人点赞