对于嵌入式小型系统,资源不太丰富,串口或中断要及时接收数据且主程序中不能及时处理的情况下,用队列做缓冲处理再好不过了,在这里分享给大家我在做项目用用到的队列,如大神有更简洁、更高效的处理方法欢迎指正,相互学习!
定义队列数组
#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++;
}
}
这个队列我根据项目需要设计了数据结构,大家可以根据自己的需求做相应的改动。