搜索
bottom↓
回复: 16

[LIB][ICC][GCC][IAR]AVR Software Framework - QUEUE[Service]

[复制链接]

出0入296汤圆

发表于 2009-8-7 18:53:50 | 显示全部楼层 |阅读模式


<font color=red>[使用说明]



    1、这是一个通用队列模板

    2、定义一个队列请使用宏 START_DEFINE_QUEUE()  和  END_DEFINE_QUEUE
       其中 START_DEFINE_QUEUE()需要传递一些参数
           # define START_DEFINE_QUEUE(__NAME,__SIZE,__TYPE,__POS_TYPE)
              __NAME :       队列的名称
              __SIZE :       队列的大小
              __TYPE :       队列中每一个元素的类型,注意,如果这个队列要被中断处理程序使用
                             请一定要在实际类型后面加入一个volatile例如
                             uint16_t volatile
                             需要注意,volatile的位置对某些编译器比较敏感例如IAR,所以最好
                             放在后面
              __POS_TYPE :   队列元素计数器的类型。注意,当__SIZE大小超过255时,__POS_TYPE
                             至少需要定义为uint16_t,当然,如果__SIZE小于256,那么用uint8_t
                             就是最划算的了。这个类型同样要考虑volatile的情况。
       一个典型的例子如下:
       START_DEFINE_QUEUE
           (
               ADCBuffer,             //定义了一个队列用来存放ADC采样数据
               30,                    //队列的大小是30
               volatile uint16_t,     //队列的元素显然是uint16_t,兼容中断模式
               volatile uint8_t       //同样考虑中断模式的问题
           )
       END_DEFINE_QUEUE   

    3、使用如下的宏,就可以进行队列操作,当然要记得将之前定义的队列名称作为参数传递给宏:
        # define GET_QUEUE_DATA(__NAME,__ADDR)          //从队列中取一个元素放到指定的地址中
        # define PEEK_QUEUE_DATA(__NAME,__ADDR)         //从队列中预读(支持连续预读)一个元素[注1]
                                                        //到指定的地址中
        # define ADD_QUEUE_DATA(__NAME,__VAR)           //向队列中添加一个元素
        # define GET_QUEUE_COUNT(__NAME)                //读取当前队列元素的个数
        # define CHECK_QUEUE_EMPTY(__NAME)              //判断队列是否为空
        # define GET_QUEUE_PEEK(__NAME)                 //将所有预取的数据全部从队列中丢弃[注1]
        # define MARK_QUEUE_PEEK(__NAME)                //记录当前队列读取指针的位置[注1]
        # define RESET_QUEUE_PEEK(__NAME)               //复位预取指针到先前记录的位置[注1]

    4、通过下面的宏,可以将队列操作函数的函数指针取出,当然要记得将之前定义的队列名称作为参数传递给宏:
        # define FN_GET_QUEUE_DATA(__NAME)
        # define FN_PEEK_QUEUE_DATA(__NAME)
        # define FN_ADD_QUEUE_DATA(__NAME)
        # define FN_GET_QUEUE_COUNT(__NAME)
        # define FN_CHECK_QUEUE_EMPTY(__NAME)
        # define FN_GET_QUEUE_PEEK(__NAME)
        # define FN_MARK_QUEUE_PEEK(__NAME)
        # define FN_RESET_QUEUE_PEEK(__NAME)

    5、如果要将队列在整个工程中使用,需要用下面的宏将对列依类似对全局变量增加extern说明的方法加入到.h
       文件中:
       EXTERN_REFERENCE_QUEUE(__NAME,__TYPE,__POS_TYPE)
       这里参数的意义,请参考 条目2
       一个典型的例子:
       EXTERN_REFERENCE_QUEUE(ADCBuffer,volatile uint16_t, volatile uint8_t)
      
    6、关于[注1]中提到的连续预取系统,请参考后面帖子的详细讲解。


[目录结构]

     [Project]
        |
        - Service
        |  |
        |  - Queue
        |      |
        |      - Queue.h
        |
        + UTILS



[相关下载]

点击此处下载 ourdev_468483.rar(文件大小:13K) (原文件名:Queue.rar)

出0入296汤圆

 楼主| 发表于 2009-8-7 18:54:00 | 显示全部楼层

出0入296汤圆

 楼主| 发表于 2009-8-7 19:19:12 | 显示全部楼层
占位

出0入0汤圆

发表于 2009-8-7 21:05:28 | 显示全部楼层
居然到第2页了还没人支持一下,傻孩子会伤心的~

出0入0汤圆

发表于 2009-8-7 21:06:49 | 显示全部楼层
我滴乖乖,又见老大的作品了~~~

出0入0汤圆

发表于 2009-8-7 21:20:55 | 显示全部楼层
占位学习

出0入0汤圆

发表于 2009-8-8 23:25:12 | 显示全部楼层
来晚一步,顶起~~
关于队列的使用,在工程中起到什么作用?是起到调度的吗?不太明白,请版主赐教

出0入0汤圆

发表于 2009-8-8 23:31:41 | 显示全部楼层
搬凳子……

出0入296汤圆

 楼主| 发表于 2009-8-9 00:24:50 | 显示全部楼层
to 【6楼】 ddaitt999 东东
    队列是嵌入式系统中一种很常见的数据结构,主要用于流处理中数据的存储。
    队列用得好的话,还可以用于从流中匹配和识别出自己所需的特征数据。我会在2楼介绍这一技术。

出0入0汤圆

发表于 2009-8-9 14:19:39 | 显示全部楼层
期待大作~~您的《深入浅出...》应经读完,受益的活已经说过N多边喽。在你的“推荐一些图书”中大都是英文的,限于英语水平,不能很好的阅读,我想肯定也有不少网友都读不好这些书籍吧,不知道这些书籍有没有翻译成中文的!!《大道至简》在读,读后深受启发的~
真是感谢傻孩子的推荐

出0入0汤圆

发表于 2009-11-2 16:04:39 | 显示全部楼层
2楼什么什么时候补上内容?期待……

出0入0汤圆

发表于 2010-8-26 09:58:02 | 显示全部楼层
这个东西怎么用啊

出0入0汤圆

发表于 2010-9-30 20:08:46 | 显示全部楼层
强人啊

出0入0汤圆

发表于 2011-3-28 13:14:23 | 显示全部楼层
请教:下面两种结构没懂。。
SAFE_CODE_PERFORMANCE\//这是什么
     EXIT_SAFE_CODE\

START_DEFINE_QUEUE//两个怎么配对的
       END_DEFINE_QUEUE

------------------------
看了一会终于明白了SAFE_CODE_PERFORMANCE。。是原子操作,防止SAFE_CODE_PERFORMANCE(Code)中Code段代码因中断而出错
START_DEFINE_QUEUE与END_DEFINE_QUEUE 配对是为了好看吗?求证。。。。。。。

出0入0汤圆

发表于 2011-3-28 14:25:07 | 显示全部楼层
通常, Queue 的操作會叫做 Enqueue 和 Dequeue
很少用 Add Queue 和 Get Queue

就好像 Stack 的操作會叫 Push / Pop

FYI.

出0入0汤圆

发表于 2013-5-10 11:31:09 | 显示全部楼层
附件里没有这些函数的源文件啊 什么时候讲预取啊?

出0入296汤圆

 楼主| 发表于 2013-5-10 12:04:40 | 显示全部楼层
sbk100 发表于 2013-5-10 11:31
附件里没有这些函数的源文件啊 什么时候讲预取啊?

这是一个模板,代码就在 RD_TPL_Queue.h 里
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 15:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表