Compartir tecnología

Serie de arquitectura de software de microcontrolador (5) -Cola

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Anteriormente hablamos sobre conocimientos básicos como punteros y estructuras. Al comienzo de este artículo, haremos algunas aplicaciones complejas de estos conocimientos básicos, como las colas.

De hecho, en 2018, grabé una serie de videos sobre arquitectura de programas, que incluían tutoriales paso a paso sobre la formación de colas y una serie de ideas y técnicas prácticas de programación de alto nivel. Fue bien recibido y reconocido por muchos fanáticos y. amigos. .

Sin embargo, debido a que el tutorial se grabó relativamente temprano, la calidad del sonido es relativamente pobre y algunos detalles no son perfectos. Por lo tanto, esta espina siempre ha estado clavada en mi corazón. Para permitir que los fanáticos del campo de entrenamiento especial del microcontrolador de Wuji aprendan nuestros proyectos de manera más eficiente y mejor, recientemente planeo reorganizar estos contenidos básicos y convertirlos en una serie de. Tutoriales gráficos/vídeo de arquitectura de software 2.0.

1. ¿Por qué debería hablar de colas?

Cuando trabajaba como ingeniero de I+D, a menudo me encontraba con algunos productos de comunicación, como tableros de control industrial, PDU e Internet de las cosas.

Generalmente, al fabricar este tipo de productos, será un dolor de cabeza escribir y recibir flujos de datos, ya sea comunicación en serie o comunicación inalámbrica.

Por ejemplo, STM32 recibe un flujo de datos del puerto serie.

Al principio, definí una matriz y una variable de subíndice de matriz para procesar el flujo de datos recibido. El código es el siguiente:

Este método tiene muchos problemas y aumenta la complejidad de los ingenieros que escriben código.

  • El mantenimiento del código es engorroso

Debido a que debe verificar manualmente los límites del búfer de la matriz para evitar errores fuera de los límites, las matrices no son tan fáciles de expandir y mantener como las colas cuando necesita procesar flujos de datos más complejos o agregar nuevas fuentes de datos.

  • Los datos son propensos a la confusión

Operar matrices directamente en un servicio de interrupción (ISR) puede causar competencia de recursos con el programa principal. Si varias tareas acceden a la misma matriz, se requieren mecanismos de sincronización adicionales (como bloqueos mutex) para evitar condiciones de carrera de datos e inconsistencias.

Si la recepción y el procesamiento de datos no están sincronizados, el uso de matrices puede causar confusión en el orden de los datos, lo que provocará la pérdida de paquetes de datos debido a problemas del programa. He estado lidiando con este problema antes. Necesito código adicional para resolverlo, lo que aumenta la complejidad del programa. Además, no tengo experiencia y no es estable para hacerlo después de todo el esfuerzo.

Este tipo de problema me molestó durante mucho tiempo. No fue hasta que cambié de trabajo más tarde y leí el código escrito por otros ingenieros que me di cuenta de que las colas pueden resolver estos puntos débiles. Desde entonces, la forma en que manejo el flujo de datos ha sido la siguiente:

¿Se siente mucho más simple? De hecho, el algoritmo de procesamiento de datos de la cola no es simple. Simplemente usa la cola para crear una plantilla general para el procesamiento de datos. La próxima vez que encuentre necesidades similares, puede usarlo directamente en términos profesionales, lo que significa portabilidad. el código. Más reutilizable.

Esta es solo una de las aplicaciones de las colas. La esencia de las colas es el almacenamiento en caché de datos y la eliminación de la cola siguiendo la regla de primero en entrar, primero en salir.

Es decir, almacenar los datos primero y luego sacarlos para procesarlos cuando la CPU tenga tiempo libre o cuando se cumplan ciertas condiciones del programa.

A partir de esta característica se pueden derivar muchas aplicaciones prácticas. Especialmente cuando se trata de aplicaciones que necesitan garantizar el orden de los datos.

2. ¿En qué escenarios se deberían utilizar las colas?

He resumido algunos de los lugares que más uso.

2.1 Búfer de datos de comunicación en serie

Cuando el microcontrolador recibe datos a través del puerto serie, generalmente utiliza una cola para almacenar en búfer los bytes recibidos, lo que garantiza que los datos no se perderán antes de ser procesados ​​por el programa principal.

2.2 Procesamiento de audio

En los dispositivos de grabación o reproducción de audio, las colas se utilizan para almacenar en búfer datos de muestra de audio para implementar la reproducción o grabación paso a paso. Por ejemplo: por ejemplo, en el Proyecto 6 de nuestro campo de entrenamiento especial de microcontroladores Wuji, el host de alarma WiFi y 4G tiene una función de mensaje de voz. Por ejemplo, si presiona el botón de armado fuera de casa, se escuchará la voz "armar fuera de casa". Se reproducirá, y si se presiona el botón de armado en casa, se reproducirá la voz "armar en casa".

Si presiono estos dos botones rápidamente, para asegurarme de que la voz se pueda reproducir por completo, primero puedo colocar el evento clave en el caché de la cola, para que la voz se pueda reproducir completamente en secuencia.

2.3 Programación y sincronización de tareas

En los sistemas que utilizan RTOS, las colas se utilizan para la entrega de mensajes y la sincronización entre tareas y admiten la programación de tareas complejas.

2.4 Procesamiento de entradas clave

Después de detectar eventos clave, se pueden poner en la cola primero, y el programa principal puede procesar estos eventos para evitar que se pierdan debido a presiones de teclas demasiado rápidas. Esto se usa actualmente en nuestro proyecto.

2.5 datos del CAD

Los datos de ADC que recopilamos también se pueden colocar en la cola después de cierto procesamiento para que puedan procesarse o analizarse en el momento adecuado.

2.6 Flujo de datos de actualización de firmware

La interacción de datos de la actualización del firmware es relativamente grande, lo cual es muy adecuado para usar colas para garantizar la integridad de los datos. También se usa en nuestro proyecto 6. Durante el proceso de actualización del firmware, los bloques de datos del firmware descargados se pueden colocar en la cola y luego. escritos en la memoria flash en secuencia. Hay muchas aplicaciones similares. En general, las colas me han resuelto muchos problemas difíciles.

3. Principio de cola

La cola es una estructura de datos lineal que sigue el principio de primero en entrar, primero en salir (FIFO), es decir, los primeros datos en ingresar a la cola serán los primeros en eliminarse. En una cola, los datos generalmente se colocan en la cola en un extremo, llamado cola de la cola, y los datos se retiran de la cola en el otro extremo, llamado cabecera de la cola. Esta estructura hace que las colas sean muy adecuadas para situaciones en las que los datos deben procesarse de manera ordenada.

Podemos pensar en la cola como meter pelotas de ping pong en un tubo de dos vías. Introducimos pelotas de ping pong en el tubo desde la izquierda. Sacamos la pelota de ping pong por el lado derecho de la tubería. Esta acción se llama quitar la cola.

Las pelotas de ping pong en la tubería se alinearán en formación. La pelota de tenis de mesa que entre primero saldrá primero. Esta es la regla del primero en entrar, primero en salir de la cola.

Las pelotas de ping-pong se comparan con los datos. La tubería es un caché que almacena datos. La cantidad de pelotas de ping-pong que puede contener la tubería significa la cantidad de datos que puede almacenar el caché. Para decirlo sin rodeos, es el tamaño de la matriz. La cola en la imagen de arriba puede almacenar 4 datos. Es equivalente a Buff [4].

La implementación del programa de la cola se realiza a través de una matriz de tamaño fijo, un puntero de cabeza y un puntero de cola. Las matrices son responsables de almacenar datos. El puntero principal es responsable de la dirección de la que se deben extraer los datos al quitar la cola. El puntero de cola es responsable de en qué dirección se deben almacenar los datos cuando están en cola. Por lo tanto, las operaciones de poner en cola y quitar la cola son dos punteros que reproducen el algoritmo de datos primero en entrar, primero en salir en la matriz.

4. Uso de colas

Diferentes ingenieros implementan códigos de cola de manera diferente. Si no tiene una amplia experiencia en proyectos o no ha utilizado colas antes, no se avergüence de tener que poder escribir el algoritmo de cola.

Cuando comencé, también trasplanté directamente los programas de cola de otras personas y continué usándolos en mis propios proyectos. Después de usarlos de manera competente en varios proyectos, estudié el código detallado de la implementación del algoritmo de cola y lo escribí varias veces.

Por lo tanto, veteranos de nuestro campo de entrenamiento especial, no lo escriban ustedes mismos al principio. Aprendan a usarlo primero, saquen inferencias de un ejemplo, aplíquenlo a diferentes escenarios y proyectos, y luego intenten escribirlo ustedes mismos cuando estén familiarizados. con él. Esta es una secuencia de aprendizaje muy importante.

Tomemos como ejemplo el programa de cola de nuestro campo de entrenamiento especial del Proyecto Microcontrolador Infinito. Hay 4 funciones en total.

Cola Vacía(x)

Borrar la función de cola Antes de cada uso de la cola, la cola debe borrarse. La función de borrar hará que el puntero principal y el puntero final apunten a una dirección válida de forma predeterminada, que es el primer elemento de la matriz. Se producirá una excepción de dirección.

Descripción formal del parámetro: x - es una variable de estructura de cola

ColaDataIn(x,y,z)

La función de puesta en cola de datos es arrojar uno o más bytes de datos a la cola especificada.

Descripción formal del parámetro:

x - variable de estructura de cola

y - dirección de datos

z: la cantidad de datos que se pondrán en cola, en bytes.

Aviso:

①.Los datos ingresados ​​solo pueden ser del tipo char sin firmar.

② Si la cola está llena y los datos continúan en la cola, los datos se sobrescribirán desde la primera ubicación de datos.

Cola de datos de salida (x,y)

La función de eliminación de cola de datos consiste en tomar un byte de datos de la cola especificada.

Descripción formal del parámetro: x - Variable de estructura de cola y - Los datos extraídos, la dirección que se almacenará

Nota: Nuestra función de salida de cola solo puede tomar un byte de datos a la vez.

Longitud de datos de cola (x)

Borre todos los datos en la cola especificada. Descripción formal del parámetro: x - variable de estructura de cola

5. Uso de la cola de demostración en video

El siguiente contenido incluye algunas explicaciones de código y videos, que son inconvenientes de editar. Puede contactarme para organizar Feishu para una mejor experiencia de lectura.


Recientemente, muchos fanáticos me preguntaron cómo aprender microcontroladores. Basándome en mis diez años de experiencia en la industria, dediqué un mes a compilar cuidadosamente una "microcomputadora de un solo chip".

La mejor ruta de aprendizaje para microcontroladores + tutoriales desde nivel básico hasta avanzado para microcontroladores + kit de herramientas" ¡Todo compartido con fanáticos acérrimos de forma gratuita! ! !

Aparte de eso, estoy compartiendo entre lágrimas lo que tengo en el fondo de mi caja.22 proyectos populares de código abierto,IncluirCódigo fuente + esquema + PCB + documentación, dejasConviértete en un maestro rápidamente

Para paquetes de tutoriales y rutas de aprendizaje detalladas, consúltemeEl comienzo de este artículo a continuación.

Ruta de aprendizaje desde el nivel básico hasta el hacking avanzado de microcontroladores (con tutoriales + herramientas)

Ruta de aprendizaje desde el nivel básico hasta el hacking avanzado de microcontroladores (con tutoriales + herramientas)

Ruta de aprendizaje desde el nivel básico hasta el hacking avanzado de microcontroladores (con tutoriales + herramientas)