Uso combinado: Queue + Task Notification
Em arquiteturas mais refinadas, é comum usar task notifications para acordar a tarefa e queues apenas para transportar dados, reduzindo latência.
void vFastProducer(void *pvParameters)
{
uint16_t sample;
for (;;)
{
sample = readFastSensor();
xQueueSend(sampleQueue, &sample, 0);
xTaskNotifyGive(consumerTaskHandle);
}
}
A tarefa consumidora:
void vConsumerTask(void *pvParameters)
{
for (;;)
{
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
drainQueueAndProcess();
}
}
Esse padrão evita que a tarefa consumidora acorde repetidamente para cada item, aumentando eficiência e previsibilidade.
Implicações de projeto e dimensionamento
Filas consomem memória proporcional ao tamanho do item × profundidade da fila. Em sistemas embarcados restritos, isso exige planejamento cuidadoso. Além disso, filas grandes podem mascarar problemas de desempenho, atrasando a percepção de gargalos reais.
Do ponto de vista de latência, filas introduzem um pequeno overhead de cópia, mas oferecem robustez e clareza arquitetural. Por isso, devem ser usadas sempre que o evento carrega informação relevante e não apenas sinalização.