全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

uC/OS-II队列原理 队列相关函数介绍

时间:2023-09-11 15:04

人气:

作者:admin

标签: 原理  函数  OS-II  相关  队列 

导读:消息队列是线程间通讯的一种,主要用作数据缓冲,用途非常广泛。一般情况下遵循先进先出原则。...

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()

队列信息查询,信息放到结构体中。

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信