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.h
archivo QUEUE_DATA_T
para 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_HandleTypeDef
utiliza 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_T
está 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 1024
un .
2. Crea una estructura de cola
A continuación, QUEUE_HandleTypeDef
cree 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_Init
funció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_Push
funció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_StatusTypeDef
enumeració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_Array
función . En principio, Queue_Push
se 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
len
al .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_Pop
funció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_StatusTypeDef
enumeració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_Array
función . En principio, la Queue_Pop
funció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
len
al .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_Peek
función para lograrlo. Los parámetros y los valores de retorno de esta función son Queue_Pop
exactamente los mismos . igual que .
La diferencia entre usar Queue_Peek
y Queue_Pop
funciones es que:
Queue_Pop
Después de obtener los datos en la cola, los datos en la cola se eliminarán.Queue_Peek
Despué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_Array
función para lograrlo. Los parámetros y los valores de retorno de esta función son Queue_Pop_Array
exactamente los mismos . como .
La diferencia entre usar Queue_Peek_Array
y Queue_Pop_Array
funciones es que:
Queue_Pop_Array
Después de obtener los datos en la cola, los datos en la cola se eliminarán.Queue_Peek_Array
Despué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_Clear
para 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_Count
a 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?
¿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
Todo lo que pediste se ve bien , lo tomo en serio ya que me gusta