打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

使用方法如下:

#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

posted on 2022-08-13 11:00  xuejianqiang  阅读(34)  评论(0编辑  收藏  举报
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033