реклама на сайте
подробности

 
 
> STM32 + Freertos. Проблемы с DMA
Vladimir Prokofi...
сообщение Feb 29 2012, 08:58
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 9-03-11
Пользователь №: 63 481



Помогите разобраться!

Процессор 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. Почему оборачивание этого в критическую секцию вызывает реальные задержки выполнения высокоприоритетной задачи( в ней стоит мигание светодиодом, и глазом видно задержку sm.gif
2. Почему уход в этом месте в другую задачу может привести к тому, что DMA не выставляет флаг успешной отправки?

Ну и еще давно хотел узнать но не решался спросить:
Пример, отсылаем что-то в ком-порт в задаче. Чтобы не городить прерывания, пишем так:
while( USART_GetFlagStatus( AP_OUTUART2, USART_FLAG_TC ) == RESET );

USART_SendData( AP_OUTUART2, c );
Очевидно что процессор стоит в цикле и ждет пока байт не ушел. Можно ли отослав байт переключить задачу, или это получается неоправданно?
При скорости, скажем 9600 это занимает около 1/1000 сек. По умолчанию один тик фриртоса этому равен, и при таком тике я не вижу смысла переключать задачу -- дороже выйдет...

Заранее спасибо)

Сообщение отредактировал Vladimir Prokofiev - Feb 29 2012, 09:00
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kan35
сообщение Feb 29 2012, 11:41
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



У меня были проблемы несколько подобного рода.
Просто библиотека FAT не парилась и отправляла/принимала сектора не обязательно выровненные на 4 байта, у DMA в результате сносило крышу.

И по правильному надо сделать, чтобы по окончании DMA transfere происходило прерывание и в нем взводите семафор. А в задаче ждете семафор после начала трансфера.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 12:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01353 секунд с 7
ELECTRONIX ©2004-2016