xQueueSelectFromSet not working

rmawatson wrote on Thursday, June 05, 2014:

Hi, I may well be doing something wrong, but for some reason my xQueueSelectFromSet does not work.

I create the queue/semaphore with this code on startup (before I have started the scheduler)

m_uart_rx_queue          =       xQueueCreate(device_queue_rx_size,sizeof(byte_t));

m_pending_cmd_smph       = xSemaphoreCreateBinary();
m_complete_cmd_smph      = xSemaphoreCreateBinary();

m_queue_set              = xQueueCreateSet(device_queue_rx_size + 1);

xQueueAddToSet(m_queue_set,m_uart_rx_queue);
xQueueAddToSet(m_queue_set,m_pending_cmd_smph);

I have checked all of the result, and everything returns pdTRUE/pdPASS, and looks fine.

I then start a task that currently just does the following,

//TASK1

for (;;)
{
    QueueSetMemberHandle_t selected_handle = NULL;

    while (selected_handle == NULL)
    {
        selected_handle = xQueueSelectFromSet(m_queue_set,100);
        BaseType_t result = xSemaphoreTake(m_pending_cmd_smph,portMAX_DELAY);
        int x = 1; // for my breakpoint
    }
}

In Another task,

//TASK2

xSemaphoreGive(m_pending_cmd_smph);
xSemaphoreTake(m_complete_cmd_smph,portMAX_DELAY);

TASK2 should now start blocking forever, and I would expect that TASK1 is now woken, with xQueueSelectFromSet returning the handle to m_pending_cmd_smph, however it does not wake up.

100 ticks expire,xQueueSelectFromSet returns NULL. I then perform a Take of m_pending_cmd_smph, so I can see if this semaphore is ‘ready’, and indeed it is. xSemaphoreTake takes it straight away and returns pdTRUE.

So why is xQueueSelectFromSet not returning? what other #defines or configuration might be required.

Also, both tasks are Priority 1.

Thanks for any help.

rtel wrote on Thursday, June 05, 2014:

The parameters you are passing to xQueueAddToSet() are the wrong way around.

http://www.freertos.org/xQueueAddToSet.html

Regards,
Richard Barry.