Desarrollo Aplicaciones con Sistemas Operativos en Tiempo Real para Microcontroladores Microchip PIC - FreeRTOS 1. Introducción Sistema Embebido • Es un sistema computacional • Recursos limitados • Realizan una o algunas pocas funciones dedicadas Sistemas de Hilo Único Sistemas de Hilo Único Que es un SO? • Programa que gestiona el Hardware de un equipo • Proporciona una base para programas aplicación • Intermediario entre el Usuario y el Hardware • Ejecutar programas y resolver problemas fácilmente Que es un RTOS? • • • • Sistema Operativo en Tiempo Real (Real Time Operating System) Cumplir compromisos temporales Se emplea cuando hay que administrar varias tareas con plazos de tiempo estrictos Sistema de Tiempo Real • Esta definido por: – Los eventos externos que debe atender – La respuesta ante esos eventos – Requerimientos temporales de las respuestas a eventos Por qué usar un RTOS? • Para cumplir compromisos temporales estrictos • Para simplificar manejo del tiempo – Uso de temporizadores • Multitarea • Escalabilidad • Reutilización de código Por qué usar un RTOS? Tomar en Cuenta… • Se gasta tiempo de CPU en Schedulling • Gasta memoria • Se gasta memoria de control dedicada a cada tarea (TCB – Task Control Block) • Cuidadoso análisis de tiempos para eventos y respuestas Partes de un RTOS 1 • Planificador (scheduler) – Administra el tiempo del CPU – Determina ejecución tareas – Reemplaza tareas en ejecución debido eventos Partes de un RTOS 2 • Servicios RTOS – Manejo interrupciones – Temporizadores – Administración de memoria – Entradas / salidas (IO’s) Partes de un RTOS 3 • Sincronización y mensajería – Colas – Semáforos – Mutexes 2. FreeRTOS Características • Código Abierto – No tiene costo “FreeRTOS” • Fácil de implementar – Existe mucha Documentación ! • Pensado para Microcontroladores – Escrito mayormente en C – Es liviano en tamaño de código Características • MicroKernel de Tiempo Real – Servicios mínimos e indispensables • Modo Cooperativo, Preemptive o mixto • Ofrece funciones de: – Temporización – Comunicación y sincronización entre tareas 2. Tareas en FreeRTOS Tareas - Tasks • Es una pieza de código secuencial que tiene como objetivo el cumplir con alguna función de nuestro sistema embebido • Cada Tarea posee un conjunto de recursos que identifican el estado de ejecución (CONTEXTO) Tipos de Tareas • 3 tipo de tareas – Periódicas – Aperiódicas – Procesamiento Continuo Tareas - Contexto • Cada Tarea posee un conjunto de recursos sus respectivo estado de ejecución (CONTEXTO) – IP (Instruction pointer) – SP (Stack Pointer) – Registros de CPU – Contenido de la pila en uso Como es un Tarea en FreeRTOS? • Richard Barry dice: – Se implementan con funciones de C – Deben devolver void – Deben recibir un puntero a void como parametro • No deben incluir return • No deben ejecutarse hasta la llave de cierre Funciones Importantes • Funciones para trabajar con Tareas: – portBASE_TYPE xTaskCreate(…); – Void vTaskStartScheduler(void); – Void vPrintString(const char*); Crear Tareas en FreeRTOS • vTaskCreate() Crear Tareas en FreeRTOS • Parámetros vTaskCreate(): – – – – – – pvTaskcode PcName usStackDepth pvParameters uxPriority pxCreatedTask • Retorna – pdTRUE – errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY Ejemplo Tarea en FreeRTOS Ejemplo Tarea en FreeRTOS Ejemplo Tarea en FreeRTOS Ejemplo Tarea en FreeRTOS Ejemplo Tarea en FreeRTOS Ejemplo Tarea en FreeRTOS Ejemplo Tarea en FreeRTOS Ejemplo Tarea en FreeRTOS Estados de las Tareas Temporizadores de Software • Funciones – vTaskDelay(portTickType xTickToDelay) – vTaskDelayUntil(….) • La tarea pasa al estado de Bloqueo 3. Planificador en FreeRTOS Tipos de Planificación • Planificador (scheduler) – Cooperative – Preemptive – Round – Robin Planificación - Schedulling • Planificador (scheduler) – Cooperative – Preemptive – Round – Robin Algoritmo Planificación • Fixed priority preemptive scheluing • Ejecuta la tarea de mayor prioridad • Si existen dos tareas con = prioridad – Retira tarea en ejecución – Round Robin Algoritmo Planificación • En FreeRTOS – TICK_RATE_HZ – Segmento de tiempo Algoritmo Planificación • Un valor bajo TICK_RATE hace que el sistema sea lento • TICK_RATE hace que el scheduler trabaje mas seguido • TICK_RATE valor de compromiso entre estos dos extremos Cambio de Contexto • Context switching – Scheudler invoca al Dispatcher – Guarda el contexto actual y lo reemplaza – Por esta razón se reserva un bloque de memoria de datos para cada tarea Consideraciones de Diseño • Asignar prioridades de acuerdo a la importancia • Evitar el “starving” de tareas de menor prioridad • Análisis detallado de: – Eventos – Compromisos temporales Temporizadores de Software • vTaskDelay(….) – Produce una demora – Cede control CPU • vTaskDelayUntil(….) – Tiempo constate entre llamadas sucesivos Tareas Periódicas • En FreeRTOS se implementan mediante la función: – vTaskDelayUntil() • Pasa mayor parte de su tiempo en estado de bloqueo y cuando expira el tiempo pasa a estado Ready 4. Sincronización de Tareas Tareas Aperiódicas • Bloqueada hasta que ocurra un evento • Semaforos • Se desea que las tareas de mayor prioridad sedan el CPU Semáforos • Mismo concepto un semáforo vial • Restringe el acceso a un sección particular del programa • Es una Herramienta Sincronización Herramienta Sincronizacion • Mismo concepto un semáforo vial • Restringe el acceso a un sección particular del programa 5. Manejo de Colas Intercambio de Datos entre Tareas • Alternativa Variables Globales, pero: – Cuidar el acceso al recurso – Tareas aperiodicas • Necesidad de un Mecanismo de comunicación sincronizado • Cuando una tarea produce datos mas rápido de los que se los consume Solucion al intercambio • Usar Colas (queues) • Son visibles por todas las tareas – Deben ser creadas de forma global • Incorporan mecanismo de sincronizacion • Se puede bloquear al leer/escribir datos Solucion al intercambio • Usar Colas (queues) • Son visibles por todas las tareas – Deben ser creadas de forma global • Incorporan mecanismo de sincronización • Se puede bloquear al leer/escribir datos Funcionamiento de una COla 6. Administración de Recursos Problemáticas de Concurrencia • Tareas pueden requerir usar un mismo recurso al mismo tiempo – Existe cambio de contexto – Ejemplo escribir en un LCD – Ejemplo Escribir un UART Exclusión mutua • Solución mediante turnado de procesos • FreeRTOS ofrece varias alternativas – Deshabilitar interrupciones • Sistema se vuelve cooperativo • Protege contra otras tareas y no escucha eventos – Suspender el scheduler – Mutex Exclusión mutua • Solución mediante turnado de procesos • FreeRTOS ofrece varias alternativas – Deshabilitar interrupciones • Sistema se vuelve cooperativo • Protege contra otras tareas y no escucha eventos – Suspender el scheduler – Subir la prioridad de la tarea – Mutex Mutex del Sistemas • Con una llave de acceso al recurso • Solo puede acceder al recurso la tarea que tiene tomado el mutex • La tarea debe devolver el mutex cuando la tarea termina su trabajo Problema del Mutex • Inversión de prioridades – Tarea de prioridad alta esta bloqueada espera su tiempo de ejecutar – Mientras una tarea de baja prioridad toma un mutex para acceder a un recurso protegido durante tiempo prolongado – La tarea de alta prioridad pasa al estado ready e intenta acceder al recurso pero este se encuentra ocupado por la tarea de baja prioridad Problema del Mutex • Inversión de prioridades – Ahora imaginemos una tercera tarea de prioridad intermedia que pasa al estado Ready durante otro tiempo prolongado – La tarea de alta prioridad vuelve a esperar a que la tarea de baja prioridad libere el mutex para terminar de usar el recurso – Free RTOS incorpora Herencia de Prioridad Herencia de Prioridad • El Scheduler eleva la prioridad de la tarea (de baja prioridad) – La eleva al nivel de la tara de mayor prioridad – Y que pasa cuando se tiene la misma prioridad en dos tareas??? – Roun Robin = segmento de tiempo Herencia de Prioridad • Excepción al algoritmo Fixed priority preemptive scheduling • No soluciona la inversión de prioridad • Reduce la duración de la inversión Preguntas GRACIAS!!!