| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- /**
- ******************************** STM32F0xx *********************************
- * @文件名 : queue.c
- * @作者 : sun
- * @库版本 : V1.5.0
- * @文件版本 : V1.0.0
- * @日期 : 2016年06月10日
- * @摘要 :循环队列源文件
- ******************************************************************************/
-
- #include "queue.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "usart.h"
- /********************************
- 创建空循环队列
- ********************************/
- sequeue_t * Create_Empty_Sequeue(uint8_t row,uint8_t col)
- {
- // uint8_t i,j;
- uint8_t i;
- sequeue_t * sq;
-
- sq = (sequeue_t *)malloc(sizeof(sequeue_t));
- if (sq == NULL) {
- QUEUE_DEBUG_F("error,sq == NULL\n");
- return NULL;
- }
- memset(sq,0,sizeof(sequeue_t));
- sq->data = (uint8_t **)malloc(sizeof(int*) * row); //sizeof(int*),不能少*,一个指针的内存大小,每个元素是一个指针。
-
- memset(sq->data,0,sizeof(int*) * row);
- for (i = 0;i < row;i++)
- {
- sq->data[i] = (uint8_t*)malloc(sizeof(uint8_t ) * col);
- if (sq->data[i] == NULL) {
- QUEUE_DEBUG_F("error,sq->data[i] == NULL\n");
- return NULL;
- }
- memset(sq->data[i],0,sizeof(uint8_t ) * col);
- }
- /*
- for (i = 0;i < row;i++)
- {
- for (j = 0;j < col;j++)
- {
- QUEUE_DEBUG("%p ",&(sq->data[i][j]));
- }
- QUEUE_DEBUG("\n");
- }
- */
- sq->depth = row;
- sq->width = col;
- sq->sum = 0;
- return sq;
- }
- /********************************
- 检查循环队列是否为空
- ********************************/
- int8_t Check_Seqeue_Empty(sequeue_t * sq)
- {
- //return (sq->front == sq->rear);
- return (sq->sum == 0);
- }
- /********************************
- 检查循环队列是否为满
- ********************************/
- int8_t Check_Seqeue_Full(sequeue_t * sq)
- {
- //return (sq->sum >= SQ_DEPTH);
- return (sq->sum >= sq->depth);
- }
- /********************************
- 插入队列,插入1条记录
- ********************************/
- int8_t En_Queue(sequeue_t *sq ,uint8_t *p,uint8_t sizeof_p,uint8_t l)
- {
- uint8_t i=0;
- uint8_t r=0;
-
- //DEBUG1("En_Queue...\r\n");
- if((sq==NULL) || (p==NULL) || (l>=sq->width)) //参数合法判断
- return 0;
-
-
- //DEBUG1("En_Queue...\r\n");
- if(Check_Seqeue_Full(sq)) //满队列判断
- return 0;
-
- //DEBUG1("En_Queue...\r\n");
- r = (sq->rear+1) % (sq->depth); //循环存储
- sq->data[r][0] = l; //长度
-
- for(i=0;i<l;i++){ //记录
- if((i>sizeof_p-1)|(i>sq->width-2))
- break;
- sq->data[r][i+1] = p[i];
- }
- sq->rear = r; //更新入队标记
- sq->sum++; //更新总数标记
- QUEUE_DEBUG1("En_Queue...SQ=0x%08x,sq->rear =%d,sq->sum=%d\r\n",sq,sq->rear,sq->sum);
-
- return l; //返回插入的记录长度
- }
- /********************************
- 出队列,读取1条记录,队列改变
- ********************************/
- int8_t De_Queue(sequeue_t * sq,uint8_t *p,uint8_t sizeof_p,uint8_t *l )
- {
- uint8_t i=0;
- uint8_t f=0;
-
- if((sq==NULL) || (p==NULL) || (l==NULL)) //参数合法判断
- return 0;
-
- if(Check_Seqeue_Empty(sq)) //空队列判断
- return 0;
-
-
- f = (sq->front+1) % (sq->depth);
- *l = sq->data[f][0];
- for(i=0;i<*l;i++)
- {
- if((i>sizeof_p-1)|(i>sq->width-2))
- break;
- p[i] = sq->data[f][i+1];
- }
- //val = sq->data[sq->front] ;
- //printf("p| %p ",&(sq->data[sq->front]));
-
- sq->front = f; //更新出队标记
- sq->sum--; //更新总数标记
-
- QUEUE_DEBUG1("De_Queue...SQ=0x%08x,sq->front=%d,sq->sum=%d\r\n",sq,sq->front,sq->sum);
- return 1;
- }
- /********************************
- 读取队列,读取1条记录,队列不改变
- ********************************/
- int8_t Read_Queue(sequeue_t * sq,uint8_t *p,uint8_t *l)
- {
- uint8_t i=0;
- uint8_t f=0;
-
- if((sq==NULL) || (p==NULL) || (l==NULL)) //参数合法判断
- return 0;
-
- if(Check_Seqeue_Empty(sq)) //空队列判断
- return 0;
-
- f = (sq->front+1) % (sq->depth);
- *l = sq->data[f][0];
- for(i=0;i<*l;i++)
- p[i] = sq->data[f][i+1];
- //val = sq->data[sq->front] ;
- //printf("p| %p ",&(sq->data[sq->front]));
-
- //sq->front = f; //更新出队标记
- //sq->sum--; //更新总数标记
- return 1;
- }
- /********************************
- 添加1条空记录到队列,记录第0个元素代表长度,初始长度为0
- ********************************/
- int8_t Add_Blank_Queue(sequeue_t *sq)
- {
- uint8_t i=0;
- uint8_t r=0;
-
- if(sq==NULL) //参数合法判断
- return 0;
-
-
- if(Check_Seqeue_Full(sq)) //满队列判断
- return 0;
-
- r = (sq->rear+1) % (sq->depth); //循环存储
- sq->data[r][0] = 0; //长度
-
- for(i=1;i<sq->width-1;i++) //记录内容清理
- sq->data[r][i] = 0;
- sq->rear = r; //更新入队标记
- sq->sum++; //更新总数标记
- return 1; //返回插入的记录长度
- }
- /********************************
- 更新最新1条记录内容,记录尾元添加1个元素,且长度加1
- ********************************/
- uint8_t Update_Queue(sequeue_t *sq ,uint8_t mode,uint8_t val)
- {
- uint8_t l=0;
- uint8_t r;
- uint8_t m;
-
- m = mode;
-
- if(sq==NULL) //参数合法判断
- return 1;
-
- if(Check_Seqeue_Full(sq)) //满队列判断
- return 1;
-
- r = (sq->rear+1) % (sq->depth); //队列尾
-
- if(m==0){ //注,当前操作的记录是无效的,记录的长度加1,追加数据
- l=sq->data[r][0]+1;
-
- if(l>=sq->width-1){ //记录超过宽度
- sq->data[r][0] = 0;
- return 1;
- }
- sq->data[r][l] = val;
- sq->data[r][0] = l;
- }
-
- if(m==1){ //当前记录,由无效状态变为有效状态,更新rear和sum
- sq->rear = r;
- sq->sum++;
- }
-
- return 0;
- }
|