|
<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) |
|