Introduction to RTOS Part 3 - Task Scheduling | Digi-Key Electronics

Introduction to RTOS Part 3 - Task Scheduling | Digi-Key Electronics

¿Cómo funciona el programador en FreeRTOS?

Introducción a la programación multi-hilo

  • Se discute la importancia de un sistema operativo en tiempo real (RTOS) y cómo se ejecutan múltiples tareas en FreeRTOS.
  • En microcontroladores, se pueden agregar interrupciones basadas en hardware para manejar eventos como desbordamientos de temporizador o cambios de pin.

Utilización del procesador y división del tiempo

  • La utilización del procesador varía con el tiempo; si solo hay un núcleo disponible, debe dividir su tiempo entre las diferentes tareas.
  • FreeRTOS utiliza una forma de "time slicing" donde un temporizador interrumpe al procesador a intervalos regulares, comúnmente cada milisegundo.

Funcionamiento del programador

  • El programador selecciona la tarea con mayor prioridad para ejecutar durante cada intervalo de tiempo (tick).
  • Si una tarea no ha terminado su ejecución y entra en estado bloqueado, el programador permite que continúe hasta que haya otras tareas listas para ejecutarse.

Ejecución de tareas y prioridades

  • Cuando las tareas B y C entran al estado listo, deben esperar al siguiente tick para ser ejecutadas.
  • Las tareas B y C tienen prioridad más alta que A; por lo tanto, son elegidas para ejecutarse primero mediante un esquema de planificación preemptiva.

Interrupciones y estados de las tareas

  • Las interrupciones por hardware tienen siempre mayor prioridad sobre las tareas software a menos que se deshabiliten explícitamente.
  • Se recomienda tener solo una rutina de servicio por interrupción activa a la vez para mantener la eficiencia.

Estados de las tareas en FreeRTOS

  • En sistemas multicore, el programador puede asignar algunas tareas a otros núcleos; sin embargo, se opta por usar un solo núcleo para simplificar ejemplos.
  • Al crear una tarea, esta entra automáticamente al estado listo. Solo será ejecutada si no hay otras tareas con mayor prioridad esperando.

Bloqueo y suspensión de tareas

  • Una tarea puede entrar al estado bloqueado cuando llama a funciones API como vTaskDelay, esperando eventos específicos antes de volver al estado listo.

Introducción al Cambio de Contexto en RTOS

Conceptos Básicos del Cambio de Contexto

  • El cambio de contexto implica recordar el estado exacto de una tarea, incluyendo variables y valores en RAM y registros del CPU.
  • Este proceso se conoce como "context switching", donde se guarda y restaura el contexto de las tareas. Se recomienda revisar la documentación de FreeRTOS para gráficos y ejemplos detallados sobre este tema.

Ejemplo Práctico con Arduino

  • Se presentará un ejemplo simple en Arduino que muestra la preempción de tareas utilizando un solo núcleo.
  • La primera tarea cuenta caracteres en una cadena y los imprime uno por uno, evitando imprimir toda la cadena a la vez para permitir interrupciones por otras tareas.

Manejo del Estado de Tareas

  • Al finalizar la impresión, la tarea se bloquea durante un segundo; FreeRTOS gestiona su retorno al estado listo después del tiempo especificado.
  • Una segunda tarea imprimirá un carácter asterisco cada 100 milisegundos, con prioridad más alta para poder interrumpir a la primera tarea.

Configuración Inicial y Ejecución

  • En el setup, se utilizará una tasa de baudios lenta para observar el funcionamiento en tiempo real; se recomienda añadir un retraso inicial al trabajar con ESP32.
  • Las prioridades asignadas son: Tarea 1 (prioridad 1) y Tarea 2 (prioridad 2), permitiendo controlar estas tareas desde una tercera.

Eliminación Segura de Tareas

  • Es crucial verificar que el manejador de la tarea no sea nulo antes de eliminarla con vTaskDelete, ya que llamar a esta función sobre una tarea inexistente puede causar fallos graves.

Observaciones Finales

  • Después de cargar el programa en ESP32, es necesario ajustar la tasa de baudios a 300 para sincronizarse con el código escrito.
  • Se espera ver cómo las funciones setup y loop corren como sus propias tareas, mostrando tanto los mensajes regulares como los asteriscos intermitentes.

Desafío Propuesto

  • El reto consiste en crear un programa que use dos tareas para controlar la frecuencia parpadeante de un LED basado en entradas desde el terminal serial. Esto permite crear una interfaz sencilla e independiente del hardware controlado.

Próximos Temas

Video description

The RTOS scheduler decides which task to run on a recurring basis, and some tasks can interrupt and run before other tasks in a process known as “preemption.” 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-3-task-scheduling/8fbb9e0b0eed4279a2dd698f02ce125f CORRECTION at 2:37: A higher priority task in FreeRTOS will immediately preempt other tasks and run if it is made ready. It does not wait for the next tick to run. Thanks to @G-aurav B-hattarai for pointing this out! In this video, we examine how the FreeRTOS scheduler makes a decision at every tick (recurring timer interval) to determine which task to run for the remainder of the tick. With a single-core processor, this time-slicing allows tasks to run in a fashion that appears to be concurrent to the user. Tasks with higher priority are chosen to run before tasks with lower priority. However, not all tasks need to be run. Only tasks in the “ready” or are already in the “running” state can be chosen to run next. A task may put itself or another task in a “blocked” state by using one of the appropriate blocking functions, like vTaskDelay(). Tasks that are waiting for an external event, such as a free semaphore or a serial transmission, may also enter the blocked state. The expiration of a timer or received resource may move a task from the “blocked” state to the “ready” state. Additionally, a task may put another task into the “suspended” state with the vTaskSuspend() function. This prevents the suspended task from running until another task calls the vTaskResume() function on the suspended task. Note that tasks with equal priority are executed in a round-robin fashion. 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: Introduction to RTOS Part 3 - Task Scheduling -https://www.digikey.com/en/maker/projects/introduction-to-rtos-solution-to-part-3-task-scheduling/8fbb9e0b0eed4279a2dd698f02ce125f Related Articles: Getting Started with STM32 and Nucleo Part 3 - 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