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

STM32F7 максимальное быстродействие


Гость Руслан

Рекомендуемые сообщения

Недавно я начал разбираться с камнем STM32F7, так как на STM32F4 уже не хватало быстродействия. По результатом понял, что если просто запустить одну и ту же программу (вычисление цифровых фильтров) на F4 и F7 на максимальной частоте ядра, то производительность не сильно возрастает. Но если на F7 включить кэш первого уровня, вычисления проходят гораздо быстрее. Вопрос, как этот кэш используется? Его всего 4Кб на ОЗУ и 4Кб на флеш. Как компилятор решает что загрузить туда? Так же ещё на F7 прочитал что для увеличения быстродействия можно использовать TCM память, но не могу разобраться как с ней работать не в кейле, не в stmIDE. Может кто объяснить как работать с TCM памятью?

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

13 часа назад, Гость Руслан сказал:

Как компилятор решает что загрузить туда?

По кешу компилятор ничего не решает, это аппаратные функции процессора, и производители процессоров обычно не особо распространяются о деталях реализации - соответственно о способах эфективного использования. То есть если вы видите улучшение производительности при включении кэша - это все что вам надо знать о нем.

Если вы надумаете использовать ДМА придется немного углубляться в вопросы использования кэша. Вы же ДМА не используете? Зачем оно вам? просто включите кеш и все.

13 часа назад, Гость Руслан сказал:

Может кто объяснить как работать с TCM памятью?

Так же как и с любой другой памятью - надо понять какие регионы адресов принадлежат этой памяти, и использовать именно эти адреса, наблюдая при этом увеличение производительности по сравнению с использованием адресов другого типа памяти.

Если производительность не меняется или даже падает - значит вы что то делаете не так, надо искать ошибку вот и вся методика :) .

Кстати наблюдение и численное выражение значения производительности это отдельная непростая задача, для решения которой не всегда имеются инструменты на ембедед платформах!

Изменено пользователем ruhi

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

  • 3 недели спустя...

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Цитата

По кешу компилятор ничего не решает, это аппаратные функции процессора, и производители процессоров обычно не особо распространяются о деталях реализации - соответственно о способах эфективного использования. То есть если вы видите улучшение производительности при включении кэша - это все что вам надо знать о нем.

Понял, спасибо за информацию.

Цитата

Если вы надумаете использовать ДМА придется немного углубляться в вопросы использования кэша. Вы же ДМА не используете? Зачем оно вам? просто включите кеш и все.

Да, я использую DMA, и как я понимаю он не совместим с кэшом? DMA я использую для передачи и приёма сообщений по UART интерфейсу. И самое главное для оцифровки сигнала перед фильтрацией, то есть с настроил ADC+DMA+TIM чтобы с нужной мне частотой оцифровывать сигнал, а дальше пропускать его через ряд фильтров. Я могу как-нибудь использовать кэш и ДМА? Чтобы когда сигнал был оцифрован и начинались расчеты фильтров использовался кэш.

Цитата

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

Я побывал вариант - это использовать адаптивный кэш ART, включив его битом ARTEN в регистре FLASH->ACR. И, поскольку ART работает только на шине ITCM, нужно перенести код в адреса шины ITCM FLASH. Делается это очень просто - в скрипте загрузчика (файл .ld) прописываем область ITCM FLASH:

ITCMFLASH (rx) : ORIGIN = 0x00200000, LENGTH = 1024K
(размер области равен размеру флеша) 

и всё, что касается размещения во флеши, переписываем под ITCMFLASH, исправляя буковки в строчках ниже, в разделе SECTIONS
вместо буковок FLASH, пишем ITCMFLASH:

SECTIONS
{
/*------- Таблица векторов прерваний, размещается в ITCMFLASH ---*/
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} >ITCMFLASH

....
ну и так далее.

Но прироста к скорости вычислений не заметил вообще... Может это опять же из за ДМА...

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

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Ещё заметил такой момент: когда я работал с stm32f4 и использовал keil uvision и у меня была включена оптимизация 3 и FPU. Программа работала так: ADC+DMA+TIM, после того как приходило прерывание от DMA? я сбрасывал флаг и пропускал полученное значение через серию фильтров. На stm32f4 частота оцифровки была 20кГц, перед обработкой фильтров я включал светодиод и после выключал (так я мог на осциллографе смотреть время обработки). Время было равно 37 мкс. Но мне нужно было оцифровывать сигнал с частотой 40кГц и я понимая что мне не хватит быстродействия F4, решил попробовать реализовать всё на stm32f7, попутно перейти с keil uvision на новую на тот момент STM32CubeIDE. В итоге я получил следующие: та же самая программа с частотой оцифровки 20кГц. и оптимизации 3 (FPU я так не нашёл где в STM32CubeIDE посмотреть состояние, но как я понял по умолчанию оно включено+ещё в разделе оптимизации STM32CubeIDE стоят галочки Place functions in their own sections (-ffunction-sections) и Place data in their own sections (-fdata-sections)). Код выполняется даже чуть дольше 42 мкс, то есть я не как не успеваю если буду оцифровывать с частотой 40кГц. Если я к этому всему включаю кэш время обработки занимает 29 мкс. Если я включаю вместо оптимизации 3 включаю оптимизацию по размеру(for size), то время равно 18 мкс, что меня устраивает, но программа непонятно как считает фильтры, игнорирует некоторые условия (хотя переменные заданы volatile), таймеры считают не правильно время. Не понимаю почему так происходит и как работает данный тип оптимизации... Побывал включать Flash Interface: TCM Interface, ART ACCLERATOR Enabled, Instruction Prefetch Enabled, при этом менял ITCMFLASH (rx) : ORIGIN = 0x00200000 и всё, что касается размещения во флеши, переписал под ITCMFLASH в скрипте загрузчика (файл .ld). При этом если оптимизация 3, кэш выключен время выполнения кода фильтров равно 23 мкс. Если при этом включить кэш (хотя как я понимаю ITCMFLASH и кэш не работают одновременно) время не меняется. Пытался использовать DTCM RAM, поставив указатель стека на конец DTCM RAM: _estack = 0x20000000 + 64K; Время не изменилось так же 23 мкс. Если включить оптимизацию по размеру и выключить кэш время получается 25 мкс.

Всё ли я делаю правильно? Какие ещё методы увеличения быстродействия расчетов можно попробовать? Как правильно работать с оптимизацией?

Буду очень благодарен за любую помощь и пояснение как же обеспечить максимальное быстродействие в stm32f7!

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

В 27.06.2019 в 13:47, Гость Руслан сказал:

Да, я использую DMA, и как я понимаю он не совместим с кэшом? DMA я использую для передачи и приёма сообщений по UART интерфейсу.

проблема совместимости DMA c кешем довольно простая -  ДМА пишет в память, а процессор(ядро) может читать данные из кеша, и наоборот когда процессор пишет в память - данные могут задержаться в КЕШ и ДМА прочитает из памяти НЕ-актуальные данные. Самый простой и по моему лучший способ сделать ДМА-память НЕ-КЕШируемой. Если постоянно синхронизировать КЕШ с памятью - теряется смысл использования ДМА - убивается вся выигранная производительность!

В 27.06.2019 в 16:21, Гость Руслан сказал:

Буду очень благодарен за любую помощь и пояснение как же обеспечить максимальное быстродействие в stm32f7!

На любом процессоре максимальная производительность достигается написанием аппаратно зависимых функций на ассемблере, например я писал на IA32 такие спец-функции с использованием MMX, SSE регистров/инструкций, на AVR-ах тоже когда то измудрялся с хитрыми последовательностями инструкций на ассемблере.

Вот вы там фильтры какие то упомянули - вот их, скорее всего и надо переписать на ассемблере, причем с привязкой к конфигурации всех ваших ДМА-АЦП-таймеров. Там, У ВАС, должна быть какая то достаточно наглядная идея о том что сколько времени занимает и как события накладываются-синхронизируются, идея на полторы странички - не более!

Бездумный перебор настроек памяти/компилятора/... вряд ли может быть эффективным, для достижения границ производительности платформы по определенной вычислительной задаче. Эти границы (время исполнения конкретных операций) должны быть посчитаны с точностью до разброса по тикам для самой длинной цепочки ассемблерных инструкций.

Изменено пользователем ruhi

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

  • 1 год спустя...
01.07.2019 в 12:21, ruhi сказал:

Самый простой и по моему лучший способ сделать ДМА-память НЕ-КЕШируемой

А как это проще всего сделать? Для ПИКа это можно было сделать при объявлении, прямо всего массива. А для STM32? Я чё-то ищу и внятного решения найти не могу...

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

2 часа назад, DimaK сказал:

Для ПИКа это можно было сделать при объявлении, прямо всего массива. А для STM32?

Я с компилятором ПИКа для которого поддерживается функция КЕШирования памяти не работал, и вообще сомневаюсь что в этой линейке есть такие процессоры,

поэтому я думаю вы не совсем понимаете о чем идет речь, по крайней мере, возможность КЕШирования обычно определяется на уровне линкера в скрипте описания карты памяти, обычно + специальные аппаратные настройки регистров в коде (MMU-memory managment unit там был, кажется, по крайней мере там где я с этим работал, это были АРМ7-е).

То есть, как минимум, только расширения описания массива для объявления и РАЗМЕЩЕНИЯ его в неКешируемой памяти вроде как не достаточно, нужно еще эту область памяти правильно объявить для линкера, хотя...

в принципе там может быть предопределенная область памяти... - не знаю, читайте описание процессора, ищите по ключевому слову КЕШ.

С СТМ-мами с КЕШем я не разбирался.

Изменено пользователем ruhi

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • @READART Конкретно с LOGO не сталкивался, но у всех других, с кем сталкивался, программа всегда лежала во флеше. Да и хранить именно програмный код в энегозависимой памяти просто нелогично. Ионистор, скорее, может использоваться для отработки отключения питания, что-бы программа штатно могла завершиться, сохранив свое состояние.
    • А тема офигенно интересная. Рассуждать логически, в варианте А в среднем проводнике тока вообще практически нет и он нафиг не нужен. Во втором варианте по этим двум проводникам фигачит полный ток туда и обратно. Если хорошо свить, то по помехам одно...нно, только омические потери.  Дальше однозначного понимания у меня тоже нет. Я не выдающийся математик, мне нужен эксперимент. Например попробовать разорвать средний провод. Посмотреть куда подключены остальные цепи. Возможно у БЖТ асимметрия. Посмотреть как идут крайние провода обмотки, возможно раздвоенный средний компенсировал помеху от крайних.  ......  Не надо в подушку плакать, просто не нужно лезть с сегнетоэлектрикой в (калашный) звуковой ряд. Только не забывать про тоненькие дорожки к ним на ПП, если вдруг их приходится делать, или дилетанты наделали. А так да, отсутствие выводов большой плюс. Особенно когда занимаешься полосковой технологией.
    • Да схема самая обычная, без всяких пиэфси . Вот примерная.  Но блочок все равно не заработал, при превышении нагрузки 50 ватт происходит перекос плечей и выброс. В одной клетке 50 вольт. Получается на одном плече 200 на другом 150.
    • @1960sae "Собирал когда то такой конструктор, запустился сразу....". блин. не могу управится с ним. все проверил. нашел пробитый конденсатор, поменял. питание от адаптера сделал 7,3в. регулятор четко 5,05 в держит. на ногах пика питание есть, на всех ногах тоже какая то напруга есть. ниче не греется, транзы холодные. но не работает и все. когда щупами проверял по выводам пика моргнули индикаторы один раз и все. осцилла нет. ума не приложу, интернет рою. пока нифига не смог победить. что смущает: по схеме (я выше здесь выложил) 8 резисторов (на индикаторы идут) по 220 ом, а в наборе они по 1 кОм (я их впаял).  может по прошивке другая частота запуска прописана, может с кварцем что не так. опыта не хватает, конечно, сообразить, куда рыть. буду перебором
    • Кто сказал? Откуда такие знания? Опишите механизм появления искаженного звука. Точно не надо.
    • Здравствуйте. Чтобы не открывать новую тему по примитивному вопросу. На фото выше справа вверху стоит ионистор. На этой плате никаких элементов памяти я не вижу, поэтому скорее всего питание с ионистора подается вверх - на плату с МК.   Правильно ли я понимаю, что ионистор нужен для хранения текущего времени, а рабочая программа хранится в eeprom или flash на плате с МК (или в кишках самого МК)? Вопрос связан с тем, что прежде чем чинить эту LOGO, надо знать, сохранилась ли в нем программа. А чтобы узнать, сохранилась ли в нем программа, надо иметь соответствующую приблуду. Приблуду можно сотворить и самому, но если программа все-таки хранится в sram с питанием от ионистора, то никакого смысла делать приблуду нет, как и чинить LOGO. Просьба просветить, кто в курсе месте хранения рабочей программы в siemens logo. LOGO само собой старый: 6ED1052-1MD00-OBA5  
  • Похожий контент

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