使用方法如下:
#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(" } /******************************************************************************** * @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 #include #include #include /* 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 #include /* 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
上一篇:[单片机框架][os层] RTX4 中间件 公共函数
下一篇:[keil5] 编译HEX文件,修改起始地址后,HEX文件地址不变
推荐阅读最新更新时间:2024-11-18 04:24
设计资源 培训 开发板 精华推荐
- NCP130AMX120TCGEVB:NCP130AMX120TCG 偏置轨 LDO 稳压器演示板
- LTC2908ITS8-A1、12V、5V、3.3V、2.5V、1.8V、1.5V六电源监视器的典型应用电路
- 使用 Analog Devices 的 LT1764ET-1.5 的参考设计
- MC33074ADTBR2G 低压快速数模转换器的典型应用
- UM10862,TEA1832 45W/19.5V 超级本适配器演示板
- RT1064双目视觉
- 2 相、双输出同步升压转换器使用 LTC1871 解决严酷环境中的热问题,2 相、双输出同步升压转换器解决严酷环境中的热问题
- DER-228 - 15 W 电源
- DC1599A,使用 LTC5583IUF#PBF、40MHz 至 3GHz 双路 RMS 功率检测器的演示板
- NTAG I²C plus Flex Kit containing additional flex antennas
- 是德科技有奖问答活动之一,A4WP无线充电测试的示波器方案,答题闯关赢好礼!
- 有奖直播:是德科技100G/400G 光通信测试解决方案
- 有奖直播|安森美先进的封装和驱动技术助力碳化硅能源应用
- 答题有礼|一起学习 Mentor PCB 手册
- 直播已结束【解锁 TI Sitara AM2x MCU 在电机驱动中的新可能】
- 直播已结束【用于光伏逆变器/储能系统的欧姆龙继电器 /开关/连接器解决方案】
- 有奖直播|瑞萨电子 Arm MCU 的新能源进击:RA6T2
- e络盟邀您齐聚2023慕尼黑电子展,三重好礼等你拿!
- 看视频赢京东卡 | 泰享实测之水哥秘籍第三期
- 下载有礼|ADI 最新《模拟对话》合订本