Jump to content
Guest Руслан

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

Recommended Posts

Guest Руслан

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

Share this post


Link to post
Share on other sites
Posted (edited)
13 часа назад, Гость Руслан сказал:

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

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

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

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

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

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

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

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

Edited by ruhi

Share this post


Link to post
Share on other sites
Guest Руслан
Цитата

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

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

Цитата

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

Да, я использую 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

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

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

Share this post


Link to post
Share on other sites

Тестирование литиевых батареек Fanso в нормальных условиях

Компания Компэл, эксклюзивный дистрибьютор компании Fanso, предлагает широкий перечень ЛХИТ, позволяющий подобрать элемент питания, в наибольшей степени соответствующий конкретным требованиям. Для тестирования параметров, указанных в Datasheet, специалисты Компэл организовали в апреле 2019 г. полугодовой тест на постоянный разряд в нормальных условиях четырех наиболее популярных моделей литий-тионилхлоридных и литий-диоксидмарганцевых батареек Fanso.

Посмотреть результаты первого среза

Guest Руслан

Ещё заметил такой момент: когда я работал с 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!

Share this post


Link to post
Share on other sites
Posted (edited)
В 27.06.2019 в 13:47, Гость Руслан сказал:

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

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

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

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

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

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

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

Edited by ruhi

Share this post


Link to post
Share on other sites

Новое бюджетное семейство микроконтроллеров STM32G0 и планы его развития

Семейство STM32G0 сочетает в себе лучшие качества представителей семейств STM32F0 и STM32L0 - относительно высокую производительность и низкое энергопотребление. Модели STM32G0 имеют упрощенную схему питания, улучшенную периферию, систему тактирования и быстрые порты в/в, доп.средства защиты ПО, повышенную устойчивость к статическим разрядам, широкий ассортимент корпусов, обновленные пакеты библиотек для STM32CubeMX. STMicroelectronics планирует развивать новое семейство.

Подробнее...

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • Guest blackhand
      By Guest blackhand
      Здравствуйте. Недавно возникла потребность в Ethernet бутлоадере для stm32f7.  Гугл на этот счёт обладает крайне скудной информацией, в частности есть наполовину полезная pdf от ST STM32Cube Ethernet IAP example, в которой описана архитектура того, как работает этот бутлоадер в целом и по каким протоколам. Во всём мире существует только один готовый пример такого бутлоадера , который сконфигурирован для stm32f4 и под какую-то из EVAL-отладочную плату. В распоряжении имею отладочную Nucleo-144 на STM32F767ZI, у которой на борту уже есть PHY Ethernet чип.
      А теперь, в чём, собственно, проблема: Простое переназначение ножек в файле ethernetif.c под мою плату (ну я уж не говорю про замену всех библиотек под мой тип МК) не поможет. Пример сделан под PHY Ethernet чип, который общается с контроллером по интерфейсу MII. На Nucleo чип имеет интерфейс RMII , то есть, пинов у него меньше. При изучении кода примера выяснил, что там отлавливается некое внешнее прерывание с отдельной ножки MII чипа, которая соединена с PB14  (Enable PB14 to IT mode: Ethernet Link interrupt). Такой ножки у моего RMII в помине нет, поэтому это прерывание Ethernet Link interrupt просто повисает в воздухе.
      Может кто-нибудь встречался с такой проблемой или имеет готовый рабочий бутлоадер? Был бы благодарен за помощь
    • Guest Денис
      By Guest Денис
      Доброго времени суток!
      Столкнулся с проблемой при использовании STM32F745.
      Элементарная программа:
      В main в бесконечном цикле происходит постоянный вызов процедуры, в которой следующее:
      1. выставили лог. 1 на GPIO
      2. пустой цикл задержки
      3. сбросили пин GPIO (лог. 0)
      4. пустой цикл задержки
      ...
      и далее повторение пунктов 1-4 4 раза.
      Все пустые циклы сделал ассемблерными вставками (чтобы наверняка, компилятор проглатывает как есть).
      На осциллографе 3 первых получившихся импульса и пауз между ними одинаковые, а четвертый импульс растянут раз в 5 больше. Эффект независим от длительности импульсов.
      При добавлении кол-ва импульсов этот эффект может проявиться где угодно в разных импульсах и паузах 1 и более раз.
      Тактирование PLL - 200 МГц от внешнего генератора 25 МГц. Пробовал и c HAL-ом и без него. Кроме GPIO и RCC (тактирование) ничего не включено. Все прерывания отключены. Питание норм.
      Что это может быть? Уже всю голову сломал и уже не я один.
      Приветствуются любые предложения.
      Спасибо!
  • Сообщения

    • Да сколько угодно. Цифровые запоминающие осциллографы, регистраторы данных.  Все это есть на  Алиэкспрессе. Можно даже  дешевенький конструктор собрать из модулей оттуда же.    А для чего я вам вот это написал? Это вы предлагаете, чтобы хлеб за ртом бегал?   Это у вас интерес. Только вы знаете сколько стоит ваше время, актуальность проблемы и вашу готовность что-то оптимизировать. Только вы формулируете ТЗ и знаете сколько можете  себе позволить потратить на его реализацию.  Ну и напоследок по поводу Это не перегиб, а лицо вашей фирмы. Это возможность планировать ваше время и поездки,  устранив внезапные выезды на аварии, предотвращать простои оборудования клиента своевременной профилактикой/превентивным ремонтом и  возможность ввести SLA для клиентов. За что они  же и заплатят сами.    
    • Добавлю: ещё и далеко не каждый тестер умеет точно измерять такие малые сопротивления.
    • Делайте выводы, чем вы будете дышать во время работы и насколько хватит этого ремонта.
    • Ну если человек не знает, что из себя представляет синфазный дроссель фильтра и нашёл "стабилитрон" на входе ИИП, то других выводов, кроме как "вроде", "мне кажется" и "где копать" ожидать не приходится.  Я требую выпустить КРАБа с гауптвахты! 
    • А что-меньше? Счастливый человек-не сталкивался видимо. Удачи!
    • Первая ссылка в яндексе поделилась https://elektrotanya.com/sony_xr-ca660x.pdf/download.html Чего беспомощные все такие?
×
×
  • Create New...