queue.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. /**
  2. ******************************** STM32F0xx *********************************
  3. * @文件名 : queue.c
  4. * @作者 : sun
  5. * @库版本 : V1.5.0
  6. * @文件版本 : V1.0.0
  7. * @日期 : 2016年06月10日
  8. * @摘要 :循环队列源文件
  9. ******************************************************************************/
  10. #include "queue.h"
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. //#include "uart.h"
  15. /********************************
  16. 创建空循环队列
  17. ********************************/
  18. sequeue_t * Create_Empty_Sequeue(uint8_t row,uint16_t col)
  19. {
  20. // uint8_t i,j;
  21. // uint8_t i;
  22. sequeue_t * sq;
  23. sq = (sequeue_t *)malloc(sizeof(sequeue_t));
  24. if (sq == NULL) {
  25. QUEUE_DEBUG_F("error,sq == NULL\n");
  26. return NULL;
  27. }
  28. memset(sq,0,sizeof(sequeue_t));
  29. sq->data = (uint8_t **)malloc(sizeof(int*) * row); //sizeof(int*),不能少*,一个指针的内存大小,每个元素是一个指针。
  30. memset(sq->data,0,sizeof(int*) * row);
  31. // for (i = 0;i < row;i++)
  32. // {
  33. // sq->data[i] = (uint8_t*)malloc(sizeof(uint8_t ) * col);
  34. // if (sq->data[i] == NULL) {
  35. // QUEUE_DEBUG_F("error,sq->data[i] == NULL\n");
  36. // return NULL;
  37. // }
  38. // memset(sq->data[i],0,sizeof(uint8_t ) * col);
  39. // }
  40. /*
  41. for (i = 0;i < row;i++)
  42. {
  43. for (j = 0;j < col;j++)
  44. {
  45. QUEUE_DEBUG("%p ",&(sq->data[i][j]));
  46. }
  47. QUEUE_DEBUG("\n");
  48. }
  49. */
  50. sq->depth = row;
  51. sq->width = col;
  52. sq->sum = 0;
  53. sq->rear = 0;
  54. return sq;
  55. }
  56. /********************************
  57. 检查循环队列是否为空
  58. ********************************/
  59. int8_t Check_Seqeue_Empty(sequeue_t * sq)
  60. {
  61. //return (sq->front == sq->rear);
  62. return (sq->sum == 0);
  63. }
  64. /********************************
  65. 检查循环队列是否为满
  66. ********************************/
  67. int8_t Check_Seqeue_Full(sequeue_t * sq)
  68. {
  69. //return (sq->sum >= SQ_DEPTH);
  70. return (sq->sum >= sq->depth);
  71. }
  72. /********************************
  73. 插入队列,插入1条记录
  74. 参数 sq 插入的队列
  75. p 插入的数据
  76. sizeof_p 插入数组的长度
  77. l 插入的数据长度
  78. ********************************/
  79. int16_t En_Queue(sequeue_t *sq ,uint8_t *p,uint16_t sizeof_p,uint16_t l)
  80. {
  81. uint16_t i=0;
  82. uint8_t r=0;
  83. // printf("1\n");
  84. //DEBUG1("En_Queue...\r\n");
  85. if((sq==NULL) || (p==NULL) || (l>=sq->width)) //参数合法判断
  86. return 0;
  87. // printf("2\n");
  88. //DEBUG1("En_Queue...\r\n");
  89. if(Check_Seqeue_Full(sq)) //满队列判断
  90. return 0;
  91. // printf("3\n");
  92. //DEBUG1("En_Queue...\r\n");
  93. r = (sq->rear+1) % (sq->depth); //循环存储
  94. // printf("width=%d,r=%d\n",sq->width,r);
  95. sq->data[r] = (uint8_t*)malloc(sizeof(uint8_t ) * sq->width);//申请内存
  96. memset(sq->data[r],0,sizeof(uint8_t ) * sq->width);
  97. // printf("en len:%d,%02x,%02x\n",l,sq->data[r][0],sq->data[r][1]);
  98. sq->data[r][0] = (l&0x00ff); //长度低位
  99. sq->data[r][1] = (l&0xff00)>>8; //长度高位
  100. // printf("en len:%d,%02x,%02x\n",l,sq->data[r][0],sq->data[r][1]);
  101. for(i=0;i<l;i++){ //记录
  102. if((i>sizeof_p-1)||(i>sq->width-3))
  103. break;
  104. sq->data[r][i+2] = p[i];
  105. }
  106. sq->rear = r; //更新入队标记
  107. sq->sum++; //更新总数标记
  108. QUEUE_DEBUG1("En_Queue...SQ=0x%08x,sq->rear =%d,sq->sum=%d\r\n",sq,sq->rear,sq->sum);
  109. return l; //返回插入的记录长度
  110. }
  111. /********************************
  112. 出队列,读取1条记录,队列改变
  113. 参数 sq 读取的队列
  114. p 读取的数据
  115. sizeof_p 接收数组的最大长度
  116. l 读取的数据长度
  117. ********************************/
  118. int16_t De_Queue(sequeue_t * sq,uint8_t *p,uint16_t sizeof_p,uint16_t *l )
  119. {
  120. uint16_t i=0;
  121. uint8_t f=0;
  122. if((sq==NULL) || (p==NULL) || (l==NULL)) //参数合法判断
  123. return 0;
  124. if(Check_Seqeue_Empty(sq)) //空队列判断
  125. return 0;
  126. f = (sq->front+1) % (sq->depth);
  127. *l = *(uint16_t *)sq->data[f];
  128. for(i=0;i<*l;i++)
  129. {
  130. if((i>sizeof_p-1)||(i>sq->width-3))
  131. break;
  132. p[i] = sq->data[f][i+2];
  133. }
  134. //val = sq->data[sq->front] ;
  135. //printf("p| %p ",&(sq->data[sq->front]));
  136. sq->front = f; //更新出队标记
  137. sq->sum--; //更新总数标记
  138. free(sq->data[f]);
  139. QUEUE_DEBUG1("De_Queue...SQ=0x%08x,sq->front=%d,sq->sum=%d\r\n",sq,sq->front,sq->sum);
  140. return 1;
  141. }
  142. /********************************
  143. 读取队列,读取1条记录,队列不改变
  144. ********************************/
  145. int16_t Read_Queue(sequeue_t * sq,uint8_t *p,uint16_t *l)
  146. {
  147. uint16_t i=0;
  148. uint8_t f=0;
  149. if((sq==NULL) || (p==NULL) || (l==NULL)) //参数合法判断
  150. return 0;
  151. if(Check_Seqeue_Empty(sq)) //空队列判断
  152. return 0;
  153. f = (sq->front+1) % (sq->depth);
  154. *l = *(uint16_t *)sq->data[f];
  155. for(i=0;i<*l;i++)
  156. p[i] = sq->data[f][i+2];
  157. //val = sq->data[sq->front] ;
  158. //printf("p| %p ",&(sq->data[sq->front]));
  159. //sq->front = f; //更新出队标记
  160. //sq->sum--; //更新总数标记
  161. return 1;
  162. }
  163. /********************************
  164. 添加1条空记录到队列,记录第0个元素代表长度,初始长度为0
  165. ********************************/
  166. int16_t Add_Blank_Queue(sequeue_t *sq)
  167. {
  168. uint16_t i=0;
  169. uint8_t r=0;
  170. if(sq==NULL) //参数合法判断
  171. return 0;
  172. if(Check_Seqeue_Full(sq)) //满队列判断
  173. return 0;
  174. r = (sq->rear+1) % (sq->depth); //循环存储
  175. sq->data[r] = (uint8_t*)malloc(sizeof(uint8_t ) * sq->width);//申请内存
  176. memset(sq->data[r],0,sizeof(uint8_t ) * sq->width);
  177. sq->data[r][0] = 0; //长度
  178. sq->data[r][1] = 0; //长度
  179. for(i=2;i<sq->width-1;i++) //记录内容清理
  180. sq->data[r][i] = 0;
  181. sq->rear = r; //更新入队标记
  182. sq->sum++; //更新总数标记
  183. return 1; //返回插入的记录长度
  184. }
  185. /********************************
  186. 更新最新1条记录内容,记录尾元添加1个元素,且长度加1
  187. ********************************/
  188. uint8_t Update_Queue(sequeue_t *sq ,uint8_t mode,uint8_t val)
  189. {
  190. uint16_t l=0;
  191. uint8_t r;
  192. uint8_t m;
  193. m = mode;
  194. if(sq==NULL) //参数合法判断
  195. return 1;
  196. if(Check_Seqeue_Full(sq)) //满队列判断
  197. return 1;
  198. r = (sq->rear+1) % (sq->depth); //队列尾
  199. if(m==0){ //注,当前操作的记录是无效的,记录的长度加1,追加数据
  200. l=sq->data[r][0]+1;
  201. if(l>=sq->width-1){ //记录超过宽度
  202. sq->data[r][0] = 0;
  203. return 1;
  204. }
  205. sq->data[r][l] = val;
  206. sq->data[r][0] = l;
  207. }
  208. if(m==1){ //当前记录,由无效状态变为有效状态,更新rear和sum
  209. sq->rear = r;
  210. sq->sum++;
  211. }
  212. return 0;
  213. }