Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ускорение ARM (AT91SAM9260)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
andrewlekar
По описанию на форуме включил на процессоре D-Cache и ощутил нехилый прирост производительности. Теперь появился ряд вопросов:
1. Видел несколько раз упоминания об ускорении Bus Matrix. Однако в даташите никаких намёков на управляющие регистры для этого дела не увидел. Можете поделиться примерами и теоретическим обоснованием ускорения?
2. Для области DMA сейчас использую некешируемый и небуферизированный сегмент памяти. Заметил упоминание aaarrr о том, что буферизацию можно включить. Как работать с DMA у которой есть буферизация, так чтобы ничего не развалилось?
3. Я принимаю по DMA из ISI большой объём данных - картинку. Пока что для этих целей тупо выделил под DMA область памяти в 1 мегабайт. После получения картинки сливаю в кэшируемую память и работаю с ней. Такие размеры буфера DMA это нормально или нужно реализовывать приём по DMA кусками?
4. Есть ли надёжный способ проверить что MMU и D-Cache настроен правильно и память распределена корректно? Просто у меня всё с первого раза завелось, хотя было внесено довольно много изменений в настройки линкера и в обработку переменных. Хотелось бы имуть уверенность, что всё через некоторое время не развалится smile.gif
aaarrr
2. Имеет смысл, если DMA работает на пересылку из памяти. Перед запуском выполняется команда drain write buffer.
3. Копирование лучше исключить. Имеет смысл разрешить кэш и выполнять invalidate перед началом обработки очередного полученного фрейма.
4. Внимательно все проверить глазами и головой smile.gif
andrewlekar
Насколько я понял из доков, drain write buffer выполняется при любом чтении из этой памяти. Следовательно, если DMA используется и для чтения и для записи, можно включить на памяти для DMA буферизацию, а перед записью туда произвести хотя бы одно чтение. Всё верно?

По поводу invalidate: предлагается перед началом обработки полученной картинки его выполнить? Как произвести invalidate для кэша? Установить атрибут памяти как некешируемой а потом вернуть обратно? Или есть другой способ?

Да и ещё, FCSE для этого проца как включать и стоит ли? У меня там ртос и соответственно постоянно переключается контекст.
aaarrr
Цитата(andrewlekar @ Feb 12 2010, 10:34) *
Насколько я понял из доков, drain write buffer выполняется при любом чтении из этой памяти. Следовательно, если DMA используется и для чтения и для записи, можно включить на памяти для DMA буферизацию, а перед записью туда произвести хотя бы одно чтение. Всё верно?

Не при любом. Очистку буферов следует производить соответствующей инструкцией CP15 - Drain write buffer.

Цитата(andrewlekar @ Feb 12 2010, 10:34) *
Как произвести invalidate для кэша? Установить атрибут памяти как некешируемой а потом вернуть обратно? Или есть другой способ?

Опять-таки соответствующей инструкцией CP15. Самый грубый, простой но зато безопасный способ - выполнить команду Test, clean, and invalidate DCache.

Цитата(andrewlekar @ Feb 12 2010, 10:34) *
Да и ещё, FCSE для этого проца как включать и стоит ли? У меня там ртос и соответственно постоянно переключается контекст.

Для этого нужна соответствующая поддержка со стороны вашей RTOS.
andrewlekar
Ok. Я всё понял. Про команды CP15 прочитал. Только не понял, при очистке кэша можно передать адрес очищаемой области - какой именно адрес имеется в виду? И размер секции будет использован тот, который я указал в TLB - 1 Мб?
aaarrr
Кэш можно очищать:
а) полностью
б) построчно
Размер строки у ARM926EJ-S - восемь 32-битных слов.
Размер секции при операциях с кэшем не использутся.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.