Перейти к содержанию
    

Появляется ошибка при передаче DMA или нет, при отсуствии внешних факторов типа отладчика.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверил работу программы из 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

После того, как переписал все свои программы для работы с буфером ЖКИ во внешней памяти, вышеприведенный код перестал работать.

Какие-то чудеса творятся. Решил плюнуть на эту затею, проверять бит TCIF сразу после запуска процедуры DMA. А то и совсем буду программно перекидывать, разница во времени по сравнению с DMA очень невелика.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А то и совсем буду программно перекидывать, разница во времени по сравнению с DMA очень невелика.

Ещё можно пооптимизировать программное копирование, используя инструкции LDM/STM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё можно пооптимизировать программное копирование, используя инструкции 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 *, но быстрее не стало, а размер кода увеличился.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...