RTOS: Uso de Queue para sincronização e comunicação de tarefas

Os semáforos que vimos no artigo anterior permitem a sincronização de tarefas e uma simples comunicação entre elas com apenas valores binários. Mas se seu projeto precisa de algo mais complexo para sincronização ou comunicação entre tarefas e ISRs, pode ser a vez da Queue.

 

 

O que é uma Queue e como funciona?

 

Queue é um buffer, uma fila de dados no formato FIFO, que permite sincronização de tarefas, como vimos em semáforos, porém é mais utilizada para comunicação entre tarefas e ISRs onde precisamos enviar valores (variáveis) para outros lugares. Usar queues visa a diminuição de variáveis globais em seu código. Mesmo ele sendo um objeto global, conta com métodos de atomicidade e timeout que podem agregar uma dinâmica muito interessante em seu projeto e produto.

 

Uso do Queue tipo FIFO.
Figura 1 - FIFO.
Animação de uma Queue FIFO.
Figura 2 - Animação de uma Queue FIFO.

 

A queue funciona na forma de um buffer FIFO, mas há funções que permitem escrever no começo do buffer em vez de apenas no fim. É tão simples que com a figura 3 já podemos entender o funcionamento da queue e testar na prática!

 

Escrita e leitura da queue.
Figura 3 - Escrita e leitura da queue.

 

As queues do FreeRTOS são objetos com capacidade e comprimento fixo. Como o exemplo da figura 3, a queue foi criada com 5 “espaços” (slots) e 2 bytes por slot. Isso implica na forma e frequência em que a queue será utilizada. Ela deve atender o tamanho máximo de suas variáveis e também ter comprimento considerável para evitar que fique lotada (a menos que seja proposital, como nas “MailBox”). Apesar da queue também funcionar para sincronização de tarefas como vimos em semáforos, o foco dessa prática será unicamente na transferência de dados entre duas tarefas. Então vamos começar!

 

Código do projeto:

 

 

Tarefas se comunicando por Queues.
Figura 4 - Tarefas se comunicando por Queues.

 

Testando o código, podemos observar que enquanto a tarefa responsável por enviar variáveis (t1) envia valores abaixo de 15, a outra tarefa (t2) mostra o valor recebido na tela. Porém, quando t1 chega no número 15, entra em delay por 5 segundos, ocasionando no timeout da leitura na t2, mostrando na tela que o timeout de 1 segundo expirou.

 

Queues podem tanto funcionar como um tipo especial de semáforos, onde podemos analisar valores recebidos e sincronizar tarefas a partir disso, como também, e principalmente, efetuar a comunicação entre tarefas e ISRs.

 

 

Saiba mais

 

Desenvolvendo com o Zephyr RTOS: Controlando o Kernel

Primeiras impressões com o react.o

Fila circular para sistemas embarcados

 

 

Referências

 

https://freertos.org/Documentation/RTOS_book.html

http://esp-idf.readthedocs.io/en/latest/api-reference/system/freertos.html

Outros artigos da série

<< RTOS: Semáforos para sincronização de tarefasRTOS: Uso de grupo de eventos para sincronização de tarefas >>

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

José Morais
Estudante de Engenharia da Computação pela USC, pretende se aprimorar e fazer a diferença nesta imensa área da tecnologia. Apaixonado por IoT, sistemas embarcados, microcontroladores e integração da computação nos mais diversos fins práticos e didáticos.

4
Deixe um comentário

avatar
 
1 Comment threads
3 Thread replies
3 Followers
 
Most reacted comment
Hottest comment thread
3 Comment authors
Welington SouzaJosé MoraisYuri Lima Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Yuri Lima
Visitante
Yuri Lima

Opa. Morais, blzz cara!!! ?

Cara continuar nessa abordagem de fila, acredito que tenha bastante assunto para abordar ainda. Eu venho acompanhando seus posts e acho muito significativo. Parabéns pela iniciativa. CONTINUA!!!!!!!

Yuri Lima
Visitante
Yuri Lima

Show de bola cara. VLWW

Welington Souza
Membro
welington souza

Não para não, está muito interessante! Está muito bom!!