Está en la página 1de 59

CAPACITACION PIC32MZ

MECANISMOS DEL FREERTOS


Referencia
Indice
• TaskNotify
• Queue
• Semaphore
• SoftwareTimer
• EventGroup
TASK NOTIFY
TASK NOTIFY
• Toda tarea (TASK) del FreeRTOS posee de forma nativa un mecanismo
para el control de notificaciones para comunicarse con otras tareas.
• Este mecanismo se conoce como TASK NOTIFY.
• Una forma de acceder a dicho mecanismo es mediante los métodos
(APIs) siguientes:

ulTaskNotifyTake
xTaskNotifyGive
TASK NOTIFY
• Este mecanismo permite que un tarea A pueda ser notificada desde
una tarea B o muchas otras más.
• Una aplicación común es utilizar este mecanismo para mantener a
una tarea A en el estado de espera hasta que otra tarea B le notifique
a través de su manejador (HANDLER) y tras lo cual pueda pasar al
estado de ejecución.
TASK NOTIFY
Tarea A se mantiene en espera:
1
ulTaskNotifyTake Tarea B esta en ejecución
2
realizando procesos…

3 Tarea A sigue en espera…

Tarea B notifica a la Tarea A:


4
xTaskNotifyGive
Tarea A recibe notificación desde la
5
Tarea B y pasa a ejecución
TASK NOTIFY
ulTaskNotifyTake
• Se basa en una variable de notificación de 32 bits que existe dentro de
cada tarea la cual inicia en cero cuando la tarea es creada.
• La notificación de tarea es un evento que puede desbloquear a la tarea
receptora de la notificación y opcionalmente se puede manipular el valor
de la variable de notificación.
• Cuando se usa esta API, la tarea pasa al estado bloqueado y retornará
cuando la variable de notificación sea diferente de cero.
• Opcionalmente, se puede fijar un tiempo de espera para que dicha tarea
salga del estado bloqueado o esperar por siempre.
• Otra opción es que se puede limpiar o no la variable de notificación al
retornar del estado bloqueado.
TASK NOTIFY
TASK NOTIFY
TASK NOTIFY
xTaskNotifyGive
• Cuando se usa esta API, se incrementa en una unidad el valor de la
variable de notificación de una determinada tarea que está
esperando ser notificada, la cual es especificada mediante el
respectivo manejador (HANDLER) de dicha tarea.
TASK NOTIFY
TASK NOTIFY
TASK NOTIFY
vTaskNotifyGiveFromISR
• Cuando se usa esta API, se incrementa en una unidad el valor de la
variable de notificación de una determinada tarea que está
esperando ser notificada, la cual es especificada mediante el
respectivo manejador (HANDLER) de dicha tarea.
• Se utiliza solamente desde una interrupción (ISR).
TASK NOTIFY

pxHigherPriorityTaskWoken
• Este argumento, sirve para realizar un cambio de contexto al salir de
una interrupción cuando sea necesario y es realizado por la misma
API, solo requiere un puntero a una variable de tipo BaseType_t cuyo
valor este inicializado en 0.
• La variable luego es aplicada aI API: portEND_SWITCHING_ISR
TASK NOTIFY
QUEUES
QUEUES
• Un queue (semejante a una cola de ingreso) puede almacenar un número
finito (cantidad) de ítems con un tamaño fijo.
• Estos parámetros: cantidad de ítems y tamaño de cada ítem, son
especificados al crearse el queue.
• Un queue es empleado normalmente como una cola de ingreso de tipo
FIFO (primero en llegar, primero en salir), sin embargo las APIs permiten
alterar este comportamiento es decir implementarlo como un LIFO (ultimo
en llegar, primero en salir).
• Una forma de acceder a dicho mecanismo es mediante los APIs siguientes:
xQueueCreate
xQueueReceive
xQueueSend
QUEUE

Tarea A envía un
?
ítem al queue
Tarea C esta en estado
bloqueado, esperando
? recibir ítems en la cola y
consumirlos
posteriormente
Tarea B envía un
?
ítem al queue
QUEUE
xQueueCreate
• Permite crear un queue especificando la cantidad de ítems y el
tamaño de cada ítem que podrá almacenar.
• Este método retorna NULL cuando no pudo crear el queue debido a
insuficiente memoria en el HEAP del FreeRTOS.
• Si retorna un valor diferente de NULL, significa que se logró crear
satisfactoriamente, además este valor es el handler del queue creado,
el cual servirá para referenciar a dicho queue cuando se desee enviar
o recibir ítems.
QUEUE
QUEUE
QUEUE
xQueueReceive
• Permite recibir ítems en un determinado queue, especificando el
handler del queue y un puntero al tipo de ítem que almacena el
queue.
• Además, se debe especificar el tiempo que se estará esperando en el
estado bloqueado hasta que se reciban ítems en el queue.
• Si retorna 1 (etiqueta pdPASS), significa que se recibió un ítem.
QUEUE
QUEUE
QUEUE
xQueueSend
• Permite enviar ítems en un determinado queue, especificando el
handler del queue y un puntero al tipo de ítem que almacena el
queue.
• Además, se debe especificar el tiempo que se estará esperando en el
estado bloqueado hasta que se agregue el ítem en el queue.
• Si retorna 1 (etiqueta pdPASS), significa que se agrego correctamente
un ítem en el queue.
QUEUE
QUEUE
SEMAPHORE
SEMAPHORE
• Un semaphore permite implementar un control de acceso o sincronización en entornos
multitarea. Existen 3 tipos: binarios (binary), contadores (counting), mutexes. Veremos el
semaphore de tipo binario.
• Tipo binario. Usado ampliamente para sincronización de eventos o recursos, y tiene
solamente dos posibles estados:
Vacío (not “given”)
Lleno (“given”)
• Su funcionamiento es el siguiente: la tarea A intentará obtener (“take”) el semaphore y
será bloqueada siempre que encuentre el semaphore vacío (“not given”), mientras tanto
otra tarea B otorgará (“give”) el semaphore lo cual desbloqueará a la tarea A.
• Una forma de acceder a dicho mecanismo es mediante los APIs siguientes:
xSemaphoreCreateBinary
xSemaphoreGive
xSemaphoreTake
SEMAPHORE
SEM.VACIO

Tarea A encuentra
vacío el
2
semaphore y se
bloquea.

SEM.ES
LLENADO
Tarea B otorga el
4 3 semáforo y
Tarea A se concluye su labor.
desbloquea al
5
llenarse el
semaphore
SEMAPHORE
xSemaphoreCreateBinary
• Permite crear un semaphore de tipo binario y retorna un handler para
referencia al mismo cuando se accedan al resto de APIs.
• El semaphore es creado con estado VACÍO (“not given”) por ello el
sempahore primero debe ser OTORGADO (“given”) para que pueda
ser obtenido.
• Este método retorna NULL cuando no pudo crear el queue debido a
insuficiente memoria en el HEAP del FreeRTOS.
SEMAPHORE
SEMAPHORE
SEMAPHORE
xSemaphoreGive
• Permite otorgar un semaphore.
SEMAPHORE
SEMAPHORE
SEMAPHORE
xSemaphoreTake
• Permite obtener un semaphore.
• Opcionalmente se puede establecer un tiempo de espera para limitar
el tiempo en el estado bloqueado hasta que el sempahore se
encuentre lleno.
• Retorna 1 si se obtuvo satisfactoriamente el semaphore, de lo
contrario retornará 0.
SEMAPHORE
SEMAPHORE
SOFTWARE TIMER
SOFTWARE TIMER
• Son temporizador creados a partir del Timer 1 del PIC32MZ y son
gestionados por el FreeRTOS.
• Su funcionamiento es idéntico a un HARDWARE TIMER y requieren
de una función callback la cual será invocada según la periodicidad
del SOFTWARE TIMER.
• Se suelen utilizar para temporizar eventos que no requieren la
precisión de un HARDWARE TIMER los cuales son bastante escasos.
• Una forma de acceder a dicho mecanismo es mediante los APIs
siguientes:
xTimerCreate
xTimerStart
SOFTWARE TIMER
xTimerCreate
• Permite crear un temporizador controlado por el FreeRTOS y retorna
su handler para su posterior activación mediante otra API.
• Requiere de configurarse los siguientes parámetros:
pcTimerName: una cadena para especificar el nombre del timer.
xTimerPeriod: el periodo en TICKS del timer.
uxAutoReload: el timer se recarga siempre o sino es one-shot.
pvTimerID: un entero para identificar el timer dentro de la función callback.
pxCallbackFunction: es la función que será invocada cada vez que se cumpl un
periodo.
SOFTWARE TIMER
SOFTWARE TIMER
SOFTWARE TIMER
xTimerStart
• Inicia el recorrido de un software timer.
SOFTWARE TIMER
SOFTWARE TIMER
EVENT GROUP
EVENT GROUP
• Es un mecanismo que permite notificar múltiples tareas a partir de un
solo evento mediante la combinación de bits de una variable de 32
bits de los cuales solamente 24 bits están habilitados para trabajar.
• Por lo tanto, un evento group permite que una tarea se quede en el
estado bloqueado esperando por uno o alguna combinación de bits
(eventos) que se activen (se coloquen en 1).
• Una forma de acceder a dicho mecanismo es mediante los APIs
siguientes:
xEventGroupCreate
xEventGroupSetBits
xEventGroupWaitBits
EVENT GROUP
xEventGroupCreate
• Permite crear un event group y retorna un handler para manipular las
APIs y hacer referencia a este evento group.
EVENT GROUP
EVENT GROUP
EVENT GROUP
xEventGroupSetBits
• Permite setear los bits de un event group.
• Cuando se setean los bits de un event group automáticamente se
desbloquea cualquier tarea que fue bloqueada por esperar algunos
de estos bits.
EVENT GROUP
EVENT GROUP
EVENT GROUP
xEventGroupWaitBits
• Permite leer los bits de un event group y opcionalmente se puede
esperar un determinado tiempo estando en el estado bloqueado.
• Se requiere configurar los siguientes parámetros:
xEventGroup: handler del event group con el que se va a trabajar.
uxBitsToWaitFor: valor tipo bitwise que especifica los bits que estamos
esperando que sean seteados (AND / OR).
xClearOnExit: limpiar bits del event group al salir de esta función.
xWaitAllBits: si es 1 entonces se aplica un AND a los bits indicados en
uxBitsToWaitFor, pero si es 0 entonces aplica un OR a dichos bits.
xTicksToWait: tiempo de espera.
EVENT GROUP
EVENT GROUP

También podría gustarte