RTOS信号量、队列通信原理

有深入理解rtos原理,或阅读过rtos源码的同学应该知道:rtos实现任务间通信通常是由一系列指针进行操作实现的。  任务间通信的“有效数据”,其实也是由指针指向一个“变量”或“数组”实现的。  1.信号量 信号量,本质是传递一个“事件”。比如:任务a完成发送数据,通过信号量通知任务b。
ossempost(eventsem_sendok);  
我们主要想传递“完成发送数据”这个“事件”,进一步分析,其实就是一个“标志”或“变量”。
2.队列 队列和信号量原理类似有点类似,只是这里是“变量”。比如:串口接收完成一帧数据,通过队列发送给任务b.
osqpost(uartrcvqueue, rcvbuf);  
相比信号量,队列传递的数据量更大,队列传递的有效数据一般是“数组”。
还有邮箱,与队列类似,可以理解为“二维数组”。
写到这里,你会发现,不管信号量,还是队列,底层本质也是传递“变量”“数组”。
那么问题来了:rtos任务间通信为什么不用全局变量?
这个问题比较常见,也看到在我的技术交流群有讨论,所以就简单来分享一下看法。
全局变量有什么问题?
rtos任务间通信为什么不用全局变量?原因在于使用全局变量存在诸多弊端。  1.抢占问题两个或多个任务,都要去“使用”同一个全局变量,如果不添加任何“互斥”措施,必定会存在抢占的问题。  2.代码规范问题整个项目只有少数几个全局变量没什么问题,如果是整个项目有几十个,甚至几百个全局变量,你觉得这样的代码,后面好维护吗?  经过多次迭代,代码只会越来越难理解,越来越难阅读。  3.耦合性问题全局变量会导致分层不合理与模块化编程相违背,你的全局变量没有归属,既不是任务a,也不是模块a,最终可能“任人宰割”导致“夭折”。  4.安全性问题有一句话怎么说的呢,全局变量是项目的“罪魁祸首”,项目做大之后,一旦有小修改,可能就会引发大bug.      全局变量还有很多弊端,这里就不一一描述了,总之一点:慎用全局变量。  当然,以上描述的问题(弊端)都是基于项目中存在多个变量的情况,如果项目只有1、2个全局变量,这种不在本文讨论范围之内。   信号量、队列通信原理
大部分rtos的信号量、队列都是使用指针、结构体、数组等,结合系统进行“封装”,使任务间通信更加有效、安全,同时也遵循“高内聚低耦合”的原则。  比如ucos的信号量post:                                                             int8u ossempost (os_event *pevent){#if os_critical_method == 3u /* allocate storage for cpu status register */ os_cpu_sr cpu_sr = 0u;#endif#if os_arg_chk_en > 0u if (pevent == (os_event *)0) { /* validate 'pevent' */ return (os_err_pevent_null); }#endif if (pevent->oseventtype != os_event_type_sem) { /* validate event block type */ return (os_err_event_type); } os_enter_critical(); if (pevent->oseventgrp != 0u) { /* see if any task waiting for semaphore */ /* ready hpt waiting on event */ (void)os_eventtaskrdy(pevent, (void *)0, os_stat_sem, os_stat_pend_ok); os_exit_critical(); os_sched(); /* find hpt ready to run */ return (os_err_none); } if (pevent->oseventcnt oseventcnt++; /* increment semaphore count to register event */ os_exit_critical(); return (os_err_none); } os_exit_critical(); /* semaphore value has reached its maximum */ return (os_err_sem_ovf);}    
我们需要传递的有效信息虽然只有一个变量,但它会做“临界区”管理,以及预判一些错误的情况等。
最后,rtos源码也可以算是一个优秀的项目,特别是目前普及率比较高、装机量比较多的rtos,比如µc/os、freertos、rt-thread、threadx等。
最最后,有时间的小伙伴可以阅读一下rtos源码,rtos内核我推荐µc/os,阅读源码能让你掌握一些软件架构的知识,也能让你明白一些开发过程种常见的问题。


笔记本售后服务,用户不能承受之痛
讯景RX5700系列非公版显卡发布 售价3299元
基于RFID技术和物联网技术的车辆防盗怎样实现
如何用一行代码解决空指针问题
国产生物芯片如何追赶国际水平?
RTOS信号量、队列通信原理
如果比特币可以支付买食物的话也就意味着我们可以靠比特币生活
小米6将华丽转身;金属机身,曲面屏+超声波指纹识别,但可能有两版本!
天马微电子拟投资7.4万美元在印度设立子公司
郑州智能传感器产业集群入选中国百强产业集群
人工智能的全面发展到底是不是意味着人类的结束
台积电、日月光同时抢食异构芯片整合商机
谷歌公布FuchsiaOS部分细节 采用全新内核将实现桌面跨平台
协作机器人提升包裹分拣速度 在快递行业发挥着越来越重要的作用
Medtec医疗设计制造展八大看点,有源医疗器械核心部件领风骚
Apollo导航模式详细教程
国产MCU发展的四大阶段总结
热控镍镉充电器电路图
中国电源行业年会在北京圆满召开
iphone8预订量让人失望!iPhone8终于遇冷,全网预售量仅245万,国人不爱iPhone了吗?