嵌入式小型化队列存储数据

对于嵌入式小型系统,资源不太丰富,串口或中断要及时接收数据且主程序中不能及时处理的情况下,用队列做缓冲处理再好不过了,在这里分享给大家我在做项目用用到的队列,如大神有更简洁、更高效的处理方法欢迎指正,相互学习!

定义队列数组

#define ARR_QUEUE_LEN       10//根据数据量设置适当的数组大小

//定义队列存储的数据结构

typedef struct
{
    unsigned char data;
    unsigned char devType;
}arrQueueDef;

volatile arrQueueDef arr_queue_buf[ARR_QUEUE_LEN];  //数组队列缓存

volatile arrQueueDef *arr_queue_in; //队列进指针
volatile arrQueueDef *arr_queue_out; //队列出指针

初始化队列

void ArrQueueInit(void)
{
  arr_queue_in = (arrQueueDef *)arr_queue_buf;
  arr_queue_out = (arrQueueDef *)arr_queue_buf;
}

/*****************************************************************************
函数名称 : ArrQueueEmpty
功能描述 : 读取队列内数据
输入参数 : 无
返回参数 : 1非空  0空
*****************************************************************************/
unsigned char ArrQueueEmpty(void)
{
  if(arr_queue_in != arr_queue_out)
    return 1;
  else
    return 0;
}

/*****************************************************************************
函数名称 : ArrQueuePop
功能描述 : 读取队列1字节数据
输入参数 : 无
返回参数 : 无
*****************************************************************************/
unsigned char ArrQueuePop(unsigned char *value, unsigned char *type)

  if(arr_queue_out != arr_queue_in)
  {
    //有数据
    if(arr_queue_out >= (arrQueueDef *)(arr_queue_buf + ARR_QUEUE_LEN))
    {
      //数据已经到末尾
      arr_queue_out = (arrQueueDef *)(arr_queue_buf);
    }
      
    *value = (*arr_queue_out).data;
    *type = (*arr_queue_out).devType;
    arr_queue_out++;
  }
  
  return 0;
}

/*****************************************************************************
函数名称 : ArrQueuePush
功能描述 : 向队列中写入1字节数据
输入参数 : 要写入的参数
返回参数 : 无
*****************************************************************************/
void ArrQueuePush(unsigned char value, unsigned char type)
{    
  if((arr_queue_in > arr_queue_out) && ((arr_queue_in - arr_queue_out) >= ARR_QUEUE_LEN))
  {
    //数据队列满
  }
  else if((arr_queue_in < arr_queue_out) && ((arr_queue_out  - arr_queue_in) == 0))
  {
    //数据队列满
  }
  else
  {
    //队列不满
    if(arr_queue_in >= (arrQueueDef *)(arr_queue_buf + ARR_QUEUE_LEN))
    {
      arr_queue_in = (arrQueueDef *)(arr_queue_buf);
    }
    
    (*arr_queue_in).data = value;
    (*arr_queue_in).devType = type;
    arr_queue_in++;
  }
}

这个队列我根据项目需要设计了数据结构,大家可以根据自己的需求做相应的改动。

发布了6 篇原创文章 · 获赞 0 · 访问量 126

猜你喜欢

转载自blog.csdn.net/weixin_40593838/article/details/104950999