1、uc/os-ii队列原理
消息队列是线程间通讯的一种,主要用作数据缓冲,用途非常广泛。一般情况下遵循先进先出原则。先来看队列结构体:
uc/os-ii使用一个指针数组实现了消息队列,数组中每个元素可以存放一个指针。当然如果不传输指针传输普通数据也是可以的。
这个指针数组经过函数osqcreate()处理后变成如下这个样子。osqin、osqout都指向起始位置。
这其实是一个环形队列结构,现在把上面的图形掰弯,如下:
工作原理大致是:
当osqpost()函数向队列中放数据后,osqin移动一个位置。如果osqin指针已经旋转到末尾,则重新指向起始位置。osqin指向数据即将要插入的位置,换句话说它指的地方是“空的”。
osqpend()函数从队列中取出数据后osqout移动一个位置。如果osqout指针已经旋转到末尾,则重新指向起始位置。osqout指向最“旧”的数据, 换句话说它指的地方是“满的”。
数据取放示意图如下:
2、队列相关函数介绍
osqcreate()
初始化事件结构体,根据参数提供的内存起始地址以及大小,把这一块内存初始化为环形队列。
osqpost()
此函数尝试存入数据,如果有线程正在等待数据,则选取最高优先级的线程,并把它恢复为运行态。数据直接给了等待线程,没有进入环形队列。
如果没有线程等待,此函数把数据放入队列,放入后osqin移动一个位置,如果osqin已经到了osqend位置,重新设置为osqstart。
如果队列已经满了,再次调用此函数,直接返回错误码,不会覆盖队列中的数据。
osqpend()
此函数尝试从队列取出数据,如果队列中有数据,那么把最旧的数据取出来。交给线程即可。如果队列是空队列,则挂起当前线程,直至其它线程向队列发送数据或者线程等待超时。
osqaccept()
队列中有数据取出来,没有数据也不会挂起线程。可用于查询。
osqflush()
清空队列
osqpostfront()
反向放数据,把数据放到队列尾部。
osqquery()
队列信息查询,信息放到结构体中。
ARBOO(艾宝)军工笔记本 野外作业必备
分析师看好亚马逊新平板
天津海光信息半导体公司,营收超23亿,市值上千亿
NVIDIA发布GeForce 442.59显卡驱动 专门针对新游戏进行性能优化
构建一个简单的升降压稳压器并在面包板上对其进行测试
uC/OS-II队列原理 队列相关函数介绍
给新机魅族MX7让路,旗舰机魅族MX6降价成千元机:魅族手感最好的一款,4G+32G+X20
智慧泵房控制系统解决方案
至纯科技拟1.75亿元转让威顿晶磷10.09%股份
苹果iPhone出货量达8180万部 苹果再度成为全球第一大智能手机供应商
苹果为控制成本新iPhone或将砍掉3DTouch功能
OLED拼接屏的优势
MAX8660/MAX8661 PCB布局指南
rfid怎样更好的实现人员定位
小米max2什么时候上市?大屏爱好者的福音:双版本+售价1999元!小米max2可能在下周发布
发光二极管的颜色用途
移远5G/4G/LPWA模组在智能电网中的应用
半导体存储器芯片中只读存储器的分类及特点应用
人工智能芯片的独立感知层将成为推动智能座舱高速发展的关键驱动力
iphone8什么时候上市?iphone8最新消息:iphone8开启全面屏时代,双摄+指纹