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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> STM32F103. DMA Mem-to-Mem
HardEgor
сообщение Feb 18 2011, 20:06
Сообщение #16


Гуру
******

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



Появляется ошибка при передаче DMA или нет, при отсуствии внешних факторов типа отладчика.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 21 2011, 14:33
Сообщение #17


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

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



Проверил работу программы из Flash без отладчика.
Вот такой код из Flash работает (в самой программе ExtDpy2LCD_copy проверку TCIF убрал).
Причем, независимо, с отладчиком или без.
Код
  while (1) {
    ExtDpy2LCD_copy(0, 320*240/2);
    if (FPI.FP_Rdy) {
      FPI.FP_Rdy = 0;
      FPI_Process();    // здесь пишу в EXTDPY
    }
    while (!(DMA2->ISR & DMA_ISR_TCIF1));     // ждать флаг прерывания
  }

А из RAM (внутренней, естественно) такой код не работает. Независимо от того, вывожу в окне содержимое памяти, или нет. Если проверку TCIF поставить сразу после ExtDpy2LCD_copy, тогда работает и из RAM.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 25 2011, 08:25
Сообщение #18


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

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



После того, как переписал все свои программы для работы с буфером ЖКИ во внешней памяти, вышеприведенный код перестал работать.
Какие-то чудеса творятся. Решил плюнуть на эту затею, проверять бит TCIF сразу после запуска процедуры DMA. А то и совсем буду программно перекидывать, разница во времени по сравнению с DMA очень невелика.
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 25 2011, 09:00
Сообщение #19


Гуру
******

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



Цитата(ViKo @ Feb 25 2011, 11:25) *
А то и совсем буду программно перекидывать, разница во времени по сравнению с DMA очень невелика.

Ещё можно пооптимизировать программное копирование, используя инструкции LDM/STM.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 25 2011, 10:09
Сообщение #20


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

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



Цитата(scifi @ Feb 25 2011, 11:00) *
Ещё можно пооптимизировать программное копирование, используя инструкции LDM/STM.

Заменил пересылки на 32-битовые
Код
// Программная пересылка буфера в контроллер ЖКИ 32-битовыми словами
  uint32_t *pSour = (uint32_t *)(DPYBUF + Offset);
  uint32_t *pDist = (uint32_t *)(LCDRAM + Offset);
  LED_On();
  for (uint32_t i=Size/4; i--; ) {
    *pDist++ = *pSour++;
  }
  LED_Off();

Время пересылки уменьшилось с 18ms до 14ms.
(До этого я еще уменьшил время доступа к контроллеру ЖКИ, поэтому время и для 16-битовых пересылок уменьшилось).
Компилятор в этом случае использует LDM/STM, но только один регистр использует.
Вот кабы он знал, что количество пересылок кратно 8, 16... байтам...
Код
;;;415        *pDist++ = *pSour++;
0003d2  ca20              LDM      r2!,{r5}
0003d4  c020              STM      r0!,{r5}

Пробовал заменить указатели на uint64_t *, но быстрее не стало, а размер кода увеличился.
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 - 14:47
Рейтинг@Mail.ru


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