Для вашего отредактированного вопроса:
Вы должны использовать две очереди сообщений. Один для каждой задачи, иначе вы не сможете ждать правильно.
Таким образом, для вашей блокирующей передачи сообщения код выглядит так:
Задача с высоким приоритетом:
while(-1){
xQueueReceive(high_prio_queue, &msg, portMAX_DELAY);
[your complex code]
xQueueSend(low_prio_queue, &return_msg, timeout);
}
Задача с низким приоритетом:
xQueueSend(high_prio_queue, &msg, timeout);
//will only wait if your high priority task gets blocked before sending
xQueueReceive(low_prio_queue, &return_msg, portMAX_DELAY);
От ISR:
xQueueSendFromISR(high_prio_queue, &msg, &unblocked);