Introduction to RTOS Part 5 - Queue | Digi-Key Electronics

Introduction to RTOS Part 5 - Queue | Digi-Key Electronics

¿Cuáles son los peligros de usar variables globales en un RTOS?

Problemas con las variables globales

  • Se pueden utilizar variables globales para pasar información entre tareas en un RTOS, pero existen varios peligros asociados a su uso.
  • Un ejemplo es cuando una tarea actualiza una variable global y otra tarea la lee; esto puede llevar a problemas si múltiples tareas intentan modificar la misma variable simultáneamente.

Interrupciones y datos no seguros

  • Si una tarea (A) cambia una variable global y otra tarea (C) la modifica antes de que la tarea (B) tenga oportunidad de leerla, se puede corromper el dato.
  • En sistemas de 32 bits, escribir un número de 64 bits requiere dos ciclos de instrucción, lo que puede resultar en lecturas incorrectas si se interrumpe el proceso.

Escritura concurrente y corrupción de datos

  • Si durante el proceso de escritura, otra tarea (C) interrumpe a la tarea (A), puede sobrescribir datos importantes, resultando en información corrupta.
  • Esto demuestra que los datos ya no reflejan lo que pretendían las tareas originales.

Soluciones para evitar problemas

  • Una forma de prevenir estos problemas es mediante operaciones atómicas que aseguran que ciertas instrucciones se ejecuten sin interrupciones.
  • Otra solución es utilizar objetos del kernel como mutex o semáforos para proteger los datos compartidos entre tareas.

¿Cómo funcionan las colas en FreeRTOS?

Introducción a las colas

  • Las colas permiten pasar mensajes ininterrumpidos entre tareas, funcionando como un sistema FIFO (primero en entrar, primero en salir).
  • Al agregar elementos a una cola, se realiza por valor y no por referencia; esto significa que se copia todo el contenido del elemento al añadirlo.

Manejo asíncrono y temporización

  • Las colas no están limitadas por tipo; puedes copiar cualquier cosa siempre que haya suficiente espacio en memoria.
  • Se pueden establecer tiempos de espera para recibir o enviar elementos. Si la cola está vacía o llena, se devuelve un código de estado falso indicando que no se pudo realizar la operación.

Funciones esenciales para trabajar con colas

  • Las funciones más relevantes incluyen crear, eliminar, enviar y recibir elementos desde la cola.
  • Es importante tener cuidado al interactuar con colas dentro de rutinas de servicio de interrupción debido a su naturaleza asincrónica.

Ejemplo práctico: Implementación con Arduino

Configuración inicial del programa

  • Se limitará el programa a un núcleo del ESP32 y se definirá la longitud máxima de la cola.
  • Se declarará una variable global para acceder a la cola desde ambas tareas.

Lectura desde la cola

Implementación de Colas en Tareas Concurrentes

Configuración Inicial de la Cola

  • Se define una variable donde se copiará el ítem de la cola. Se menciona que se debe lanzar esta dirección como un puntero vacío, recordando que es lo que espera la función.
  • El tercer parámetro es el tiempo de espera en ticks; si se establece en cero, retornará inmediatamente con pd true si algo fue leído o pd false si no.

Creación y Manejo de la Cola

  • Se crea una cola utilizando xq create, especificando el número de ítems (5) y el tamaño de cada uno. Los ítems pueden ser caracteres, estructuras o simplemente un bloque de memoria.
  • En el bucle principal, se incrementa un número estático con cada ejecución. Se llama a xq send, pasando el manejador de la cola y la dirección del contador, lanzándolo nuevamente como puntero vacío.

Manejo de Errores y Comportamiento del Sistema

  • Si no se puede copiar el valor a la cola tras 10 ticks, la función retorna pd false, lo cual genera un mensaje de error. Es recomendable asignar un periférico por tarea para evitar conflictos.
  • Al ejecutar el código, al abrir el terminal serial, los valores deberían imprimirse aproximadamente una vez por segundo.

Ajustes en las Tasas de Envío y Recepción

  • Al cambiar el retraso en la tarea de envío a 500 milisegundos, se observa que la cola se llena más rápido de lo que se lee. Esto puede resultar en pérdida de datos si no se maneja adecuadamente.
  • La programación comenzará a descartar elementos que no pueda agregar a la cola; esto debe considerarse cuidadosamente al implementar colas.

Desafíos Propuestos

  • Se propone usar colas para resolver problemas relacionados con variables globales entre tareas. La tarea A debe imprimir mensajes nuevos desde q2 y leer entradas del usuario.
  • La tarea B monitorea q1 para actualizar una variable local con nuevos valores; esta variable controla un LED parpadeante.

Interacción del Usuario y Notificaciones

  • Si el usuario ingresa "delay" seguido por un número, este comando actualiza la tasa del parpadeo del LED. También hay notificaciones cuando recibe nuevos valores.
  • Para simular una interfaz tipo consola, es necesario utilizar programas como Putty para ingresar caracteres rápidamente; esto permite ver cómo cambia la tasa del LED al recibir comandos específicos.

Consideraciones Finales

Video description

A queue is a first-in, first-out (FIFO) system that is used to store and pass information between tasks in an RTOS. Data copied to a queue will appear at the front of the queue, and any data added after that will line up behind it. When a task reads from a queue, the value at the front is removed, and all other tasks shift forward by one slot. The solution to the challenge in the video can be found here: https://www.digikey.com/en/maker/projects/introduction-to-rtos-solution-to-part-5-freertos-queue-example/72d2b361f7b94e0691d947c7c29a03c9 Code for this video series (including demonstrations, challenges, and solutions) can be found here: https://github.com/ShawnHymel/introduction-to-rtos When a queue is a kernel object within an operating system, read and write operations should be atomic (as they are with FreeRTOS). Atomic operations means that other threads cannot interrupt the operation while it is executing and overwrite or read partial data from shared variables or buffers. As a result, we can use queues to pass information between tasks in an operating system without fear of losing the data or having it be corrupted by other threads. In this video, we begin by showing how threads can interrupt each other to overwrite data or read partial data in shared resources (such as a global variable or shared memory). We then examine queues and show how they can protect shared resources. They are an essential form of inter-task communication to pass messages between tasks. Additionally, we provide an example of using queues in FreeRTOS on an ESP32 using the Arduino framework. A challenge is issued at the end to use queues in your own program. Product Links: https://www.digikey.com/en/products/detail/adafruit-industries-llc/3405/7244967 Related Videos: Introduction to RTOS Part 1 - What is a Real-Time Operating System (RTOS)? - https://youtu.be/F321087yYy4​ Introduction to RTOS Part 2 - Getting Started with FreeRTOS - https://youtu.be/JIr7Xm_riRs​ Introduction to RTOS Part 3 - Task Scheduling - https://youtu.be/95yUbClyf3E​ Introduction to RTOS Part 4 - Memory Management - https://youtu.be/Qske3yZRW5I​ Introduction to RTOS Part 5 - Queue - https://youtu.be/pHJ3lxOoWeI​ Introduction to RTOS Part 6 - Mutex - https://youtu.be/I55auRpbiTs​ Introduction to RTOS Part 7 - https://youtu.be/5JcMtbA9QEE​ Introduction to RTOS Part 8 - https://youtu.be/b1f1Iex0Tso Introduction to RTOS Part 9 - https://youtu.be/qsflCf6ahXU Introduction to RTOS Part 10 - https://youtu.be/hRsWi4HIENc Introduction to RTOS Part 11 - https://youtu.be/C2xKhxROmhA Introduction to RTOS Part 12 - https://youtu.be/LPSHUcH5aQc Related Project Links: https://www.digikey.com/en/maker/projects/introduction-to-rtos-solution-to-part-5-freertos-queue-example/72d2b361f7b94e0691d947c7c29a03c9 Related Articles: https://www.digikey.com/en/maker/videos/shawn-hymel/getting-started-with-stm32-and-nucleo-part-3-how-to-run-multiple-threads-with-cmsis-rtos-interface Learn more: Maker.io - https://www.digikey.com/en/maker Digi-Key’s Blog – TheCircuit https://www.digikey.com/en/blog Connect with Digi-Key on Facebook https://www.facebook.com/digikey.electronics/ And follow us on Twitter https://twitter.com/digikey