martes, 25 de octubre de 2016

Semáforos vs Mutex - FreeRTOS

El semáforo sirve para sincronizar tareas. Es una simple Queue, de extensión 1. Puede estar vacía o llena. La tarea va a tratar de leer el semáforo y lo verá vacio, entonces se bloquea. Cuando llega la interrupción, esta da ('give') el token al semáforo, es decir llena la queue. Entonces ahora la tarea que estaba bloqueada ya puede venir a tomar ('take')​ el token del semáforo. Realiza su tareas. Al finalizar, vuelve a leer el semáforo, al no tener nada se bloquea.

En el semáforo, la tarea no devuelve el token, es decir que no vuelve a rellenar la queue (el semáforo)
Para aquellos que recién comienzan con el desarrollo en freeRTOS, y en particular a aquellos que nos gusta leer la teoría, antes de ir a la programación, se puede dar una pequeña confusión entre Mutex y Semáforos, ya que aparentemente utilizan el mismo medio: Una cola de lenght 1.

La Mutual Exclusion, es una Técnica, que permite que no exista una inconsistencia en la utilización de recursos compartidos. Y se pueden utilizar varias estrategias para asegurar la Mutual Exclusion.
  1. Entrando en secciones críticas. 
  2. Suspendiendo el scheduler. A mi parecer es lo mismo que el anterior. 
  3. Utilizando Mutex.
Mutex es implementado a través de una especie de semáforo (Queue de extensión 1 que puede estar vacia o llena). La diferencia radica en que las tareas que utilizan un recursos compartido, primero van a mirar el mutex, si está "lleno" toman el token (y dejan el semáforo vacio). Si otra tarea quiere tocar el recurso, verá que el mutex está vacio, por lo tanto se bloquea.

Aqui va la diferencia primordial: para el caso del MUTEX, se tiene que devolver el token. Es decir, esta especie de "semáforo", se vuelve a llenar.

No hay comentarios:

Publicar un comentario