Você está na página 1de 40

Semáforos, Mutexes e Queues

Ana, Ailson, Hugo, Klebson, Thiago


Cronograma
1 - Filas: tarefas-tarefas

2 - Filas: tarefas-interrupções

3 - Semáforo Binário

4 - Semáforo Contador

5 - Mutexes
Filas (Queues)
1- Função

2- Elementos e características

3- Operações
Função: pra que servem queues?
Comunicação tarefa-tarefa e tarefa-interrupção!
Elementos de uma Fila
Criando uma Fila

QueueHandle_t xQueueCreate( UBaseType_t


uxQueueLength, UBaseType_t uxItemSize );
Criando uma Fila

QueueHandle_t xQueueCreate( UBaseType_t


uxQueueLength, UBaseType_t uxItemSize );
Handler da Fila -
A função retorna null se a fila não puder ser
alocada na memória
Criando uma Fila

QueueHandle_t xQueueCreate( UBaseType_t


uxQueueLength, UBaseType_t uxItemSize );

Número máximo de itens que a fila pode


armazenar em um momento
Criando uma Fila

QueueHandle_t xQueueCreate( UBaseType_t


uxQueueLength, UBaseType_t uxItemSize );

Tamanho de cada item em bytes


Fila criada:
uxQueueLength = 5
Escrevendo em uma fila
BaseType_t xQueueSend( QueueHandle_t xQueue, const
void * pvItemToQueue, TickType_t xTicksToWait );
Escrevendo em uma fila
BaseType_t xQueueSend( QueueHandle_t xQueue, const
void * pvItemToQueue, TickType_t xTicksToWait );

Handler da fila que se quer “enviar” um


dado
Escrevendo em uma fila
BaseType_t xQueueSend( QueueHandle_t xQueue, const
void * pvItemToQueue, TickType_t xTicksToWait );

Ponteiro para o dado que será copiado na


fila
Escrevendo em uma fila
BaseType_t xQueueSend( QueueHandle_t xQueue, const
void * pvItemToQueue, TickType_t xTicksToWait );

O tempo máximo que a tarefa deverá ficar


no estado Bloqueado esperando por espaço
disponível na fila
Escrevendo em uma fila
Escrevendo em uma fila - outras funções:
BaseType_t BaseType_t
xQueueSendToFront( xQueueSendToBack(
QueueHandle_t xQueue, QueueHandle_t xQueue,
const void * const void *
pvItemToQueue, pvItemToQueue, TickType_t
TickType_t xTicksToWait ); xTicksToWait );
Lendo de uma fila
BaseType_t xQueueReceive( QueueHandle_t xQueue,
void * const pvBuffer, TickType_t xTicksToWait );
Lendo de uma fila

BaseType_t xQueueReceive( QueueHandle_t xQueue,


void * const pvBuffer, TickType_t xTicksToWait );

Handler da fila que se quer “enviar” um


dado
Lendo de uma fila

BaseType_t xQueueReceive( QueueHandle_t xQueue,


void * const pvBuffer, TickType_t xTicksToWait );

Ponteiro para área da memória em que os


dados serão copiados
Lendo de uma fila

BaseType_t xQueueReceive( QueueHandle_t xQueue,


void * const pvBuffer, TickType_t xTicksToWait );

O tempo máximo que a tarefa deverá ficar


no estado Bloqueado esperando que os
dados fiquem disponíveis na fila
Lendo de uma fila
Filas: tarefas - interrupções
Semáforos
● O que são ?
Operações Básicas
● Take (obter o semáforo)

● Give (liberar o semáforo)


Semáforos Binários
Criando um Semáforo Binário
void vSemaphoreCreateBinary(

xSemaphoreHandle xSemaphore);

Nome do Descrição
parâmetro

xSemaphore Variável do tipo SemaphoreHandle que armazenará o identificador do semáforo que está sendo criado.

Valor retornado Se NULL for retornado, o semáforo não pode ser criado pois não há memória heap suficiente disponível
para que o FreeRTOS aloque as estruturas de dados do semáforo.

Se um valor não NULL for retornado, o semáforo foi criado com sucesso. O valor retornado deve ser
armazenado como o identificador do semáforo criado.
PEGANDO UM SEMÁFORO BINÁRIO
portBASE_TYPE xSemaphoreTake(

xSemaphoreHandle xSemaphore,

TickType_t xTicksToWait);
PEGANDO UM SEMÁFORO BINÁRIO
Nome do Descrição
parâmetro/Valor
retornado

xSemaphore O semáforo que está sendo assumido.

Um semáforo é referenciado por uma variável do tipo SemaphoreHandle. Ele deve ser criado explicitamente antes
que possa ser usado.

xTicksToWait A quantidade máxima de tempo que a tarefa deve permanecer no estado Bloqueada para aguardar o semáforo
caso ainda não esteja disponível.

Se xTicksToWait for zero, xSemaphoreTake() retornará imediatamente se o semáforo não estiver disponível.
PEGANDO UM SEMÁFORO BINÁRIO

Valor retornado Há dois possíveis valores de retorno:

● pdPASS
● pdFALSE
LIBERANDO UM SEMÁFORO BINÁRIO
portBASE_TYPE xSemaphoreGive(

xSemaphoreHandle xSemaphore);

portBASE_TYPE xSemaphoreGiveFromISR(

xSemaphoreHandle xSemaphore,

signed portBASE_TYPE

*pxHigherPriorityTaskWoken);
LIBERANDO UM SEMÁFORO BINÁRIO
Nome do Descrição
parâmetro/Valor
retornado

xSemaphore O semáforo que está sendo assumido.

pxHigherPriorityT
askWoken
LIBERANDO UM SEMÁFORO BINÁRIO

Valor retornado Há dois possíveis valores de retorno:

● pdTRUE
● errQUEUE_FULL
TROCA DE CONTEXTO NA ISR
● Para forçar a troca de contexto e o chaveamento para uma tarefa

de maior prioridade, após o processamento da ISR, devemos

chamar a função abaixo:

void portEND_SWITCHING_ISR(portBASE_TYPE flag);

● No parâmetro flag devemos usar o valor retornado na variável

pxHigherPriorityTaskWoken das funções que terminam

com FromISR.
Semáforos Binários
Semáforo Contador

● Semáforo Contador X Semáforo Binario

● Tratando Eventos

● Gestão de recursos
Tratando Eventos
Gestão de recursos
Semáforo Contador
● configUSE_COUNTING_SEMAPHORES must be set to 1 inFreeRTOSConfig.h
● xSemaphoreCreateCounting( uxMaxCount , uxInitialCount )
○ uxMaxCount -> Valor máximo que o semaforo vai contar
○ uxInitialCount -> Valor inicial do semaforo
○ Retorna -> Caso retorne NULL indica que houve erro na criação do semaforo
● xSemaphoreCreateCountingStatic( uxMaxCount , uxInitialCount , pxSempahoreBuffer )
○ pxSempahoreBuffer -> Variavel do tipo StaticSemaphore_t, que indica onde será
armazenado as informações do semáforo
○ Retorna -> NULL caso o pxSempahoreBuffer seja NULL e caso contrario retorna um
identificador pelo qual o semaforo pode ser referenciado
Semáforo Contador
● Outras funções:

○ BaseType_txSemaphoreTake( xSemaphore, xTicksToWait)

○ BaseType_txSemaphoreGive( xSemaphore)

○ BaseType_txSemaphoreGiveFromISR( xSemaphore, *pxHigherPriorityTaskWoken)

● Funcionam de maneira igual ao do semáforo binario


Mutexes

Você também pode gostar