Sei sulla pagina 1di 11

Multi-Tarea y Semforos

LABORATORIO DE SISTEMAS INFORMTICOS EN TIEMPO REAL

Curso 2003-2004

Fabin Lpez Valencia

-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

Sistemas Informticos en Tiempo Real

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

valores de depuracin y monitorizacin de prestaciones

Sistemas Informticos en Tiempo Real

Tareas y mensajes

-2-

1.4 Creacin y activacin de tareas


La rutina taskSpawn crea un nuevo contexto de tarea, que incluye la creacin e inicializacin del entorno de la tarea para llamar a la rutina principal (una subrutina ordinaria) con los argumentos especificados. La nueva tarea comienza en la entrada de la rutina especificada. Retorna un identificador de la tarea (int), si se ha creado e inicializado con xito, o ERROR, en caso contrario. Sintaxis:
id = taskSpawn (nombre, prioridad, opciones, stacksize, nombrefuncin, arg1, arg2, arg3, ... , arg10) ;

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 */

Sistemas Informticos en Tiempo Real

Tareas y mensajes

-3-

1.6 Trabajo con el cdigo del ejemplo


1. 2. 3. Copiar el cdigo fuente del ejemplo y compilarlo. Cargar el fichero objeto en la mquina target (o en el simulador del target). Ejecutar la rutina principal del ejemplo ("LanzarTarea") en el terminal WindSh. -> LanzarTarea

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:

-> ? shConfig SH_GET_TASK_IO off

Sistemas Informticos en Tiempo Real

Tareas y mensajes

-4-

1.7 Modificacin del ejemplo


Modificacin 1 Segn lo indicado anteriormente, durante la llamada a taskSpawn() se pueden pasar argumentos a la funcin que es ejecutada por la tarea. Pasar dos argumentos (carcter y entero) y hacer que se imprima el carcter tantas veces como indica el nmero. Modificacin 2 Crear dos tareas como la anterior pero con distinta prioridad. Las dos tareas se deben lanzar desde un mismo subprograma LanzarTareas. Hay alguna diferencia en la salida dependiendo de la prioridad de las tareas? Modificacin 3 Generar dos tareas peridicas con periodos 2 segundos y 4 segundos. Se deben ejecutar 4 veces cada una de ellas. NOTA: Mediante la funcin taskDelay (int ticks) se puede retrasar la ejecucin de la tarea que la ejecuta un determinado nmero de ticks de reloj. Se puede utilizar la funcin sysClkRateGet (void) para obtener el nmero de ticks por segundo.

Sistemas Informticos en Tiempo Real

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:

Mostrar el uso de los semforos de VxWorks.

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.

2.4 Control de los semforos


Los semforos Wind proporcionan un interfaz uniforme para el control de semforos. nicamente las rutinas de creacin son especficas de cada tipo de semforo:

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

initialState: SEM_FULL SEM_EMPTY

Sistemas Informticos en Tiempo Real

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

semMCreate (int options):

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);

semCCreate (int options, int initialCount): Crea e inicializa un semforo contador.

semDelete (SEM_ID semId): Termina y libera un semforo.

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)

semGive (SEM_ID semId): Libera un semforo.

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.

Sistemas Informticos en Tiempo Real

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 */

/* Globales */ SEM_ID sem ;

/* 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...") ;

Sistemas Informticos en Tiempo Real

Tareas y mensajes

-9-

2.6 Trabajo con el cdigo del ejemplo


1. 2. 3. Copiar el cdigo fuente del ejemplo y compilarlo. Cargar el fichero objeto en la mquina target (o en el simulador del target). Ejecutar la rutina principal del ejemplo ("binario") en el terminal WindSh. -> binario

2.7 Modificacin del ejemplo


Modificacin 1 En el ejemplo de semforo binario, modifica los valores de las prioridades de las tareas, los tipos de cola y de disponibilidad del semforo y observa las diferencias de la salida. Ejercicio 1 Variable compartida y exclusin mutua. Crear dos tareas, t_Lectora y t_Monitor, que acceden a una misma variable utilizando el mecanismo de exclusin mutua. La tarea t_Lectora realiza 5 veces la operacin de lectura de un nmero entero desde teclado almacenndolo en una variable y la tarea t_Monitor muestra, por la consola, el valor de dicha variable (una vez tras cada lectura). Ejercicio 2 Escribir un programa que cree dos tareas, que de manera peridica, hagan oscilar el valor de una variable "global" entre 1 y 0.

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.

Sistemas Informticos en Tiempo Real

Potrebbero piacerti anche