Blame view

Common/gen_queue.c 3.34 KB
9d8bbd1c   李外   改升级前备份
1
2
  #include    "gen_queue.h"
  #include    "string.h"
eec54649   李外   链表 和 队列的中断保护带嵌套且用...
3
  #include "platform.h"
9d8bbd1c   李外   改升级前备份
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
  /*
  * 通用环形队列函数: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;
eec54649   李外   链表 和 队列的中断保护带嵌套且用...
49
50
      PLATFORM_DISABLE_IRQ();
      
9d8bbd1c   李外   改升级前备份
51
52
53
54
55
56
57
58
59
  	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;
  	}
a0293f87   李外   1、用新写法替换所有开关总中断的语句;
60
  	PLATFORM_ENABLE_IRQ();
9d8bbd1c   李外   改升级前备份
61
62
63
64
65
66
67
68
69
70
71
72
73
  	return retval;
  }
  
  
  /*
  * 从队列头读取数据,并且删除
  * return:
      -1: 队列已满,存储失败;
      否则返回操作后队列中元素的个数;
  */
  signed short gen_queue_out(GenCircleQueue *const queue,GEN_QUEUE_DATA_TYPE* data)	
  {	
  	signed short retval;
eec54649   李外   链表 和 队列的中断保护带嵌套且用...
74
  	PLATFORM_DISABLE_IRQ();
9d8bbd1c   李外   改升级前备份
75
76
77
78
79
80
81
82
83
  	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;
  	}	
a0293f87   李外   1、用新写法替换所有开关总中断的语句;
84
  	PLATFORM_ENABLE_IRQ();
9d8bbd1c   李外   改升级前备份
85
86
87
88
89
90
91
92
  	return retval;
  }
  
  //
  unsigned short gen_queue_get_len(GenCircleQueue *const queue)	
  {
  	return queue->count;
  }
5913e7ab   李外   V100.0.16-1
93
94
95
96
97
98
99
100
  
  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);
  }
  
9d8bbd1c   李外   改升级前备份
101
102
103
104
  //---------------------------------------------------------------------------------------
  
  
  //GEN_CIRCLE_QUEUE_DEF(test_fifo,100,64);