¡Buen proyecto, no lo mantengas en privado! Ruedas de código abierto para el desarrollo de microcontroladores

Haga clic en "Uncle Wheat" arriba y seleccione "Cuenta pública superior/estrella"

Productos secos de bienestar, entregados lo antes posible.

Hola a todos, mi nombre es Trigo. Hoy recomiendo una rueda de código abierto adecuada para el desarrollo bare metal de un solo chip.

QueueForMcu

El módulo de función de cola basado en una microcomputadora de un solo chip se usa principalmente para aplicaciones de microcomputadoras de un solo chip de 8, 16 y 32 bits que no ejecutan RTOS, y es compatible con la mayoría de las plataformas de microcomputadoras de un solo chip.

Código fuente abierto: https://github.com/xiaoxinpro/QueueForMcu

1. Características

  • Crear dinámicamente objetos de cola

  • Búfer de datos de cola establecido dinámicamente

  • Especifique estáticamente la longitud de los datos del elemento de la cola

  • Guarde los datos de la cola pasándolos por valor

2. Uso rápido

#include "queue.h"

#define Q_UART_BUFFER_SIZE  1024

QUEUE_HandleTypeDef qUartTx;
QUEUE_DATA_T BufferUartTx[Q_UART_BUFFER_SIZE];

int main(void)
{
  QUEUE_DATA_T temp;
  
  //初始化队列
  Queue_Init(&qUartTx, BufferUartTx, Q_UART_BUFFER_SIZE);
  
  while(1)
  {
    //入队
    Queue_Push(&qUartTx, 'Q');
    Queue_Push(&qUartTx, 'u');
    Queue_Push(&qUartTx, 'e');
    Queue_Push(&qUartTx, 'u');
    Queue_Push(&qUartTx, 'e');
    
    //出队
    Queue_Pop(&qUartTx, &temp);
    Queue_Pop(&qUartTx, &temp);
    Queue_Pop(&qUartTx, &temp);
    Queue_Pop(&qUartTx, &temp);
    Queue_Pop(&qUartTx, &temp);
  }
}

3. Instrucciones de configuración

Actualmente, QueueForMcu tiene solo un elemento de configuración estático, de la siguiente manera:

Hay una definición de macro en el queue.harchivo QUEUE_DATA_Tpara especificar la longitud de los datos de los elementos de la cola, el valor predeterminado es unsigned char, se puede cambiar a otros tipos de datos según sea necesario.

En cuarto lugar, la estructura de datos.

La estructura de datos de la cola se QUEUE_HandleTypeDefutiliza para guardar el estado de la cola. El código fuente es el siguiente:

typedef struct QUEUE_HandleTypeDef{
    unsigned int head;                      //队列头指针
    unsigned int tail;                      //队列尾指针
    unsigned int buffer_length;             //队列缓存长度(初始化时赋值)
    QUEUE_DATA_T * buffer;                  //队列缓存数组(初始化时赋值)
}QUEUE_HandleTypeDef;

donde QUEUE_DATA_Testá el tipo de datos personalizado en el elemento de configuración.

5. Crea una cola

1. Crear un caché de cola

Dado que guardamos los datos de la cola mediante la transferencia de valores, debemos crear manualmente un búfer de cola para almacenar los datos de la cola antes de crear la cola.

QUEUE_DATA_T BufferUartTx[1024];

El código anterior crea 1024un .

2. Crea una estructura de cola

A continuación, QUEUE_HandleTypeDefcree una estructura de cola para mantener el estado de la cola usando:

QUEUE_HandleTypeDef qUartTx;

3. Inicializar la cola

Después de preparar el búfer de la cola y la estructura de la cola, llame a la Queue_Initfunción para crear la cola. El prototipo de la función es el siguiente:

void Queue_Init(QUEUE_HandleTypeDef * hqueue, QUEUE_DATA_T * buffer, unsigned int len)

Descripción de parámetros:

nombre del parámetro describir
cola La estructura de la cola que debe inicializarse, si la segunda inicialización borrará el contenido de la cola original.
buffer El primer puntero de dirección de la caché de cola
Len La longitud de la cola no puede ser mayor que la longitud del búfer de la cola.

Código de referencia:

Queue_Init(&qUartTx, BufferUartTx, Q_UART_BUFFER_SIZE);

6. Empuje en la cola

1. Empuje de datos único

Use la Queue_Pushfunción . El prototipo de la función es el siguiente:

QUEUE_StatusTypeDef Queue_Push(QUEUE_HandleTypeDef * hqueue, QUEUE_DATA_T data)

Descripción de parámetros:

nombre del parámetro describir
cola La estructura de la cola en la que se deben insertar los datos.
datos Datos que se insertarán en la cola.

Descripción del valor de retorno:

La función devolverá un tipo de datos de QUEUE_StatusTypeDefenumeración y el valor devuelto devolverá los siguientes valores según el estado de la cola:

valor devuelto describir
QUEUE_OK Los datos se insertan en la cola correctamente.
QUEUE_OVERLOAD No se enviaron datos a la cola porque la cola está llena.

Código de referencia:

Queue_Push(&qUartTx, 'Q');
Queue_Push(&qUartTx, 0x51);
Queue_Push(&qUartTx, 81);

2. Empuje de datos múltiples

Si necesita insertar múltiples datos (matrices) en la cola, puede usar la Queue_Push_Arrayfunción . En principio, Queue_Pushse implementa llamando a la función en un bucle. El prototipo de la función es el siguiente:

unsigned int Queue_Push_Array(QUEUE_HandleTypeDef * hqueue, QUEUE_DATA_T * pdatas, unsigned int len)

Descripción de parámetros:

nombre del parámetro describir
cola La estructura de la cola en la que se deben insertar los datos.
pdata La primera dirección de la matriz que se insertará en la cola.
Len La longitud de la matriz que se insertará en la cola.

Cuando la longitud de la matriz es mayor que la longitud restante de la cola, se ignorarán los datos sobrantes de la matriz.

Descripción del valor de retorno:

  • Esta función devolverá la longitud de los datos realmente insertados en la cola.

  • Cuando la longitud restante en la cola es excedente, el valor devuelto será igual lenal .

  • Cuando la longitud restante en la cola es insuficiente, el valor devuelto es la longitud de los datos que realmente se insertaron en la cola.

Siete, cola emergente

1. Ventana emergente de datos únicos

Use la Queue_Popfunción . Cabe señalar que los datos extraídos se eliminarán de la cola. El prototipo de la función es el siguiente:

QUEUE_StatusTypeDef Queue_Pop(QUEUE_HandleTypeDef * hqueue, QUEUE_DATA_T * pdata)

Descripción de parámetros:

nombre del parámetro describir
cola Estructura de la cola en la que deben aparecer los datos.
pdatos Un puntero a una variable para contener los datos emergentes.

Descripción del valor de retorno:

La función devolverá un tipo de datos de QUEUE_StatusTypeDefenumeración y el valor devuelto devolverá los siguientes valores según el estado de la cola:

valor devuelto describir
QUEUE_OK Los datos salieron de la cola con éxito.
QUEUE_VOID No se colocaron datos en la cola porque la cola estaba vacía.

Código de referencia:

QUEUE_DATA_T temp;
if(QUEUE_OK = Queue_Pop(&qUartTx, &temp))
{
    // temp 为队列弹出的数据
}
else
{
    // 弹出数据失败
}

2. Ventana emergente de datos múltiples

Si necesita extraer varios datos de la cola, puede usar la Queue_Pop_Arrayfunción . En principio, la Queue_Popfunción se llama cíclicamente. Cabe señalar que los datos que se extraen con éxito se eliminarán de la cola. El prototipo de la función es el siguiente :

unsigned int Queue_Pop_Array(QUEUE_HandleTypeDef * hqueue, QUEUE_DATA_T * pdatas, unsigned int len)

Descripción de parámetros:

nombre del parámetro describir
cola Estructura de la cola en la que deben aparecer los datos.
pdata Se utiliza para guardar la primera dirección de la matriz de datos emergente.
Len La longitud de la matriz de datos que debe extraerse.

Cuando la longitud de los datos que se mostrarán es mayor que la longitud de los datos en la cola, no se asignará el espacio adicional de la matriz emergente.

Descripción del valor de retorno:

  • Esta función devolverá la longitud de los datos realmente extraídos de la cola.

  • Cuando la longitud de los datos en la cola sea suficiente, el valor devuelto será igual lenal .

  • Cuando la longitud de datos en la cola es insuficiente, el valor devuelto es la longitud de datos real extraída de la cola.

3. Copia única de datos

Cuando necesite obtener datos del encabezado de la cola, pero no desea que los datos se eliminen de la cola, puede usar la Queue_Peekfunción para lograrlo. Los parámetros y los valores de retorno de esta función son Queue_Popexactamente los mismos . igual que .

La diferencia entre usar Queue_Peeky Queue_Popfunciones es que:

  • Queue_PopDespués de obtener los datos en la cola, los datos en la cola se eliminarán.

  • Queue_PeekDespués de obtener los datos en la cola, se conservarán los datos en la cola.

4. Múltiples réplicas de datos

Cuando necesite obtener varios datos del principio de la cola, pero no desea que los datos se eliminen de la cola, puede usar la Queue_Peek_Arrayfunción para lograrlo. Los parámetros y los valores de retorno de esta función son Queue_Pop_Arrayexactamente los mismos . como .

La diferencia entre usar Queue_Peek_Arrayy Queue_Pop_Arrayfunciones es que:

  • Queue_Pop_ArrayDespués de obtener los datos en la cola, los datos en la cola se eliminarán.

  • Queue_Peek_ArrayDespués de obtener los datos en la cola, se conservarán los datos en la cola.

8. Otras funciones

1. Borrar la cola

Cuando necesite borrar los datos de la cola, no necesita mostrar todos los datos. Solo necesita llamar Queue_Clearpara borrar rápidamente la cola especificada. Cuando se crea la cola, se llamará a esta función para inicializar la cola, por lo que no es necesario llamar a la función borrar cola para la cola que se acaba de crear.

Prototipo de función:

void Queue_Clear(QUEUE_HandleTypeDef * hqueue)

Descripción de parámetros:

nombre del parámetro describir
cola La estructura de la cola que debe vaciarse.

2. Obtener el número de datos de la cola

Cuando se necesita obtener la longitud de los datos en la cola, se llama Queue_Counta la función El prototipo de la función es el siguiente:

unsigned int Queue_Count(QUEUE_HandleTypeDef * hqueue)

Descripción de parámetros:

nombre del parámetro describir
cola Estructura de cola que necesita obtener la longitud de los datos.

Descripción del valor de retorno:

  • Esta función devolverá la longitud de los datos en la cola.

  • El valor de retorno varía de 0 a la longitud de la cola cuando se creó.


-- El fin --

Recomendado en el pasado

¿El desarrollo de MCU nunca usa estructuras de datos?

Después de que la persona que escribió el código incorrecto se fue...

Estoy perplejo, ¿cuál es el papel del final de la enumeración del lenguaje C?

¡30 soluciones a problemas comunes con microcomputadoras de un solo chip! A la gente normal no les digo

¿La interfaz cerebro-computadora de Musk se puede hacer con una Raspberry Pi?

Únase al grupo de intercambio de tecnología integrada y progresen juntos

Haz clic en la tarjeta de arriba para seguirme

430ba210c6f4b0b22183354cdcfc1e1c.png

Todo lo que pediste se ve bien , lo tomo en serio ya que me gusta

Supongo que te gusta

Origin blog.csdn.net/u010632165/article/details/123415290
Recomendado
Clasificación