lunes, 27 de enero de 2014

Semaforos

MARCO TEORICO


El semáforo es una herramienta que permite controlar el acceso  a un recurso compartido, es una señalización de que un evento ha terminado y permite a dos tareas sincronizar sus actividades.
Un semáforo contiene:
  • Contador: es el máximo número de accesos que van a ocurrir antes de que este llegue a cero y haga esperar a la siguiente tarea hasta que se encuentre habilitado.
  • Cola: es el lugar en que las tareas esperan para poder ejecutarse.

Funcionamiento

  1. Una tarea espera por el semáforo:

  • Si el contador es mayor que cero, este se decrementa en uno, la tarea obtiene el                         semáforo y esta puede trabajar.
  • Si no es posible, la tarea es puesta en la fila.


     2.  Si una tarea pone en post a un semáforo:
  • Si al menos una tarea se encuentra en la fila del semáforo, la tarea es realizada de acuerdo      a la política de filas de los semáforos.
  • Si no, el contador es incrementado en  una unidad.

Si el contador es inicializado en 2 y se tienen tres tareas con la misma prioridad, todas ellas ligadas entre si, en espera del semáforo y una vez que estas terminan de ejecutarse ponen post al semáforo, la manera en que estas serán puestas en función es:
  1. Se ejecutara la tarea task1 (contador=1) y task2 (contador=0) simultáneamente, mientras que la tarea task3 esperará en la fila del semáforo.
  2. Una vez ejecutadas, el semáforo atiende a task3 que está en la fila y atiende a la última tarea que fue ejecutada es decir, a task2, mientras task1 se pone en la fila del semáforo.
  3. Una vez que se ejecutaron task3 y task2, el semáforo atiende a la tarea que estaba en la fila, es decir, a task1 y de igual manera ejecuta a la última tarea anterior en ejecutarse task2, mientras task3 se queda en fila esperando.

Este procedimiento se repite de manera indefinida.

Ejemplificando con el ejercicio anterior, teniendo un contador mayor igual  a tres, la manera en que las tareas se ejecuten es la siguiente:
  •  task1, task2  y task3 simultáneamente.
  • task3, task2 y task1 simultáneamente.

Este procedimiento será repetido de manera indefinida.

Finalmente se muestran la manera de declarar, crear, esperar y habilitar un semáforo.

Creación de un Semáforo.

·         Para crear un semáforo:
  • _mqx_uint _lwsem_create(lwsem_ptr,initial_count)

·         Para esperar por un semáforo:
  • _mqx_uint _lwsem_wait(lwsem_ptr)

·         Para habilitar un semáforo:
  • _mqx_uint _lwsem_post(lwsem_ptr)


En esta práctica se hace uso de los semáforos, el programa sigue una secuencia de leds. Primero enciende el led rojo, posteriormente el verde y por último el azul.
El proyecto consta de cuatro tareas, las características son las siguientes:


Name
Stack Size
Priority
MQX_AUTO_START_TASK
TASK1
Crea_Sem
1000
8
Enable
TASK2
Led_Rojo
1000
9
Enable
TASK3
Led_Verde
1000
9
Enable
TASK4
Led_Azul
1000
9
Enable
Tabla 3.  Propiedades de las tareas.

Ejemplo.

El programa consiste en 4 tareas de autostart, una de las cuales es de mayor prioridad, por lo que es la que se ejecutara primero. El objetivo de que se inicie la tarea Crea_Sem en primer lugar, es el de crear un semáforo e inicializarlo en 1, y posteriormente se bloquee.
Una vez inicializado el semáforo, el administrador seguirá con el programa por lo que ejecutara cualquiera de las tareas (ya que tienen la misma prioridad), y una vez que inicie la ejecución, la tarea activa esperara por el semáforo y ya que este se inicializo con 1, ejecutará su código y decrementará el contador del semáforo por lo que este quedara en cero y por lo tanto cuando alguna otra tarea espere por su contador, no permitirá la ejecución de su código, y esta será puesta en la lista de espera.
El proyecto consta de tres Beans los cuales se encuentran configurados para  que controlen el led tricolor con que cuenta la tarjeta.
Adicionalmente se agrego la capacidad al programa para que imprima en pantalla el color del led que se encuentra trabajando.


No hay comentarios:

Publicar un comentario