Rebent de més d’una cua

Hi ha casos on una tasca pot voler rebre dades de cues diferents on, potser, per cada cua es reben dades de tipus diferents. FreeRTOS ens proporciona un mecanisme per poder rebre de vàries cues d’una forma senzilla.

El mecanisme és el Queue set (conjunt de cues) que permet agrupar tot de cues i semàfors i després consultar per part d’una tasca si hi ha alguna dada disponible a alguna de les cues o semàfor.

El que cal fer és crear un conjunt, afegir els mecanismes de sincronització que es vulguin incloure i ja només cal consultar la disponibilitat a traves del conjunt enlloc de cada mecanisme per separat.

Anem a veure-ho en un exemple, que com sempre està al repositori. A l’exemple es modifica l’exemple de cues anterior perquè cada ISR enviï la seva dada per una cua diferent (queue_buttons_1, queue_buttons_2).




...
#define QUEUE_LENGTH (10)

QueueSetHandle_t queue_set;
QueueHandle_t queue_buttons_1;
QueueHandle_t queue_buttons_2;

void main() {
...
  queue_set = xQueueCreateSet( QUEUE_LENGTH + QUEUE_LENGTH );
  queue_buttons_1 = xQueueCreate(QUEUE_LENGTH, sizeof(uint32_t));  
  queue_buttons_2 = xQueueCreate(QUEUE_LENGTH, sizeof(uint32_t));
...
}

A la tasca s ‘ha canviat com es rep les dades de cada ISR i ara es consulta el conjunt de cues. Aquesta funció retorna el handler al mecanisme que té una dada disponible, de manera que a continuació es consulta al mecanisme i s’adquireix la dada rebuda.

static void TaskLedToggle(void *pParameter) {
  ...
  for (;;) {
    selected_queue = xQueueSelectFromSet(queue_set, 0);
    if ( selected_queue == queue_buttons_1) {
      xQueueReceive(queue_buttons_1, &my_delay, (TickType_t ) 0);
    } else if (selected_queue == queue_buttons_2) {
      xQueueReceive(queue_buttons_2, &my_delay, (TickType_t ) 0);     
    } 
    vTaskDelay(my_delay);
    LedToggle();
  }
}

La resta del mecanisme és força similar a l’exemple anterior.

Cal fer notar que l’exemple es fa amb només dues cues, però els Queue Sets, malgrat el nom, també poden incloure semàfors de la mateixa manera i consultar-los de la mateixa forma.

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out /  Canvia )

Google photo

Esteu comentant fent servir el compte Google. Log Out /  Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out /  Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out /  Canvia )

S'està connectant a %s

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.