Manual del sistema operativo de tiempo real

Anuncio
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
Descargar