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
- 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.
- 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:
- 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.
- 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.
- 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