FreeRTOS xQueueSelectFromSet застрял в полной очереди

#freertos

Вопрос:

мой набор очередей, похоже, игнорирует полную очередь. Время ожидания xQueueSelectFromSet() всегда истекает, но очередь заполнена, и ее можно прочитать. Вот упрощенный пример моей ситуации.

Я что-то неправильно понял и у меня были ложные ожидания, или такое поведение ожидаемо?

ISR:

 if(xQueueIsQueueFullFromISR(queue)){
  xQueueReceiveFromISR(queue, amp;dummy, amp;pxHigherPriorityTaskWoken);
}
xQueueSendFromISR(queue, event, amp;pxHigherPriorityTaskWoken);
 

задача 2:

 xQueueSet = xQueueCreateSet(QUEUE_LENGTH   1);
xQueueAddToSet(queue, xQueueSet);
xQueueAddToSet(semaphore, xQueueSet);
while(true){
  xActivatedMember = xQueueSelectFromSet(xQueueSet, 100);
  if(xActivatedMember == semaphore){
    xSemaphoreTake(semaphore, 0);
    break; // from the infinite loop
  }else if(xActivatedMember == queue){
    // read from queue
  }else if(xActivatedMember == NULL){
    // timed out but queue is full
    uxQueueMessagesWaiting(queue); // returns QUEUE_LENGTH
    xQueueReceive(queue, amp;event, 0); // reads without problem
  } // xActivatedMember 
} // infinite loop
 

Комментарии:

1. xQueueIsQueueFullFromISR должен использоваться исключительно в коде/контексте ISR, а не в задачах (как задокументировано). Вы добавляете «очередь» в набор, но проверяете наличие «_i2sEventQueue»? И я не понимаю цели задачи 1.

2. Извините, это ошибка. Первая задача-ISR, и она использует соответствующую версию вызовов. Другой — это не ISR. Вторая также является ошибкой редактирования при упрощении для этого поста. ISR просто обрабатывает модуль MCU и отправляет события в очередь для других задач только для того, чтобы уведомить их о завершении своей работы. Я отредактировал первую задачу в ISR (в этом примере).

3. Должно сработать (сейчас). Тем не менее, я все еще не понимаю цели полной проверки/фиктивного получения очереди в ISR.

4. ISR-это не мой код, но я предполагаю, что он существует просто для того, чтобы не переполнять очередь.

5. Это в любом случае делается xQueueSendFromISR. Он возвращает значение pdTRUE, если данные были успешно отправлены в очередь, в противном случае errQUEUE_FULL.