[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) 占位 居然到第2页了还没人支持一下,傻孩子会伤心的~ 我滴乖乖,又见老大的作品了~~~ 占位学习 来晚一步,顶起~~
关于队列的使用,在工程中起到什么作用?是起到调度的吗?不太明白,请版主赐教 搬凳子…… to 【6楼】 ddaitt999 东东
队列是嵌入式系统中一种很常见的数据结构,主要用于流处理中数据的存储。
队列用得好的话,还可以用于从流中匹配和识别出自己所需的特征数据。我会在2楼介绍这一技术。 期待大作~~您的《深入浅出...》应经读完,受益的活已经说过N多边喽。在你的“推荐一些图书”中大都是英文的,限于英语水平,不能很好的阅读,我想肯定也有不少网友都读不好这些书籍吧,不知道这些书籍有没有翻译成中文的!!《大道至简》在读,读后深受启发的~
真是感谢傻孩子的推荐 2楼什么什么时候补上内容?期待…… 这个东西怎么用啊 强人啊 请教:下面两种结构没懂。。
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 配对是为了好看吗?求证。。。。。。。 通常, Queue 的操作會叫做 Enqueue 和 Dequeue
很少用 Add Queue 和 Get Queue
就好像 Stack 的操作會叫 Push / Pop
FYI. 附件里没有这些函数的源文件啊 什么时候讲预取啊? sbk100 发表于 2013-5-10 11:31 static/image/common/back.gif
附件里没有这些函数的源文件啊 什么时候讲预取啊?
这是一个模板,代码就在 RD_TPL_Queue.h 里
页:
[1]