gen_queue.c
3.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include "gen_queue.h"
#include "string.h"
#include "platform.h"
/*
* 通用环形队列函数:init;in;out;
* 1, 为了确保队列的通用性,将存储的数据抽象出来为 void *;
* 2, 由于抽象出来的数据的不确定性,导致gen_queue_in,gen_queue_out函数中查找数据都只能根据data_len计算得出,无法用数组形式开始查找。
* 3,由于定义环形队列时就已经初始化了,所以无需开放初始化函数;
* 4, data_len可以理解为一维数组的空间大小;同理也可以是一个用户结构体的空间;
* 5,使用实例: GEN_CIRCLE_QUEUE_DEF(transtopc,10,64);
a,意思是用户定义了一个深度10宽度64的环形队列transtopc;(即64字节的数组最多可以存储10组)
b,定义了transtopc_buf[10][64]的数组;(类似malloc功能)
c,定义了一个环形队列transtopc,同时初始化数据指针指向transtopc_buf和其他参数;
d,封装了队列读写函数: transtopc__in(void **data); transtopc__out(void** data); (用户调用方便)
e,使用名字拼接函数CONCAT_2可生成每个队列对应的函数名称;
GEN_CIRCLE_QUEUE_DEF(transtopc,10,64);
void gen_circle_queue_test(void)
{
unsigned char test_data[64];
if(transtopc__in(test_data) >= 0 ){
//存储成功
}
if( transtopc__out(test_data) >= 0){
//读取成功
}
}
*/
//#include "platform_extern.h"
/*
队列初始化*/
void gen_queue_init(GenCircleQueue *queue,GEN_QUEUE_DATA_TYPE **data)
{
queue->pdata = data;
queue->front = queue->rear;
queue->count =0;
}
/*
* 将数据存储到队列尾部
* return:
-1: 队列已满,存储失败;
否则返回操作后队列中元素的个数;
*/
signed short gen_queue_in(GenCircleQueue * const queue,const GEN_QUEUE_DATA_TYPE* data)
{
signed short retval;
PLATFORM_DISABLE_IRQ();
if( (queue->front ==queue->rear)&&(queue->count >= queue->node_size ) )
retval = -1;
else{
//memcpy(queue->pdata[queue->rear] ,data, queue->data_len);
memcpy((GEN_QUEUE_DATA_TYPE*)(queue->pdata) + queue->rear*queue->data_len,data, queue->data_len);
queue->rear = (queue->rear +1)% queue->node_size;
queue->count += 1;
retval = queue->count;
}
PLATFORM_ENABLE_IRQ();
return retval;
}
/*
* 从队列头读取数据,并且删除
* return:
-1: 队列已满,存储失败;
否则返回操作后队列中元素的个数;
*/
signed short gen_queue_out(GenCircleQueue *const queue,GEN_QUEUE_DATA_TYPE* data)
{
signed short retval;
PLATFORM_DISABLE_IRQ();
if( (queue->front ==queue->rear)&&(queue->count == 0) )
retval= -1;
else{
//memcpy(data,queue->pdata[queue->front],queue->data_len);
memcpy(data, (GEN_QUEUE_DATA_TYPE*)(queue->pdata) + queue->front*queue->data_len,queue->data_len);
queue->front = (queue->front +1)% queue->node_size;
queue->count -= 1;
retval= queue->count;
}
PLATFORM_ENABLE_IRQ();
return retval;
}
//
unsigned short gen_queue_get_len(GenCircleQueue *const queue)
{
return queue->count;
}
unsigned char* gen_queue_get_ele(GenCircleQueue *const queue,unsigned short i)
{
unsigned short offset = (queue->front +i)% queue->node_size;
return (GEN_QUEUE_DATA_TYPE*)(queue->pdata) + offset*queue->data_len ;
//memcpy(data, ,queue->data_len);
}
//---------------------------------------------------------------------------------------
//GEN_CIRCLE_QUEUE_DEF(test_fifo,100,64);