Gorgon_Meducer 发表于 2009-8-7 18:53:50

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


<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]中提到的连续预取系统,请参考后面帖子的详细讲解。

[目录结构]
   
      |
      - Service
      ||
      |- Queue
      |      |
      |      - Queue.h
      |
      + UTILS


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

Gorgon_Meducer 发表于 2009-8-7 18:54:00

Gorgon_Meducer 发表于 2009-8-7 19:19:12

占位

snoopyzz 发表于 2009-8-7 21:05:28

居然到第2页了还没人支持一下,傻孩子会伤心的~

jchqxl 发表于 2009-8-7 21:06:49

我滴乖乖,又见老大的作品了~~~

finenesszhang 发表于 2009-8-7 21:20:55

占位学习

ddaitt999 发表于 2009-8-8 23:25:12

来晚一步,顶起~~
关于队列的使用,在工程中起到什么作用?是起到调度的吗?不太明白,请版主赐教

feiyang007 发表于 2009-8-8 23:31:41

搬凳子……

Gorgon_Meducer 发表于 2009-8-9 00:24:50

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

ddaitt999 发表于 2009-8-9 14:19:39

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

alexmayer 发表于 2009-11-2 16:04:39

2楼什么什么时候补上内容?期待……

gnensis 发表于 2010-8-26 09:58:02

这个东西怎么用啊

xtaens 发表于 2010-9-30 20:08:46

强人啊

ww1228 发表于 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 配对是为了好看吗?求证。。。。。。。

TroyLee 发表于 2011-3-28 14:25:07

通常, Queue 的操作會叫做 Enqueue 和 Dequeue
很少用 Add Queue 和 Get Queue

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

FYI.

sbk100 发表于 2013-5-10 11:31:09

附件里没有这些函数的源文件啊 什么时候讲预取啊?

Gorgon_Meducer 发表于 2013-5-10 12:04:40

sbk100 发表于 2013-5-10 11:31 static/image/common/back.gif
附件里没有这些函数的源文件啊 什么时候讲预取啊?

这是一个模板,代码就在 RD_TPL_Queue.h 里
页: [1]
查看完整版本: [LIB][ICC][GCC][IAR]AVR Software Framework - QUEUE[Service]