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 truesi algo fue leído opd falsesi 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