Процессор STM32F215, FreeRtos
В одной из задач используется запись на SD карточку текущих параметров устройства. По сути задача низкоприоритетная.
Есть вторая задача, высоко приоритетная, которая должна по ком-порту выдавать небольшие порции данных во вне.
К сожалению, если запись на карту сделать высоким приоритетом ( или записывать блоки на флешку в критической секции ) То все работает, но важная задача затыкается на видимое время, что неприемлемо.
Если записи сделать малый приоритет, то через n минут работы происходит сбой. Выглядит это так, как будто не может завершиться dma передача:
SD_ReadBlock( Buffer, SectorNumber * BLOCKSIZE, BLOCKSIZE );
Status = SD_WaitReadOperation(); <-- Сидим внутри этой функции, которая проверяет DMA_GetFlagStatus(SD_SDIO_DMA_STREAM, SD_SDIO_DMA_FLAG_TCIF) != RESET
while(SD_GetStatus() != SD_TRANSFER_OK)
Обламывается только чтение с карты. Если этот код помещен в критическую секцию то сбоев не происходит.
Вопросов по этому поводу несколько...
1. Почему оборачивание этого в критическую секцию вызывает реальные задержки выполнения высокоприоритетной задачи( в ней стоит мигание светодиодом, и глазом видно задержку

2. Почему уход в этом месте в другую задачу может привести к тому, что DMA не выставляет флаг успешной отправки?
Ну и еще давно хотел узнать но не решался спросить:
Пример, отсылаем что-то в ком-порт в задаче. Чтобы не городить прерывания, пишем так:
while( USART_GetFlagStatus( AP_OUTUART2, USART_FLAG_TC ) == RESET );
USART_SendData( AP_OUTUART2, c );
Очевидно что процессор стоит в цикле и ждет пока байт не ушел. Можно ли отослав байт переключить задачу, или это получается неоправданно?
При скорости, скажем 9600 это занимает около 1/1000 сек. По умолчанию один тик фриртоса этому равен, и при таком тике я не вижу смысла переключать задачу -- дороже выйдет...
Заранее спасибо)