队列--参考源码(转)
源:http://blog.csdn.net/zyboy2000/article/details/4587037
(u32)(((DataQueue *)0)->Buf)的值为队列中从out指针到函数指针 (* WriteFull)() 总的字节数24字节, 真实队列数据应该是后24字节的数据,由于DataQueue 结构体28字节(由于结构体对齐可知),所以建立的队列数组长度至少要大于等于28字节。-KEIL+ARM
typedef struct {QUEUE_DATA_TYPE *Out; /* 指向数据输出位置 */QUEUE_DATA_TYPE *In; /* 指向数据输入位置 */QUEUE_DATA_TYPE *End; /* 指向Buf的结束位置 */u16 NData; /* 队列中数据个数 */u16 MaxData; /* 队列中允许存储的数据个数 */u8 (* ReadEmpty)(); /* 读空处理函数 */u8 (* WriteFull)(); /* 写满处理函数 */QUEUE_DATA_TYPE Buf[1]; /* 存储数据的空间 */
} DataQueue; /*********************************************************************************************************
** 函数名称: QueueCreate
** 功能描述: 初始化数据队列
** 输 入: Buf :为队列分配的存储空间地址
** SizeOfBuf:为队列分配的存储空间大小(字节)
** ReadEmpty:为队列读空时处理程序
** WriteFull:为队列写满时处理程序
** 输 出: NOT_OK:参数错误
** QUEUE_OK:成功
** 全局变量: 无
** 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陈明计
** 日 期: 2003年7月2日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/u8 QueueCreate(void *Buf,u32 SizeOfBuf,u8 (* ReadEmpty)(),u8 (* WriteFull)())
{DataQueue *Queue;if (Buf != NULL && SizeOfBuf >= (sizeof(DataQueue))) /* 判断参数是否有效 */{Queue = (DataQueue *)Buf;/* 初始化结构体数据 */Queue->MaxData = (SizeOfBuf - (u32)(((DataQueue *)0)->Buf)) / sizeof(QUEUE_DATA_TYPE); /* 计算队列可以存储的数据数目 */Queue->End = Queue->Buf + Queue->MaxData; /* 计算数据缓冲的结束地址 */Queue->Out = Queue->Buf;Queue->In = Queue->Buf;Queue->NData = 0;Queue->ReadEmpty = ReadEmpty;Queue->WriteFull = WriteFull;return QUEUE_OK;}else{return NOT_OK;}
}/*********************************************************************************************************
** 函数名称: QueueRead
** 功能描述: 获取队列中的数据
** 输 入: Ret:存储返回的消息的地址
** Buf:指向队列的指针
** 输 出: NOT_OK :参数错误
** QUEUE_OK :收到消息
** QUEUE_EMPTY:无消息
** 全局变量: 无
** 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陈明计
** 日 期: 2003年7月2日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
u8 QueueRead(QUEUE_DATA_TYPE *Ret, void *Buf)
{u8 err;DataQueue *Queue;err = NOT_OK;if (Buf != NULL) /* 队列是否有效 */{ /* 有效 */Queue = (DataQueue *)Buf;if (Queue->NData > 0) /* 队列是否为空 */{ /* 不空 */*Ret = Queue->Out[0]; /* 数据出队 */Queue->Out++; /* 调整出队指针 */if (Queue->Out >= Queue->End){Queue->Out = Queue->Buf; }Queue->NData--; /* 数据减少 */err = QUEUE_OK;}else{ /* 空 */err = QUEUE_EMPTY;if (Queue->ReadEmpty != NULL) /* 调用用户处理函数 */{err = Queue->ReadEmpty(Ret, Queue);}}}return err;
}/*********************************************************************************************************
** 函数名称: QueueWrite
** 功能描述: FIFO方式发送数据
** 输 入: Buf :指向队列的指针
** Data:消息数据
** 输 出: NOT_OK :参数错误
** QUEUE_FULL:队列满
** QUEUE_OK :发送成功
** 全局变量: 无
** 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陈明计
** 日 期: 2003年7月2日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#ifndef EN_QUEUE_WRITE
#define EN_QUEUE_WRITE 1
#endif#if EN_QUEUE_WRITE > 0u8 QueueWrite(void *Buf, QUEUE_DATA_TYPE Data)
{u8 err;DataQueue *Queue;err = NOT_OK;if (Buf != NULL) /* 队列是否有效 */{Queue = (DataQueue *)Buf;if (Queue->NData < Queue->MaxData) /* 队列是否满 */{ /* 不满 */Queue->In[0] = Data; /* 数据入队 */Queue->In++; /* 调整入队指针*/if (Queue->In >= Queue->End) {Queue->In = Queue->Buf; }Queue->NData++; /* 数据增加 */err = QUEUE_OK;}else{ /* 满 */err = QUEUE_FULL;if (Queue->WriteFull != NULL) /* 调用用户处理函数 */{err = Queue->WriteFull(Queue, Data, Q_WRITE_MODE);}}}return err;
}
#endif
队列--参考源码(转)相关推荐
- python图片转文字_【收藏】图片转成文字的方法总结,python批量图片转文字信息参考源码...
在日常办公或者学习中,往往存在这样一个工作场景,比如,"老王,我这里有一张图片,你把里面的文字信息给我整理出来",都2021年了,你真的还在手敲图片文字信息么?那么还不赶紧收藏这篇 ...
- 面试官系统精讲Java源码及大厂真题 - 23 队列在源码方面的面试题
23 队列在源码方面的面试题 人要有毅力,否则将一事无成. 引导语 队列在源码方面的面试题,一般面试官会从锁,线程池等知识点作为问题入口,慢慢的问到队列,由于锁.线程池咱们还没有学习到,所以本章就直奔 ...
- 【收藏】图片转成文字的方法总结,python批量图片转文字信息参考源码
在日常办公或者学习中,往往存在这样一个工作场景,比如,"老王,我这里有一张图片,你把里面的文字信息给我整理出来",都2021年了,你真的还在手敲图片文字信息么?那么还不赶紧收藏这篇 ...
- MATLAB视频运动目标检测参考源码
MATLAB视频运动目标检测参考源码 将视频截取成帧 fileName = 'q.avi'; %此处输入视频名称,要带后缀,注意好像只有wmv和avi格式 obj = VideoReader(file ...
- 【队列源码研究】消息队列beanstalkd源码详解
顺风车运营研发团队 李乐 1.消息队列简介 计算机软件发展的一个重要目标是降低软件耦合性: 网站架构中,系统解耦合的重要手段就是异步,业务之间的消息传递不是同步调用,而是将一个业务操作分为多个阶段,每 ...
- java 头尾 队列_源码|jdk源码之栈、队列及ArrayDeque分析
栈.队列.双端队列都是非常经典的数据结构.和链表.数组不同,这三种数据结构的抽象层次更高.它只描述了数据结构有哪些行为,而并不关心数据结构内部用何种思路.方式去组织. 本篇博文重点关注这三种数据结构在 ...
- 六、阻塞队列与源码分析(上)
一.阻塞队列BlockingQueue 1.先理解Queue.Deque 1.Queue(队列):用于保存一组元素,不过在存取元素的时候必须遵循先进先出原则.队列是一种特殊的线性表,它只允许在表的前端 ...
- 使用Reflector 反编译 NPOI 查看源码,参考源码修改NPOI创建word 页眉中添加锚点图片
上篇文章使用了inline方式往页眉中插入图片,因为这种方式插入的图片不好按照坐标定位方式调整图片的摆放位置,所以只能参考NPOI 源码中inline的方式修改添加CT_Anchor 锚点的方式 首先 ...
- 阻塞队列 — DelayQueue源码分析
点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 DelayQueue 由优先级 ...
最新文章
- 用NumPy genfromtxt导入数据
- ​使用端到端立体匹配网络进行单次 3D 形状测量,用于散斑投影轮廓测量
- 15名优秀女科学家拟获重量级荣誉
- html与java接口,JavaWeb学习——Servlet相关的接口和类
- Shell——流程控制
- python编程(数据库操作)
- 一步一步学Entity Framework 4(2)
- jsp ejb mysql_关于UTF-8 JBoss,JSP,EJB,MySQL,STRUTS的中文处理方案
- Numpy学习笔记(三)
- centos7 端口3306无法连接问题
- gentoo linux 内核,Gentoo编译内核
- 15行代码轻松绕过淘宝反爬虫机制
- JVM 垃圾回收(GC)
- android模拟器 百度云盘,MEmu逍遥安卓模拟器海外纯净版
- Swagger 文档中文版,国产API 文档工具使用教程
- 密码学笔记5 非对称密钥算法
- 7-5 宿舍谁最高? (20 分)
- 20世纪最好的10个算法(转)
- Flutter页面传递中文参数问题
- su Authentication failure解决方法