#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.