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

Este post faz parte da série RTOS. Leia também os outros posts da série:

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 tarefas
Este post faz da série RTOS. Leia também os outros posts da série:

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.

3
Deixe um comentário

avatar
 
1 Comment threads
2 Thread replies
2 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
José 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