Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Curso 2003-2004
-I-
INDICE
1.
Multitarea ................................................................................................................. 1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 Introduccin...................................................................................................... 1 Objetivos........................................................................................................... 1 Descripcin....................................................................................................... 1 Creacin y activacin de tareas ........................................................................ 2 Ejemplo............................................................................................................. 2 Trabajo con el cdigo del ejemplo ................................................................... 3 Modificacin del ejemplo................................................................................. 4
2.
Semforos ................................................................................................................. 5 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Introduccin...................................................................................................... 5 Objetivo ............................................................................................................ 5 Descripcin....................................................................................................... 5 Control de los semforos .................................................................................. 6 Ejemplo: ........................................................................................................... 8 Trabajo con el cdigo del ejemplo ................................................................... 9 Modificacin del ejemplo................................................................................. 9
3.
Informacin adicional............................................................................................... 9
Tareas y mensajes
-1-
1. Multitarea
1.1 Introduccin
Los sistemas de tiempo real modernos se basan en los conceptos complementarios de multitarea y comunicacin entre tareas. Un entorno multitarea permite que las aplicaciones en tiempo real se construyan como un conjunto de tareas independientes, cada una de ellas con un hilo de ejecucin separado y con su propio conjunto de recursos de sistema. Las facilidades de comunicacin entre tareas permiten que las tareas se sincronicen y coordinen sus actividades. El ncleo multitarea de VxWorks, wind, utiliza una planificacin por prioridades, basada en interrupciones. Ofrece un rpido cambio de contexto y una baja latencia de interrupcin.
1.2 Objetivos
El objetivo principal de esta primera parte de la prctica es el siguiente:
Inicializar mltiples procesos usando las rutinas de tareas de VxWorks con
diferentes prioridades.
1.3 Descripcin
La multi-tarea crea la apariencia de muchos hilos de ejecucin que se ejecutan en paralelo cuando, de hecho, el ncleo entrelaza su ejecucin sobre la base de un algoritmo de planificacin. Cada programa aparentemente independiente se llama tarea. Cada tarea tiene su propio contexto, que es el entorno de la CPU y los recursos del sistema que ve la tarea cada vez que es planificada por el ncleo para ejecutarse. En un cambio de contexto, el contexto de una tarea se guarda en el bloque de control de tarea (TCB, Task Control Block). El contexto de una tarea incluye:
un hilo de ejecucin, es decir, el contador de programa de la tarea los registros de CPU y los de punto flotante necesarios una pila de variables dinmicas y las direcciones de retorno de llamadas a
funcin
asignacin de dispositivos E/S para la entrada, salida y salida de error estndares un temporizador de retardo (delay timer) un temporizador de rodaja de tiempo (timeslice timer) estructuras de control del ncleo manejadores de seal
Tareas y mensajes
-2-
nombre de la nueva tarea (una cadena de caracteres ASCII). prioridad (0-255). Siendo 0 la mxima prioridad y 255 la mnima opciones. Es un valor hexadecimal o una constante predefinida (VX_FP_TASK, VX_NO_STACK_FILL,VX_PRIVATE_ENV, VX_UNBREAKABLE). tamao de la pila o stacksize en bytes (int). direccin o nombre de la rutina principal ejecutada por la tarea. Su tipo debe ser FUNCPTR. y 10 argumentos que se pasarn a la rutina principal como parmetros de arranque.
1.5 Ejemplo
Crear una tarea que muestre su nombre y su identificador:
/* librerias utilizadas */ #include <vxWorks.h> #include <taskLib.h> #include <stdio.h> /* Prototipos de funciones locales */ void print(void) ; /* funcion que se va a ser lanzada por la tarea */
int LanzarTarea (void) /* funcion que crea y lanza la tarea */ { int t_taskID ; /* ID Identificador de la tarea */ char * sNombreTarea = "tTarea_1" ; /* Nombre de la tarea */ if ( (t_taskID = taskSpawn(sNombreTarea,90,VX_FP_TASK,2000, (FUNCPTR) print,0,0,0,0,0,0,0,0,0,0)) == ERROR ) { printf ("\nNO SE HA PODIDO CREAR LA TAREA: %s\n", sNombreTarea) ; exit (-1) ; } return (0) ; } /* LanzarTarea */ void print (void) /* Muestra nombre e identificador de tarea que la ejecuta*/ { printf("\nHola, soy la tarea %s y mi ID es %d\n", taskName(taskIdSelf()), taskIdSelf()); } /* print */
Tareas y mensajes
-3-
4.
Lanzar una tarea que ejecute la rutina principal del ejemplo ("LanzarTarea"). a) b) c) -> -> -> -> -> sp LanzarTarea repeat period i td IdentificadorDeLaTarea 3 , 2 , LanzarTarea LanzarTarea
Ejecutar los comandos: i , iStrict y ti para ver informacin del TCB (Task Control Block) de las tareas en ejecucin. El comando i, muestra la siguiente informacin: Significado Nombre de la tarea Nombre de la funcin o direccin donde comienza la ejecucin de la tarea TID ID de la tarea PRI Prioridad STATUS Estado de la tarea PC Contador de programa SP Puntero de la pila o Stack pointer ERRNO El cdigo de error ms reciente de esta tarea DELAY Si la tarea tiene un retardo, nmero de tics de reloj que faltan en el retardo (o 0 si no tiene retardo) Campo NAME ENTRY
NOTA:
Asegurarse
de
redirigir
la
E/S
mediante
el
comando
de
la
shell:
Tareas y mensajes
-4-
Tareas y mensajes
-5-
2. Semforos
2.1 Introduccin
Los semforos permiten la sincronizacin y comunicacin de actividades en aplicaciones multitarea. La forma ms obvia para que se comuniquen las tareas es mediante estructuras de datos compartidas. Dado que en VxWorks todas las tareas se encuentran en un nico espacio de direccionamiento lineal, las variables globales, los buffers lineales, los buffers en anillo, las listas enlazadas y los punteros se pueden referenciar directamente por el cdigo que se ejecuta en contexto diferente (por diferentes tareas). Sin embargo, mientras que el espacio de direccionamiento compartido simplifica el intercambio de datos, es crucial evitar los interbloqueos en el acceso a la memoria para evitar conflictos. Existen muchos mtodos para obtener el acceso exclusivo a los recursos, y uno de ellos es el empleo de semforos.
2.2 Objetivo
El objetivo principal de esta segunda parte de la prctica es el siguiente:
2.3 Descripcin
Los semforos de VxWorks estn altamente optimizados y proporcionan los mecanismos ms rpidos para la comunicacin entre tareas. Los semforos son el mecanismo principal para garantizar el acceso en exclusin mutua y de sincronizacin entre tareas. Existen tres tipos de semforos, optimizados para su utilizacin en distintos tipos de problemas: Semforo binario El semforo de propsito general ms rpido. Optimizado para sincronizacin, tambin puede emplearse para exclusin mutua. Un semforo binario se puede ver como un indicador de disponibilidad. Cuando una tarea toma un semforo binario, usando semTake(), el resultado depende de si el semforo est disponible o bloqueado en el instante de la llamada a la funcin. Si el semforo est disponible, entonces el semforo pasa a bloqueado y entonces la tarea contina ejecutndose inmediatamente. Si el semforo est bloqueado, la tarea se pone en una cola de tareas bloqueadas e incorpora un estado de pendiente en la disponibilidad del semforo. Sistemas Informticos en Tiempo Real 5
Tareas y mensajes
-6-
Cuando una tarea libera un semforo binario, usando semGive(), el resultado depende de si el semforo est disponible o bloqueado en el instante de la llamada. Si el semforo est ya disponible, dar el semforo no tiene ningn efecto. Si el semforo est bloqueado y ninguna tarea est esperando para tomarlo, entonces el semforo pasa a estar disponible. Si el semforo est bloqueado y una o ms tareas estn pendientes de su disponibilidad, entonces la primera tarea en la cola de tareas pendientes se desbloquea, y el semforo se deja como bloqueado. Semforo de exclusin mutua (mutex) Semforo binario especial optimizado para tratar problemas inherentes a la exclusin mutua (por ejemplo en accesos a secciones crticas): Inversin de prioridades, seguridad ante la eliminacin de tareas y acceso recursivo a recursos. Semforo contador Generalizacin del semforo binario. Inicialmente almacena el nmero mximo de procesos que pueden compartir el recurso de forma simultnea. Cada vez que alguna tarea toma el semforo el contador se decrementa y cada vez que es liberado se incrementa. Cuando el contador alcanza el valor cero, la tarea que intenta tomar el semforo queda bloqueada.
semBCreate (int queue_type, SEM_B_STATE initialState ): Crea e inicializa un semforo binario. queue_type: SEM_Q_PRIORITY indica que las tareas bloqueadas se encolan en orden de prioridad indica que las tareas bloqueadas se encolan en orden de llegada indica que el semforo creado est disponible indica que el semforo creado est bloqueado
SEM_Q_FIFO
Tareas y mensajes
-7Crea e inicializa un semforo de exclusin mutua. El estado del semforo se inicializa a FULL. El parmetro options indica la forma en que se encolan las tareas bloqueadas indica que las tareas bloqueadas se encolan en orden de prioridad indica que las tareas bloqueadas se encolan en orden de llegada
options:
SEM_Q_PRIORITY
SEM_Q_FIFO
SEM_DELETE_SAFE evita que la tarea que tiene el semforo sea borrada por otra tarea SEM_INVERSION_SAFE protege el sistema de la inversin de prioridades. La tarea que bloquea el semforo se ejecuta con una prioridad superior a la de todas las tareas pendientes de dicho semforo. Esta opcin tiene que ir acompaada por la de modo de encolado SEM_Q_PRIORITY.
semMCreate (SEM_Q_PRIORITY | SEM_INVERSION_SAFE);
semTake (SEM_ID semId, int timeout): Espera la liberacin de un semforo. timeout (ticks de reloj) indica el tiempo mximo de bloque o de la tarea por el semforo. Tambin puede tomar los: WAIT_FOREVER (bloqueo indefinido) y NO_WAIT (la tarea no se bloquea)
semFlush (SEM_ID semId): Desbloquea todas las tareas que esperan por un semforo.
NOTA:
Consultar VxWorks Reference Manual para ver los argumentos vlidos de las rutinas anteriores.
Tareas y mensajes
-8-
2.5 Ejemplo:
En el ejemplo siguiente, dos tareas (tTarea_1 y tTarea_2), realizan diversas acciones de manera independiente (mostrar mensajes) pero hay un instante en el cual se deben sincronizar. Para lo cual la tarea que primero llega, tTarea_1, la ms prioritaria, debe esperar a que la segunda llegue al punto de sincronizacin para poder continuar.
/* librerias utilizadas */ #include "vxWorks.h" #include "taskLib.h" #include "semLib.h" #include "stdio.h"
/* prototipos de funcion */ void fTareaUna(void) ; /* funcion que va ejecutar la tarea tTarea_1 */ void fTareaDos(void) ; /* funcion que va ejecutar la tarea tTarea_2 */
/* semaforo */
void binario (void) { int taskId_1, taskId_2 ; /* Crea un semaforo binario inicialmente bloqueado */ if ((sem = semBCreate(SEM_Q_PRIORITY, SEM_EMPTY)) == NULL) printf ("\nERROR: no se ha podido crear el semaforo"); /* spawn las dos tareas */ if ((taskId_1 = taskSpawn("tTarea_1", 80, VX_FP_TASK, 2000, (FUNCPTR) fTareaUna ,0,0,0,0,0,0,0,0,0,0)) == ERROR) printf ("\nERROR: no se ha podido crear la tarea: tTarea_1"); if ((taskId_2 = taskSpawn("tTarea_2",90, VX_FP_TASK,2000, (FUNCPTR) fTareaDos, 0,0,0,0,0,0,0,0,0,0)) == ERROR) printf ("\nERROR: no se ha podido crear la tarea: tTarea_2"); } /* binario */
void fTareaUna(void) { printf ("\n tTarea_1 antes de la sincronizacion...") ; printf ("\n** tTarea_1 llega al punto de sincronizacion y espera a tTarea_2\n"); semTake (sem,WAIT_FOREVER); /* espera indefinidamente por el semaforo */ printf ("\n tTarea_1 despues de la sincronizacion...") ; } /* fTareaUna */ void fTareaDos(void) { printf ("\n tTarea_2 antes
de la sincronizacion...") ;
printf ("\n ** tTarea_2 ha llegado al punto de sincronizacion\n"); semGive (sem) ; /* libera el semaforo */ printf ("\n } /* fTareaDos*/ tTarea_2 despues de la sincronizacion...") ;
Tareas y mensajes
-9-
NOTA: Se debern hacer dos versiones; una utilizando semforos binarios y otra utilizando semforos mutex.
3. Informacin adicional
Consultar el VxWorks User's Manual y el Reference Manual.