队列的创建

1.队列.h文件

#define QueueUARTRxMax		5					/*!< UART队列最大深度 */
#define QueueUARTRxBufMax	100					/*!< UART接收最大数据长度 */
#define QueueUARTTxMax		1					/*!< UART队列最大深度 */
#define QueueUARTTxBufMax	100					/*!< UART接收最大数据长度 */


/**
 *  @brief UART接收参数
 */
typedef struct
{
	uint32_t Count;								/*!< UART接收数据数量 */
	
	uint8_t Buffer[QueueUARTRxBufMax];			/*!< UART接收数据数量 */
	
} Queue_UART_Para;


/**
 *  @brief UART接收队列
 */
typedef struct
{
	Queue_UART_Para *Start;						/*!< UART接收队列数据起始地址 */
	
	Queue_UART_Para *In;						/*!< UART接收队列数据起始地址 */
	
	Queue_UART_Para *Out;						/*!< UART接收队列数据起始地址 */
	
	Queue_UART_Para *End;						/*!< UART接收队列数据起始地址 */
		
	uint16_t Size;								/*!< UART接收队列使用量 */
	
	uint16_t Free_Size;							/*!< UART接收队列空闲量 */
	
} Queue_UART_Struct;

2.队列.c文件
 

/*********************************************************************
 * @fn      Queue_UART_Init
 *
 * @brief   UART队列初始化.
 *
 * @param   Que:队列
 *
 * @param   Buf:队列数组
 *
 * @param   Buf_Len:队列长度
 *
 * @return  none
 */
void Queue_UART_Init(Queue_UART_Struct* Que, Queue_UART_Para* Buf, uint8_t Buf_Len)
{
	Que->Start =
	Que->In    =
	Que->Out   = &Buf[0];
	Que->End   = &Buf[Buf_Len - 1];
	Que->Size  =
	Que->Free_Size = Buf_Len;
}


/*********************************************************************
 * @fn      Queue_UART_Push_aData
 *
 * @brief   UART队列放入一个数据.
 *
 * @param   Que:队列
 *
 * @param   Data:数据
 *
 * @return  Queue_StatusTypeDef:压入队列成功或失败
 */
Queue_StatusTypeDef Queue_UART_Push_aData(Queue_UART_Struct* Que, Queue_UART_Para Data)
{
	if (Que->Free_Size == 0)
	{
		return Queue_ERROR;
	}

	*Que->In = Data;
	Que->Free_Size--;
	Que->In++;

	if (Que->In > Que->End)
	{
		Que->In = Que->Start;
	}
	
	return Queue_OK;
}


/*********************************************************************
 * @fn      Queue_UART_Pop_aData
 *
 * @brief   UART队列取出一个数据.
 *
 * @param   Que:队列
 *
 * @param   Data:数据
 *
 * @return  Queue_StatusTypeDef:取出数据成功或失败
 */
Queue_StatusTypeDef Queue_UART_Pop_aData(Queue_UART_Struct* Que, Queue_UART_Para* Data)
{
	if (Que->Free_Size >= Que->Size)
	{
		return Queue_ERROR;
	}

	*Data = *Que->Out;
	Que->Free_Size++;
	Que->Out++;

	if (Que->Out > Que->End)
	{
		Que->Out = Que->Start;
	}

	return Queue_OK;
}

3.例程

创建队列句柄

Queue_UART_Struct 	Queue_UART_Rx;
Queue_UART_Struct	Queue_UART_CDC_USB_Rx;

队列初始化

static void Function_Queue_Init_Config(void)
{
	static Queue_UART_Para 	Queue_UART_Rx_Buf[QueueUARTRxMax];
	static Queue_UART_Para 	Queue_UART_CDC_USB_Rx_Buf[QueueUARTRxMax];
	
	Queue_UART_Init(&Queue_UART_Rx,				&Queue_UART_Rx_Buf[0], 				QueueUARTRxMax);
	Queue_UART_Init(&Queue_UART_CDC_USB_Rx,		&Queue_UART_CDC_USB_Rx_Buf[0], 		QueueUARTRxMax);
}

队列用宏重命名

#define Function_Queue_UART_Rx_Push_aData(Queue_UART_Para)				Queue_UART_Push_aData(&Queue_UART_Rx, Queue_UART_Para)
#define Function_Queue_UART_Rx_Pop_aData(Queue_UART_Para)				Queue_UART_Pop_aData(&Queue_UART_Rx, Queue_UART_Para)


#define Function_Queue_UART_CDC_USB_Rx_Push_aData(Queue_UART_Para)		Queue_UART_Push_aData(&Queue_UART_CDC_USB_Rx, Queue_UART_Para)
#define Function_Queue_UART_CDC_USB_Rx_Pop_aData(Queue_UART_Para)		Queue_UART_Pop_aData(&Queue_UART_CDC_USB_Rx, Queue_UART_Para)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值