腾讯物联网操作系统TencentOS tiny技术架构及开发案例讲解
腾讯物联网操作系统(TencentOS tiny)是腾讯面向物联网领域开发的实时操作系统,具有低功耗,低资源占用,模块化,可裁剪等特性。TencentOS tiny 为物联网终端厂家提供一站式软件解决方案,方便各种物联网设备快速接入腾讯云,可支撑智慧城市、智能水表、智能家居、智能穿戴、车联网等多种行业应用。
「腾讯云大学」为大家整理了参与了TencentOS tiny技术特性规划及开发的「腾讯云高级工程师戴胜冬」老师直播课的内容。课程针对新接触TencentOS tiny的开发者,从宏观角度分解TencentOS tiny的技术架构,让开发者快速了解TencentOS tiny的软件能力栈;针对弱基础的基于RTOS内核的嵌入式开发者,设计了基于TencentOS tiny的嵌入式RTOS开发范式讲解环节,此环节展示基于嵌入式RTOS内核基本能力的开发案例;针对端测最常见的基于模组联网场景,设计了基于TencentOS tiny模组通讯框架的开发讲解环节,此环节展示基于TencentOS tiny AT框架的模组驱动开发范式;最后一个环节,基于TencentOS tiny集成的腾讯云sdk能力,展示一个具体的上云案例开发流程,助力开发者快速构建自己的物联应用。
一、TencentOS tiny技术架构讲解
下图是TencentOS tiny github官网首页README中的整体架构图。
这个架构较为笼统,我们通过从TencentOS tiny作为一个端测操作系统的角度对架构进行拆解:
TencentOS tiny底层是一个实时操作系统(RTOS)核心,此核心提供了中断管理、内存管理、异常管理、多任务管理、时间管理、实时调度等最基本的RTOS功能,在此之上提供了信号量、互斥锁、事件、消息队列、完成量、计数锁等多任务通信机制。在内核的基础接口之上,提供了cmsis接口适配层,对于用户来说,可以通过cmsis接口访问内核功能,也可以直接访问内核层的接口。
从硬件抽象能力的角度对架构进行拆解,TencentOS tiny对下支持IoT领域最常见的CPU核心(包括arm v6、v7架构,以及RISC-V架构),集成了最常见的mcu板级开发包(noridc、st、nxp、TI等),以及常见的一些硬件驱动包。在内核与板级开发包之间提供一层硬件抽象层,统一化对硬件的访问。
从组件能力的角度对架构进行拆解,针对IoT场景对系统能力的核心诉求,我们围绕内核构建了高效的文件系统、设备管理组件,硬件自组网能力、极简的功耗管理框架、固件OTA差分升级能力等。
作为物联网操作系统,“联网”是一个重要的能力方面。
针对最常见的基于AT模组的联网方式,我们提供了极简的AT框架实现,并实现了基于AT框架的常见模组(esp8266、BC26、SIM800)驱动,对上封装成统一的sal接口;针对基于LoRA的联网场景,集成了常见的LoRA芯片板级驱动及LoRA协议栈,对上封装成统一的LoRaWan API;对于基于open模式的联网能力开发,我们集成了常见的芯片板级驱动及常见的IoT协议栈(ble 5.0、wifi等),并积极与芯片厂商合作,对上封装统一的抽象接口;对于基于以太网的联网方式,我们集成了常见的以太网控制器板级驱动以及LwIP协议栈,对上提供统一的socket接口。
在这些基础联网能力之上,集成TLS/DTLS传输层加密套件以及常见的物联网应用层协议栈(MQTT、CoAP、HTTP)。
二、嵌入式RTOS开发范式讲解
从上云能力的角度来看,以前面所述的联网能力为基础,我们集成了无缝对接腾讯云的SDK套件,提供端测快速对接云端MQTT、CoAP、OTA、Shadow等能力。
RTOS是实时操作系统(RealTime OperationSystem)的缩写,使用的场景一般是对实时性处理要求较高的、资源受限的设备,可以解决裸机程序下“多任务”之间不可能实时抢占的问题。
我们从三个维度考虑为什么使用RTOS:
一、你的场景是否是资源受限的?二、你的硬件是否带内存管理单元?三、你的业务场景是否有实时性诉求?
再了解了什么是RTOS后,我们该如何使用RTOS呢?多任务的本质就是提供了上下文yield语义,以及高优先级抢占式调度的策略。基于RTOS开发,相较于逻辑程序而言,可以享受一系列多任务间异步同步的机制。
互斥锁主要是解决多任务之间临界区资源的互斥性访问的问题,使用互斥锁可以保证一段临界区资源在任意时刻只会有一个任务在对其进行访问。假设你有一段代码,或者一段数据,当有多个任务并行操作时,会导致结果的不确定性(不可重入性,这段代码或者数据就叫临界区资源)。而你的业务恰恰存在这种情况,并且想得到这种确定性,那么在访问这段代码或这段数据(临界区)前,使用互斥锁来确保一个临界区,在任意时刻,只会有一个任务在对其进行访问。
信号量解决的是“系统可用资源数”信息在多任务间传递的问题,通俗化理解就是,对系统某种资源可用数量进行仲裁、管理的机制,可以用来操作系统中最经典的解决生产者、消费者问题。
事件解决的是多任务之间传递一种“信号类”信息,一个具体的事件就是一个uint32_t中的比特位。
队列用来解决多任务之间传递带负载的消息。有些RTOS实现中也称之为“邮箱”。“事件”机制是通知一个任务发生了一件什么事,更多具体的信息就没有了。队列提供了传递“额外信息”的机制。
总结一下以上的基本组件之任务间通信:
1. 互斥锁解决的是不可重入资源的竞争性访问:谁先获得了锁,谁才有权访问资源。2. 信号量解决的是系统“可用资源数”这个信息在各任务间同步的问题:生产者、消费者问题。3. 事件解决的是任务间某种“事件”是否发生的同步问题。4. 队列[邮箱]解决的是带“负载”的消息传递问题。
当需要定时触发一些逻辑时,会使用到软件定时器。软件定时器是不依赖于特定硬件,纯粹用软件实现的定时器。可以实现“任务”的定期执行。
系统在没有用户业务需要处理的时候(进入idle),系统会自动进入低功耗模式(sleep),TencentOS tiny实现了两级功耗管理方案:第一级功耗管理,直接在系统配置文件tos_config.h中使能TOS_CFG_PWR_MGR_EN配置项即可,系统会在没有用户业务需要处理的时候(进入idle)自动进入低功耗模式。第二级功耗管理,提供“非周期性”时钟机制。需要用户在tos_config.h中使能TOS_CFG_TICKLESS_EN配置项,并实现唤醒闹钟机制以及tickless配置接口。
三、模组通信框架开发讲解
模组通信框架基于AT指令的模组通信方式,使用起来较为繁琐,用户要处理很多与模组之间串口的同步、异步通信流程。模组通信框架,是基于TencentOS tiny对串口的hal抽象接口,以及内核提供的信号量、互斥锁、字符队列等机制,实现的一套AT处理框架,并基于AT框架实现最常见的AT模组驱动,对上提供统一的SAL访问接口,极大简化用户对AT模组的使用流程。
以下是一个最典型的基于SAL接口及AT框架的模组访问案例:
首先我们通过串口发送AT+RESTORE的命令让模组复位,第二步把这个模组设置为station模式,再设置多连接模式,并最终发布数据。
接下来我们谈谈怎么使用模组通信框架。
Void tos at uart write byte 这个接口是用来向AT框架灌入数,一般用于与模组连接的串口中断处理函数中被调用。串口中断中收到数据后(从模组来的),调用此接口将数据灌入AT框架。
AT框架提供了一系列的接口,可以辅助用户编写模组访问的AT驱动。
上图是基于AT框架编写自己的模组驱动的流程:
- 编写单板的串口驱动(一直吃的板级包不需要用户自己编写,如果不在我们的vendor bsp范围内,需要用户自己适配hal_uart_init接口)。
- 编写连接模组的串口中断服务程序,在中断服务程序中获取串口过来的数据,并调用tos_at_uart_write_byte向AT框架中灌入数据。
- 按照sal模组接口标准构造自己的驱动模型。
- 编写自己的模组初始化接口。一般是调用tos_at_init初始化AT框架、注册当前模组驱动、初始化当前模组驱动。
- 利用AT框架提供的接口实现驱动接口。实现connect、send、recv等基本驱动接口。
在直播课中,戴胜冬老师讲解了几个驱动编写案例。
四、上云案例开发讲解
TencentOS tiny基于TencentOS tiny开发评估套件及eps8266 AT模组的对接腾讯云mqtt服务的案例:
TencentOS-tiny\board\TencentOS_tiny_EVB_MX\KEIL\tencent_cloud_sdk_mqtt
1、qcloud_device_create 创建一个端测设备,接口参数为在云上控制台中返回的设备信息。2、qcloud_mqtt_connect_opt_create 创建mqtt连接选项。3、qcloud_mqtt_client_create 用创建的设备及mqtt连接选项创建一个mqtt client。4、qcloud_mqtt_client_connect 发起mqtt连接。5、qcloud_mqtt_client_subscribe 订阅主题。6、qcloud_mqtt_client_publish 发布主题。7、qcloud_mqtt_client_yield mqtt连接保活。
TencentOS tiny还提供了小程序框架,可以无缝对接腾讯云openAPI平台,直接在小程序中访问设备状态及设备状态控制。
五、内容总结:
- 了解TencentOS tiny组件架构,快速定位自己的诉求。
- RTOS开发基本范式讲解,快速入门,开启嵌入式RTOS开发旅程。
- 了解模组驱动开发框架,快速适配自己的新模组。
- 了解上云开发流程,快速构建自己的上云程序。
除了文中提到的驱动和端侧对接云端的案例外,再直播课中还演示了TencentCloud IoT Hub平台的使用,想具体了解的同学可以观看详细的课程录播视频。