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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM32F103. DMA Mem-to-Mem
ViKo
сообщение Feb 17 2011, 08:55
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Правильно ли я понимаю, что во время работы DMA нельзя программе залазить в память, с которой работает DMA?
Вот такую функцию исследую, пока не дожусь конца передачи, дальше не иду. (Не показана установка режима работы, и разрешение тактирования, это делается однократно в начальной установке). Тогда все работает. Иначе, если программа пишет туда, откуда читает DMA, появляется прерывание TEIFx Channel x transfer error flag. А прерывания, что дошло до конца, уже нет.
Если все так, то ценность такого DMA уменьшается. Почти то же можно реализовать, как у меня в закомментированном коде.
Код
void ExtDpy2LCD_copy(uint32_t Offset, uint32_t Size)
{
  LED_On();
  DMA2->IFCR |= DMA_IFCR_CTCIF1;
  DMA2_Channel1->CCR &= ~0x00000001;  // запретить пересылку
  DMA2_Channel1->CPAR = EXTDPY + Offset; // начальный адрес буфера экрана
  DMA2_Channel1->CMAR = 0x6c020000 + Offset; // начальный адрес памяти ЖКИ
  DMA2_Channel1->CNDTR = Size;   // 16-битовые пересылки  
  DMA2_Channel1->CCR |= 0x00000001;  // разрешить пересылку
  while (!(DMA2->ISR & DMA_ISR_TCIF1));
  LED_Off();
/*
  uint16_t *pSour = (uint16_t *)(EXTDPY + Offset);
  uint16_t *pDist = (uint16_t *)(0x6c020000 + Offset);
  LED_On();
  for (uint32_t i=Size; i--; ) {
    *pDist++ = *pSour++;
  }
  LED_Off();
*/
}


Еще один факт для размышлений. Измерил осциллографом время работы показанной выше функции. Для Size = 320*240/2.
С DMA имею 20ms, без DMA 21.5ms.
Естественно, польза от DMA будет, если, пока байты перекидываются с места на место, процессор будет занят чем-нибудь другим. Например, принимать данные по другим интерфейсам и складывать во внутреннее ОЗУ. Надеюсь, это не притормозит работу DMA.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Feb 17 2011, 09:04
Сообщение #2


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(ViKo @ Feb 17 2011, 10:55) *
Еще один факт для размышлений. Измерил время работы показанной выше функции. С DMA имею 20ms, без DMA 21.5ms.
Естественно, польза от DMA будет, если, пока байты перекидываются с места на место, процессор будет занят чем-нибудь другим. Например, принимать данные по другим интерфейсам и складывать во внутреннее ОЗУ. Надеюсь, это не притормозит работу DMA.


Такие факты вырванные из контекста и без описания аппаратуры не более чем трата времени.
Приведите схему и весь проект как например здесь: Тесты DMA на STM32
тогда можно о чем-то думать.
У вас может просто конфликт по целостности сигналов на плате из-за скверной трассировки.
На вашем месте надо было бы провести тщательнее тестирование памяти с сообщить хотя бы какая у вас в целом пропускная способность к памяти.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 17 2011, 10:13
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(AlexandrY @ Feb 17 2011, 11:04) *
Такие факты вырванные из контекста и без описания аппаратуры не более чем трата времени.
У вас может просто конфликт по целостности сигналов на плате из-за скверной трассировки.
На вашем месте надо было бы провести тщательнее тестирование памяти с сообщить хотя бы какая у вас в целом пропускная способность к памяти.

Ну какой конфликт, если работает?
Частота процессора 72MHz. ОЗУ статическое IS62WV26516BLL-55. Контроллер ЖКИ S1D13706, работает от тактовой частоты 36MHz, старался настроить на наиболее быструю работу. Настройки работы с памятью:
Код
// -- Bank1 NE2 - RAM 256K x 16 --
  FSMC_Bank1->BTCR[2] = 0x00001011; // 16-bit,NoMux,SRAM,En
  FSMC_Bank1->BTCR[3] = 0x000f0300; // Mode1 0(+1)\_3_/(+1)
// -- Bank1 NE4 - LCD 128K + 128K(80K) --
// Читать-писать 16-битовыми или 8-битовыми словами
  FSMC_Bank1->BTCR[6] = 0x00009011; // ASWait,WrEn,WrapDis,FlashAccDis,16-bit,SRAM,NoMux,En
  FSMC_Bank1->BTCR[7] = 0x000f1200; // Mode1 0(+1)\_18_____ _/(+1)

Да и не при чем это все. Качественное соотношение останется тем же, независимо от быстродействия устройств.
Заглянул на вашу ссылку. Читаю... У меня контроллер ЖКИ медленный до безобразия. И память -55
Еще я не сказал - код выполняется из ОЗУ микроконтроллера. Тоже понижает быстродействие.

У меня скорость пересылки по DMA получилась 3750 KB/s. Контроллер ЖКИ тормозит.
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 17 2011, 10:26
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(ViKo @ Feb 17 2011, 13:13) *
Контроллер ЖКИ тормозит.

Я правильно понял, что у Вас есть экранный буфер во внешнем ОЗУ, и Вы копируете из него данные в видеопамять графического контроллера? Если да, то зачем?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 17 2011, 10:32
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(scifi @ Feb 17 2011, 12:26) *
Я правильно понял, что у Вас есть экранный буфер во внешнем ОЗУ, и Вы копируете из него данные в видеопамять графического контроллера? Если да, то зачем?

Правильно. На вопрос, зачем, отсылаю вас в эту тему
http://electronix.ru/forum/index.php?showtopic=85989
о как ссылками перекрестными обложился sm.gif
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 17 2011, 10:42
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(ViKo @ Feb 17 2011, 13:32) *
На вопрос, зачем, отсылаю вас в эту тему

Ползущие картинки? Если бы у Вас была возможность выбирать графический контроллер, у Epson есть контроллеры с функциями 2D-ускорения. Там двигать картинку в видеопамяти было бы легко...
А может быть, снова рассмотреть вариант с double buffer, 4bpp?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 17 2011, 12:03
Сообщение #7


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(scifi @ Feb 17 2011, 12:42) *
1. Ползущие картинки? Если бы у Вас была возможность выбирать графический контроллер, у Epson есть контроллеры с функциями 2D-ускорения. Там двигать картинку в видеопамяти было бы легко...
А может быть, снова рассмотреть вариант с double buffer, 4bpp?

1. Нет, это я упрощенно назвал "двигать картинку". Там меняется изображение. У меня Epson и есть, но не поможет.
2. Нет, то, что сделал - классическое решение. По скорости устраивает. Вопрос был про DMA. Нельзя одновременно обращаться к памяти по DMA и программно.
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 17 2011, 12:35
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(ViKo @ Feb 17 2011, 15:03) *
Вопрос был про DMA. Нельзя одновременно обращаться к памяти по DMA и программно.

Ну да, выглядит странно. Согласно руководству, всё должно работать:
Цитата
The DMA controller performs direct memory transfer by sharing the system bus with the Cortex™-M3 core. The DMA request may stop the CPU access to the system bus for some bus cycles, when the CPU and DMA are targeting the same destination (memory or peripheral). The bus matrix implements round-robin scheduling, thus ensuring at least half of the system bus bandwidth (both to memory and peripheral) for the CPU.

Цитата
A DMA transfer error can be generated by reading from or writing to a reserved address space. When a DMA transfer error occurs during a DMA read or a write access, the faulty channel is automatically disabled through a hardware clear of its EN bit in the corresponding Channel configuration register (DMA_CCRx). The channel's transfer error interrupt flag (TEIF) in the DMA_IFR register is set and an interrupt is generated if the transfer error interrupt enable bit (TEIE) in the DMA_CCRx register is set.

В качестве workaround, наверное, можно просто перезапускать DMA после манипуляций с буфером. Или даже в обработчике прерывания TEI.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 18 2011, 08:43
Сообщение #9


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Попытал счастья с кодом, выполняемым из Flash. Показываю время в ms для пересылки с помощью DMA и программной, для кода из Flash и RAM
Код
     DMA   Program
RAM  19.5    21.5
ROM  19.75   21.0

Смотрел осциллографом, за точность до 1% не поручусь. Можно сказать, цифры остались примерно теми же. Подозреваю, что все дело во временах работы контроллера ЖКИ. Попробую в будущем уменьшить до предела допустимого.
Еще у меня SysTick таймер раз в 1ms выполняет несколько команд. Пустое...
При работе из Flash попробовал не делать проверку, что установлен флаг TCIF. То есть, записывать в буфер ОЗУ, когда из него читает DMA. Результат - по-прежнему вылазят ошибки.
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Feb 18 2011, 09:38
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(ViKo @ Feb 18 2011, 14:43) *
То есть, записывать в буфер ОЗУ, когда из него читает DMA. Результат - по-прежнему вылазят ошибки.

Может быть организовать двухстраничный буфер - пока в 1-й пишет DMA, со 2-м работаем, потом меняем местами.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 18 2011, 09:47
Сообщение #11


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(HardEgor @ Feb 18 2011, 11:38) *
Может быть организовать двухстраничный буфер - пока в 1-й пишет DMA, со 2-м работаем, потом меняем местами.

Боюсь, тоже будут конфликты. Надо попробовать поработать с внешней памятью (с другой областью), когда идет процесс DMA.
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Feb 18 2011, 09:50
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



И еще, может быть ты попадаешь на момент когда совпадают адреса RAM у DMA и программы? попробуй проверять флаг HTIFx: Channel x half transfer flag
Кстати, такты DMA можно глянуть в http://easyelectronics.ru/img/ARM_kurs/CMSIS/stm32.pdf пишут что "что модуль DMA поребляет максимум 40% пропускной способности шины данных, даже в момент непрерывной передачи данных"
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 18 2011, 12:47
Сообщение #13


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(HardEgor @ Feb 18 2011, 11:50) *
пишут что "что модуль DMA поребляет максимум 40% пропускной способности шины данных, даже в момент непрерывной передачи данных"

Это пишут про внутреннюю шину.
Заметил странное явление. Добавил код , обращающийся к внешнему ОЗУ, к области, не используемой для буфера ЖКИ.
Код
    uint8_t *pExtTest = (uint8_t *)EXTRAM;
    for (uint32_t i=16; i--; ) {
      *pExtTest++ = (uint8_t)pExtTest;
    }

Когда запускаю программу, она работает, если в Keil не включаю окно с Memory 3, где смотрю EXTRAM (0x64000000). Как только переключаюсь, флаги DMA (0x40020400) становятся 0x0D (ошибка). Т.е. средства отладки отбирают пропускную способность шины.
Если же смотреть, например, окно Memory 2, с адресами 0x40020400, вижу флаги 0x05, изредка 0x07. В-общем, программа работает.
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Feb 18 2011, 15:18
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Так проверить просто - выведи TEIFx на внешний порт на светодиод и запусти программу без отладчика.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 18 2011, 15:43
Сообщение #15


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(HardEgor @ Feb 18 2011, 17:18) *
Так проверить просто - выведи TEIFx на внешний порт на светодиод и запусти программу без отладчика.

Что вы предлагаете мне проверить таким образом?
Go to the top of the page
 
+Quote Post

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

 


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


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