HardEgor 75 18 февраля, 2011 Опубликовано 18 февраля, 2011 · Жалоба Появляется ошибка при передаче DMA или нет, при отсуствии внешних факторов типа отладчика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 21 февраля, 2011 Опубликовано 21 февраля, 2011 · Жалоба Проверил работу программы из 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 25 февраля, 2011 Опубликовано 25 февраля, 2011 · Жалоба После того, как переписал все свои программы для работы с буфером ЖКИ во внешней памяти, вышеприведенный код перестал работать. Какие-то чудеса творятся. Решил плюнуть на эту затею, проверять бит TCIF сразу после запуска процедуры DMA. А то и совсем буду программно перекидывать, разница во времени по сравнению с DMA очень невелика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 25 февраля, 2011 Опубликовано 25 февраля, 2011 · Жалоба А то и совсем буду программно перекидывать, разница во времени по сравнению с DMA очень невелика. Ещё можно пооптимизировать программное копирование, используя инструкции LDM/STM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 25 февраля, 2011 Опубликовано 25 февраля, 2011 · Жалоба Ещё можно пооптимизировать программное копирование, используя инструкции 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 *, но быстрее не стало, а размер кода увеличился. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться