使用方法如下:
#define USB_RECV_Q_ITEM_CNT 8
#define USB_RECV_Q_ITEM_SIZE (64 + 1)
// 用于usb消息队列总缓存区
static uint8_t m_usb_recv_q_buff[USB_RECV_Q_ITEM_CNT * USB_RECV_Q_ITEM_SIZE] = {0};
queue_t m_usb_recv_q =
{
.pbuff = m_usb_recv_q_buff,
.front = 0,
.rear = 0,
.item_cnt = USB_RECV_Q_ITEM_CNT,
.item_size = USB_RECV_Q_ITEM_SIZE
};
uint8_t g_usb_recv_data[USB_RECV_Q_ITEM_SIZE] = {0}; // 用于usb消息临时缓存区
//函数使用:
/**
* @brief usb发送数据给usb自定义通道(消息入队,非实时发送)
* @note NULL
* @param *data: 欲发送内容
* @param len: 内容长度(字节大小)
* @retval None
*/
void biz_usb_send_data(uint8_t *data, uint16_t len)
{
queue_en(&m_usb_recv_q, data);
}
/**
* @brief 处理消息队列中的消息,通过usb发送
* @note NULL
* @retval None
*/
void biz_usb_data_dispose(void)
{
if (!queue_de(&m_usb_recv_q, g_usb_recv_data))
return;
usb_send(g_usb_recv_data, MAX_USB_PACKET_SIZE);
// LOG_D("<DEBUG> [usb_send] %02x %02x %02x %02x %02x\r\n", g_usb_recv_data[0], g_usb_recv_data[1], g_usb_recv_data[2], g_usb_recv_data[3], g_usb_recv_data[4]);
}
/********************************************************************************
* @file queue.c
* @author jianqiang.xue
* @Version V1.0.0
* @Date 2021-10-10
* @brief 消息队列 借鉴nrf
* @example
#define RECV_Q_ITEM_CNT (8)
#define RECV_Q_ITEM_SIZE (20)
// 消息队列总缓存区
static uint8_t m_recv_q_buff[RECV_Q_ITEM_CNT * RECV_Q_ITEM_SIZE] = {0};
// 定义队列消息结构体
queue_t m_recv_q =
{
.pbuff = m_recv_q_buff,
.front = 0,
.rear = 0,
.item_cnt = RECV_Q_ITEM_CNT,
.item_size = RECV_Q_ITEM_SIZE
};
// 消息队列项目临时缓存区
uint8_t g_recv_data[USB_RECV_Q_ITEM_SIZE] = {0};
// 数据入队(data长度为RECV_Q_ITEM_SIZE)
queue_en(&m_recv_q, data);
// 数据出队(如果队列为空,则返回)
if (!queue_de(&m_recv_q, g_recv_data))
return;
********************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
/* Private includes ----------------------------------------------------------*/
#include "queue.h"
/* Private function prototypes -----------------------------------------------*/
/**
* @brief [消息队列] 初始化
* @note NULL
* @param q: 队列信息指针
* @param data: 队列缓存区
* @param item_cnt: 队列总数量
* @param item_size: 队列总大小
* @retval 1--成功 0--失败
*/
bool queue_init(queue_t *q, uint8_t *data, uint32_t item_cnt, uint32_t item_size)
{
q->pbuff = data;
q->item_cnt = item_cnt;
q->item_size = item_size;
q->front = 0;
q->rear = 0;
return true;
}
/**
* @brief [消息队列] 入队
* @note NULL
* @param q: 队列信息指针
* @param data: 数据头指针
* @retval 1--成功 0--失败
*/
bool queue_en(queue_t *q, uint8_t *data)
{
if (((q->rear+1)%q->item_cnt) == q->front)
return false;
memcpy(q->pbuff + (q->rear*q->item_size), data, q->item_size);
q->rear = (q->rear+1)%q->item_cnt;
return true;
}
/**
* @brief [消息队列] 出队
* @note NULL
* @param q: 队列信息指针
* @param data: 得到当前队列信息数据头指针
* @retval 1--成功 0--失败
*/
bool queue_de(queue_t *q, uint8_t *data)
{
if (q->front == q->rear)
return false;
if (data)
{
memcpy(data, q->pbuff + (q->front * q->item_size), q->item_size);
}
q->front = (q->front + 1) % q->item_cnt;
return true;
}
/**
* @brief [消息队列] 读取当前第一个队列信息
* @note NULL
* @param q: 队列信息指针
* @retval 第一个队列信息头指针
*/
uint8_t* queue_read(queue_t *q)
{
if (q->front == q->rear)
return NULL;
return q->pbuff + (q->front * q->item_size);
}
/********************************************************************************
* @file queue.h
* @author jianqiang.xue
* @Version V1.0.0
* @Date 2021-10-10
* @brief 消息队列 借鉴nrf
********************************************************************************/
#ifndef __QUEUE_H__
#define __QUEUE_H__
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdbool.h>
/* Public Struct -----------------------------------------------*/
typedef struct
{
uint8_t *pbuff;
uint32_t front;
uint32_t rear;
uint32_t item_cnt;
uint32_t item_size;
} queue_t;
/* Public function prototypes -----------------------------------------------*/
bool queue_init(queue_t *q, uint8_t *data, uint32_t item_cnt, uint32_t item_size);
bool queue_en(queue_t *q, uint8_t *data);
bool queue_de(queue_t *q, uint8_t *data);
uint8_t* queue_read(queue_t *q);
#endif
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律