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

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!

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

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

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

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

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

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

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

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

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

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

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

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

  • 1 год спустя...

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

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

01.07.2019 в 12:21, ruhi сказал:

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

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

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

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 пользователей онлайн

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