2mp.conae.gov.ar I sae.2mp@conae.gov.a Manual Misión SAE FreeOSEK. VERSION 1.1 Tabla de contenidos 1. [ Introducción ].................................................................................................................................... 4 1.1. Sistemas operativos ..................................................................................................................... 4 1.2. CIAA-Firmware + FreeOSEK.......................................................................................................... 4 2. [ Configuración ] .................................................................................................................................. 5 3. [ Tipos de tareas ] ................................................................................................................................ 6 4. [ Prioridades ] ...................................................................................................................................... 7 5. [ Scheduling ] ....................................................................................................................................... 7 6. [ Ejemplo ] ........................................................................................................................................... 8 1. [ Introducción ] 1.1. Sistemas operativos Los sistemas embebidos son plataformas con recursos muy limitados en comparación con una PC. Es por esto que generalmente no tienen un sistema operativo completo, sino sólo el subconjunto de estos que pueden manejar ventajosamente. Incluso en algunos casos el OS no es un programa en sí mismo sino que es un conjunto de funciones que se ejecutan solo en momentos determinados del programa Una tarea importante de los sistemas operativos es la de asignar tiempo de ejecución a todos los programas que tiene cargados en base a un juego de reglas conocido de antemano. A estos subprogramas se los llama tareas. Con esto se logra la ilusión de que múltiples programas se ejecutan simultáneamente, aunque en realidad sólo pueden hacerlo de a uno a la vez (en sistemas con un sólo núcleo, como es el caso general de los sistemas embebidos). Un RTOS es un sistema operativo de tiempo real. Esto significa que hace lo mismo que un OS común pero además ofrece herramientas para que los programas de aplicación puedan cumplir compromisos temporales definidos por el programador. El objetivo del mismo es diferente de un OS convencional. Un RTOS se emplea cuando hay que administrar varias tareas simultáneas con plazos de tiempo estrictos. 1.2. CIAA-Firmware + FreeOSEK CIAA-Firmware utiliza OSEK-OS, que es un estándar de RTOS (del inglés Sistema Operativo de Tiempo Real) internacional creado por la industria automotriz y de libre licencia, su ventaja respecto de otros es que es un estándar y por ende existen muchas implementaciones (open source y cerradas). Además de que hay muchas empresas que proveen soporte. Al ser un estándar abierto, quien quiera es libre de usar el estándar, implementarlo, venderlo, comprarlo, etc. Específicamente, el OSEK de CIAA-Firmware está basado en FreeOSEK. FreeOSEK es un RTOS escalable para sistemas embebidos basado en las especificaciones OSEK-VDX y que a diferencia de otros sistemas operativos como Linux y Windows es un sistema operativo estático. Esto significa que las tareas, sus prioridades, cantidad de memoria que utilizan y etc. es definido antes de compilar el código, en un proceso que se llama generación. Esta característica ofrece entre otras cosas: Determinístico Más performance Menos recursos Testeabilidad Lo que lo hace un SO optimo para aplicaciones industriales. OSEK-VDX es un comité de estandarización creado en 1994 por las automotrices europeas. OSEKVDX incluye varios estándares que se utilizan en la industria automotriz, entre ellos los más relevantes. El estandard OSEKVDX es utilizado con exito desde hace mas de una decada en la industria automotriz. 4 FreeOSEK. Versión 1.0 2. [ Configuración ] FreeOSEK cuenta con un lenguaje propio para su configuración: OIL, que significa OSEK, Implementation Languaje. Mediante una sintaxis determinada se puede describir cada componente del sistema operativo y la relación entre ellos. Esto permite optimizar recursos, dado que solo se utilizaran los servicios descriptos en el archivo .oil. A continuación se presenta como ejemplo un descriptor de tarea: TASK TaskA { PRIORITY = 2; ACTIVATION = 1; AUTOSTART = TRUE RESOURCE = res1; RESOURCE = res2; EVENT = evt1; StackSize = 128; } Podemos definir del mismo que: La tarea A tendrá una prioridad nivel 2 (PRIORITY = 2) Solo se podrá activar (ejecuciones simultáneas) una sola vez (ACTIVATION = 1) Comenzará a ejecutarse al inicio del sistema (AUTOSTART = TRUE). Utilizara los recursos “res1”, “res2” y el evento “evt1”. Podrá almacenar en memoria 128 bytes (StackSize = 128) Referencia sobre OIL: http://portal.osek-vdx.org/files/pdf/specs/oil25.pdf 5 FreeOSEK. Versión 1.0 3. [ Tipos de tareas ] Básicas Son aquellas tareas que liberan el procesador si terminan su proceso, dejando lugar a que se ejecute otras tareas. Además pueden ser interrumpidas por otras tareas o por interrupciones. Extendidas Poseen las mismas caracteristicas que las tareas básicas, pero además pueden esperar la ocurrencia de eventos. Ilustración 1 Las funciones ofrecidas para cambiar de tarea, generar o esperar eventos son: ActivateTask() TerminateTask() ChainTask() Schedule SetEvent() WaitEvent() Referencia : http://portal.osek-vdx.org/files/pdf/specs/os223.pdf 6 FreeOSEK. Versión 1.0 Ejemplo de descriptor de una tarea y su implementación en CIAA-Firmware Archivo OIL TASK InitTask { PRIORITY = 1; ACTIVATION = 1; AUTOSTART = TRUE { APPMODE = AppMode1; } STACK = 2048; TYPE = BASIC; SCHEDULE = NON; } APPMODE = AppMode1; Archivo main.c TASK(InitTask) { ciaaPOSIX_printf(“InitTask is running\n”); TerminateTask(); } 4. [ Prioridades ] La prioridad de una tarea es la forma de gestionar la cadena de ejecución de las tareas. Los niveles de prioridades comienzan con el número 0, reservado a la tarea idle, en la cual el sistema operativo no tiene ninguna tarea que ejecutar y puede ahorrar recursos y energía manteniéndose en modo bajo consumo. El nivel de prioridad aumenta cuanto mayor es el número asignado a la tarea. 5. [ Scheduling ] Se denomina Scheduler al algoritmo que realiza el intercambio de tareas. Sacando de ejecución a una tarea y colocando a otra. Como regla general se puede decir que siempre se ejecutará la tarea de mayor prioridad, y en caso de ser varias tareas de la misma prioridad se ejecutara la que acumule más tiempo sin ser ejecutada. En la Ilustración 2, se ven dos tareas, T1 de prioridad mayor que T2. Al inicio del sistema T2 se encuentra ejecutándose, y T1 está suspendida. En un momento ocurre la activación de T1, entonces el Scheduler detecta que hay una tarea de mayor prioridad que puede entrar en ejecución y realiza el cambio de tareas o también llamado cambio de contexto. Al finalizar su ejecución T1 devuelve el microprocesador al Scheduler, y el Scheduler vuelve a su estado anterior con T1 suspendida hasta la próxima activación y T2 en estado de ejecución. 7 FreeOSEK. Versión 1.0 Ilustración 2 6. [ Ejemplo ] Nombre del proyecto: Plantilla En el proyecto plantilla se definen varias tareas, sin embargo no todas se ejecutan en el mismo tiempo. Varias de ellas son de inicialización, y se ejecutan solo al iniciar el sistema. Se detallan a continuación las tareas del proyecto Plantilla: TareaInicializacion TASK TareaInicializacion { PRIORITY = 20; ACTIVATION = 1; AUTOSTART = TRUE { APPMODE = AppModeMision; } STACK = 512; TYPE = BASIC; SCHEDULE = NON; RESOURCE = POSIXR; EVENT= POSIXE; } Es la tarea de mayor prioridad, es la encargada de iniciar el ciaa-kernel para el manejo de los periféricos del CIAA-Firmware. Al finalizar la carga de los drivers activa a la tarea “TareaInicializarXBee“ con la función “ChainTask()”. 8 FreeOSEK. Versión 1.0 TareaInicializarXBee y TareaInicializarSensores TASK TareaInicializarXBee { TASK TareaInicializarSensores { PRIORITY = 15; PRIORITY = 10; ACTIVATION = 1; ACTIVATION = 1; STACK = 1024; STACK = 1024; TYPE = EXTENDED; TYPE = EXTENDED; SCHEDULE = NON; SCHEDULE = NON; EVENT = POSIXE; EVENT = POSIXE; RESOURCE = POSIXR; RESOURCE = POSIXR; RESOURCE = ResourceUART; RESOURCE = ResourceBusI2C; } } ALARM AlarmaInicializarXBee { ALARM AlarmaInicializarSensores { COUNTER = SoftwareCounter; COUNTER = SoftwareCounter; ACTION = ACTIVATETASK { ACTION = ACTIVATETASK { TASK = TareaInicializarXBee; TASK = TareaInicializarSensores; } } } } Ambas tareas cuentan con alarmas propias para ser activadas en un tiempo determinado. Como son funciones de inicialización es deseable que no sean interrumpidas para eso se utilizo el descriptor SCHEDULE = NON. Al finalizar sus procesos las tareas no vuelven a activarse y permanecen suspendidas el resto del tiempo. 9 FreeOSEK. Versión 1.0 TareaMisionPrimaria TASK TareaMisionPrimaria { PRIORITY = 2; ACTIVATION = 1; AUTOSTART = TRUE { APPMODE = AppModeMision; } STACK = 1024; TYPE = EXTENDED; SCHEDULE = FULL; EVENT = POSIXE; RESOURCE = POSIXR; RESOURCE = ResourceBusI2C; RESOURCE = ResourceUART; RESOURCE = ResourceVariablesMision; } ALARM AlarmaMisionPrimaria { COUNTER = SoftwareCounter; ACTION = ACTIVATETASK { TASK = TareaMisionPrimaria; } } La tarea de misión primaria posee prioridad 2, o sea es de mayor prioridad que la misión secundaria, pero de menor prioridad que la tarea de lectura de sensores. Cuenta con una alarma propia para activarse en intervalos de tiempo fijo. Permite ser interrumpida (por ejemplo, por la tarea de sensores), y comienza su ejecución al inicio del sistema. 10 FreeOSEK. Versión 1.0 TareaMisionSecundaria TASK TareaMisionSecundaria { PRIORITY = 1; ACTIVATION = 1; AUTOSTART = TRUE { APPMODE = AppModeMision; } STACK = 1024; TYPE = EXTENDED; SCHEDULE = FULL; EVENT = POSIXE; RESOURCE = POSIXR; RESOURCE = ResourceUART; RESOURCE = ResourceVariablesMision; } ALARM AlarmaMisionSecundaria { COUNTER = SoftwareCounter; ACTION = ACTIVATETASK { TASK = TareaMisionSecundaria; } } La tarea de misión secundaria es la de menor prioridad y puede ser interrumpida siempre. Cuenta con una alarma propia también y utiliza los mismos recursos que la misión primaria. 11 FreeOSEK. Versión 1.0 TareaLeerSensores TASK TareaLeerSensores { PRIORITY = 3; ACTIVATION = 1; AUTOSTART = TRUE { APPMODE = AppModeMision; } STACK = 1024; TYPE = EXTENDED; SCHEDULE = FULL; RESOURCE = POSIXR; EVENT = POSIXE; RESOURCE = ResourceBusI2C; RESOURCE = ResourceVariablesMision; } ALARM AlarmaLeerSensores { COUNTER = SoftwareCounter; ACTION = ACTIVATETASK { TASK = TareaLeerSensores; } } La tarea encargada de leer el estado de los sensores es la de mayor prioridad y podrá interrumpir a las otras dos tareas. 12 FreeOSEK. Versión 1.0