源: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

队列--参考源码(转)相关推荐

  1. python图片转文字_【收藏】图片转成文字的方法总结,python批量图片转文字信息参考源码...

    在日常办公或者学习中,往往存在这样一个工作场景,比如,"老王,我这里有一张图片,你把里面的文字信息给我整理出来",都2021年了,你真的还在手敲图片文字信息么?那么还不赶紧收藏这篇 ...

  2. 面试官系统精讲Java源码及大厂真题 - 23 队列在源码方面的面试题

    23 队列在源码方面的面试题 人要有毅力,否则将一事无成. 引导语 队列在源码方面的面试题,一般面试官会从锁,线程池等知识点作为问题入口,慢慢的问到队列,由于锁.线程池咱们还没有学习到,所以本章就直奔 ...

  3. 【收藏】图片转成文字的方法总结,python批量图片转文字信息参考源码

    在日常办公或者学习中,往往存在这样一个工作场景,比如,"老王,我这里有一张图片,你把里面的文字信息给我整理出来",都2021年了,你真的还在手敲图片文字信息么?那么还不赶紧收藏这篇 ...

  4. MATLAB视频运动目标检测参考源码

    MATLAB视频运动目标检测参考源码 将视频截取成帧 fileName = 'q.avi'; %此处输入视频名称,要带后缀,注意好像只有wmv和avi格式 obj = VideoReader(file ...

  5. 【队列源码研究】消息队列beanstalkd源码详解

    顺风车运营研发团队 李乐 1.消息队列简介 计算机软件发展的一个重要目标是降低软件耦合性: 网站架构中,系统解耦合的重要手段就是异步,业务之间的消息传递不是同步调用,而是将一个业务操作分为多个阶段,每 ...

  6. java 头尾 队列_源码|jdk源码之栈、队列及ArrayDeque分析

    栈.队列.双端队列都是非常经典的数据结构.和链表.数组不同,这三种数据结构的抽象层次更高.它只描述了数据结构有哪些行为,而并不关心数据结构内部用何种思路.方式去组织. 本篇博文重点关注这三种数据结构在 ...

  7. 六、阻塞队列与源码分析(上)

    一.阻塞队列BlockingQueue 1.先理解Queue.Deque 1.Queue(队列):用于保存一组元素,不过在存取元素的时候必须遵循先进先出原则.队列是一种特殊的线性表,它只允许在表的前端 ...

  8. 使用Reflector 反编译 NPOI 查看源码,参考源码修改NPOI创建word 页眉中添加锚点图片

    上篇文章使用了inline方式往页眉中插入图片,因为这种方式插入的图片不好按照坐标定位方式调整图片的摆放位置,所以只能参考NPOI 源码中inline的方式修改添加CT_Anchor 锚点的方式 首先 ...

  9. 阻塞队列 — DelayQueue源码分析

    点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 DelayQueue 由优先级 ...

最新文章

  1. 用NumPy genfromtxt导入数据
  2. ​使用端到端立体匹配网络进行单次 3D 形状测量,用于散斑投影轮廓测量
  3. 15名优秀女科学家拟获重量级荣誉
  4. html与java接口,JavaWeb学习——Servlet相关的接口和类
  5. Shell——流程控制
  6. python编程(数据库操作)
  7. 一步一步学Entity Framework 4(2)
  8. jsp ejb mysql_关于UTF-8 JBoss,JSP,EJB,MySQL,STRUTS的中文处理方案
  9. Numpy学习笔记(三)
  10. centos7 端口3306无法连接问题
  11. gentoo linux 内核,Gentoo编译内核
  12. 15行代码轻松绕过淘宝反爬虫机制
  13. JVM 垃圾回收(GC)
  14. android模拟器 百度云盘,MEmu逍遥安卓模拟器海外纯净版
  15. Swagger 文档中文版,国产API 文档工具使用教程
  16. 密码学笔记5 非对称密钥算法
  17. 7-5 宿舍谁最高? (20 分)
  18. 20世纪最好的10个算法(转)
  19. Flutter页面传递中文参数问题
  20. su Authentication failure解决方法

热门文章

  1. 从零开始写一个RPC框架的详细步骤
  2. 【翻译】DataHub:流行的元数据架构讲解
  3. Linux系统替换文件内容
  4. 使用React Hooks 时要避免的5个错误!
  5. DHU 数据科学技术与应用【8】 第1-4次单元测验 答案
  6. 谁的青春不迷茫-纪2020
  7. 附录 区块链技术名词与核心原理
  8. 互联网金融中的分期贷款利率剖析
  9. Gdal关于CAD转SHP格式
  10. 启动计算机引导win10,图文详解win10系统电脑开机引导错误的方案