近期腾讯低调地在github上开源了自己的lot操作tencentos tiny,截至发稿,已经累积了2000多个star,引发了不小的关注。由于笔者曾经做过csdn的嵌入式大版当过很长时间的版主,所以第一时间到https://github.com/tencent/tencentos-tiny下载了全部的代码,第一时间为大家带来解读。
tencentos tiny整体架构
tencentos tiny 提供精简的 rtos内核,其架构图如下:
目前看其内核部分已经开发完成,并已经完全开源。从目前tencentos tiny的情况看,腾讯入局物联网的相关链条已经规划完整:
布署了tencentos tiny的的嵌入式开发板也已经制造出来,所以看来鹅厂在物联网时代对于入口的争夺也不会有丝毫的放松。
下面我将对于tencentos tiny代码中内核及lot协议部分进行相关解读。
tencentos tiny内核信号量与互斥锁解读
tencentos tiny的官宣文档中对于其内核的描述如下:tencentos tiny 实时内核包括任务管理、实时调度、时间管理、中断管理、内存管理、异常处理、软件定时器、链表、消息队列、信号量、互斥锁、事件标志等模块。其中定时器、消息队列等在之前都有过相应介绍,这里就为大家来解读一下信号量与互斥锁的相关代码。信号量与互斥锁的异同:1.信号量与互斥锁最根本的不同点在于:互斥锁的取值只能是0或者1,而信号量的取值范围则可以定义。2.信号量的作用域可以进程也可以是线程,而互斥锁只能是线程。简单来说互斥锁可以实现线程对于唯一资源的使用保护,而信号量则可以实现多线程或者进程间数量有限资源的使用保护。从某种意义上讲互斥锁是只能一个资源可用的信号量。关于tencentos tiny互斥体的实现,首先来看其数据结构具体解读如下:
__api__k_err_ttos_mutex_pend_timed(k_mutex_t*mutex,k_tick_ttimeout) { tos_cpu_cpsr_alloc(); k_err_terr; tos_ptr_sanity_check(mutex); tos_in_irq_check(); #iftos_cfg_object_verify_en>0u if(!pend_object_verify(&mutex->pend_obj,pend_type_mutex)){ returnk_err_obj_invalid; } #endif tos_cpu_int_disable();//将cpu锁住,防止其它进程进入 if(mutex->pend_nesting==(k_nesting_t)0u){//没有等待 mutex_fresh_owner_mark(mutex,k_curr_task);//将此mutex的owner置为当前task tos_cpu_int_enable();//将cpu解锁 returnk_err_none;//返回成功 } if(knl_is_self(mutex->owner)){ if(mutex->pend_nesting==(k_nesting_t)-1){//等待数量如果超限则返回overflow tos_cpu_int_enable(); returnk_err_mutex_nesting_overflow; } ++mutex->pend_nesting; tos_cpu_int_enable(); returnk_err_mutex_nesting; } if(timeout==tos_time_nowait){//如果锁已经被占用超时时间为不等待,则直接返回 tos_cpu_int_enable(); returnk_err_pend_nowait; } if(knl_is_sched_locked()){//如果任务被锁定,则直接返回 tos_cpu_int_enable(); returnk_err_pend_sched_locked; } if(mutex->owner->prio>k_curr_task->prio){ tos_task_prio_change(mutex->owner,k_curr_task->prio);//如果owner的优先级更低,也就是其数值更大,则调整优先级 } pend_task_block(k_curr_task,&mutex->pend_obj,timeout);//阻塞pending的任务 tos_cpu_int_enable();//解锁cpu总线 knl_sched();//解锁任务高度 err=pend_state2errno(k_curr_task->pend_state); if(err==k_err_none){//如果没有错误 tos_cpu_int_disable(); mutex_new_owner_mark(mutex,k_curr_task);//刷新mutex当前的owner tos_cpu_int_enable(); } returnerr; }
tencentos tiny信号量的实现
首先来看k_sem_st的结构体:
__static__k_err_tsem_do_post(k_sem_t*sem,opt_post_topt) { tos_cpu_cpsr_alloc();//为cpu的cpsr进行预分配为后面恢复做准备 tos_ptr_sanity_check(sem); #iftos_cfg_object_verify_en>0u if(!pend_object_verify(&sem->pend_obj,pend_type_sem)){ returnk_err_obj_invalid; } #endif tos_cpu_int_disable();//cpu锁定防止其它进程入 if(sem->count==(k_sem_cnt_t)-1){//若资源数量为-1则返回超限 tos_cpu_int_enable(); returnk_err_sem_overflow; } if(pend_is_nopending(&sem->pend_obj)){//如果无pending的情况则直接返回 ++sem->count; tos_cpu_int_enable(); returnk_err_none; } pend_wakeup(&sem->pend_obj,pend_state_post,opt);//唤醒pending的进程 tos_cpu_int_enable();//恢复cpu knl_sched();//恢复任务调度 returnk_err_none; }
所以从上述解读相信各位读者也能看到,tencentos tiny的内核的确是被精心修减过,针对物联网场景做了相应的优化,去掉了一些没有必要的功能代码。
tencentos tiny对于mqtt的实现
在tencentos tiny的官宣中对于iot 协议栈介绍如下:tencentos tiny 提供 lwip、at adapter、sal 层,支持不同的网络硬件,例如以太网、串口 wi-fi、gprs、nb-iot、4g等通信模块。tcp/ip 网络协议栈上提供常用的物联网协议栈,例如 coap、mqtt,支撑终端业务快速接入腾讯云。其中mqtt可以算是物联网时代比较通用的基于ip网络的协议了,它基于发布/订阅消息模式,提供一对多的消息分发有三种消息传递服务质量。1.最多一次,也就是消息发布者只会发布一次消息,不管对端是否收到也不会发布第二次。一般用于环境传感器的数据读取,因为一般环境传感器读取的密度很高,丢失几个数据并没有什么大问题。·2.确保到达,这个一般用在数据非常重要的情况,发送端将不断重复发送直到对端响应收到。但这样可能出现数据重复。3.确保恰好一次送达,确保消息正好到达一次。这个级别用于计费系统,重复或丢失的数据可能导致一定的损失。由于mqtt适合在低带宽、高延时网络运行的特性所以在特联网中的应用很多。不过呢腾讯针对此部分的实现则是完全拷贝于eclipse paho项目个人制作的原理动画如下图:
但是考虑到物联网终端其实仅需要mqtt的发布方即可,订阅方的代码其实没有太大必要保留,而且从目前发布支持的场景来看,mqtt一些通讯质量模式其实用处也不多,不过在这方面tencentos tiny是没有做任何优化与裁减的。所以这应该也可以看做是tencentos tiny的一个不足吧。
后记
随着移动互联网+智能硬件的不断发展,iot的新业态大门徐徐开启,这里不但有众多互联网企业,也有传统家电甚至金融企业不断入局。但是与传统互联网软件+硬件的模式不同,物联网除了软、硬件外还多了一个侧面-场景,能将软、硬件及场景整合化一的公司才能笑到最后。就像html整合了互联网一样,mqtt等lot协议会是整合全链条的利器,所以最后笔者也呼吁各方除了重视操作系统内核外也需要大力参与lot通讯协议,尤其注重标准制订,这样才能跟上lot的时代潮流。
莫之比J10跌倒监测雷达系统,助力老人平安智慧养老!
一文解析2019年车联网领域发展的六大趋势
森海塞尔最新发布HD 800S 75周年纪念版耳机
一体化步进电机驱动控制器方案介绍
基于FPGA进行高速可变周期脉冲发生器设计
全面解析腾讯最新开源 loT 操作系统 TencentOS tiny
比克动力电池聚焦智能终端市场,政策引领需求拉动成就下个风口?
物联网设备怎样让城市变得更加的智能
可靠性基础知识第二期
为什么用电脑USB充电,手机掉电特别快?
CEVA为其CEVA-XC DSP系列提供TD-SCDMA软件IP
探讨多雷达之间互相干扰的有效解决方案
马斯克将把一些电动汽车的三元锂电池换成铁锂电池
低延迟高续航、畅玩手游的五款真无线蓝牙耳机盘点
华硕发布新VivoBook系列笔记本,搭载第10代英特尔酷睿处理器
TBY2222MF贴片Y电容规格参数、规格书、特点以及应用范围
应用在智能门锁触摸屏中的电容式触摸芯片
12月份汽车芯片还缺吗
谐振密度传感器的应用利用谐振进行密度测量的原理
OLED大规模取代液晶是板上钉钉的事?