Ну да ядро тут не при чем, это от реализации STM32 зависит. В более поздних видать добавили. В STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx референсе ее нету.
По ссылке на ресурс easyelectronics там использовался STM32L152RBT6 в котором есть. Дело в том что топикстартер тестировал F103, соответственно ремапа у него нет. Вы этого не знали. Покапавшись узнали что не во всех есть он (зависит от реализации периферии у вендора).
_________________ Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Последний раз редактировалось Oxford Ср дек 27, 2017 06:27:59, всего редактировалось 1 раз.
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2693 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
AlphaLaiman писал(а):
Скорость выполнения в порядке возрастания: 1. Из RAM 2. Из RAM с ремаппингом (примерно также, как и Flash, плюс-минус такт) 3. Из Flash 4. Из CCMRAM (но эта опция есть только в STM32F3хх и STM32F7xx)
Однако, как я уже несколько раз говорил, мною на разных кодах были получены разные результаты. На одном форуме видел утверждение, что код из CCMRAM не выполняется на одних камнях, только как хранилище, а на других уже можно. Сам не знаю.
Сейчас народ рассосется и в рабочее время тихонько попробую еще один тестик. Посмотрим совпадут ли мои ожидания с результатом...
Oxford писал(а):
Дело в том что топикстартер тестировал F103
У меня еще есть 030, можно еще и его попробовать будет, я его даже не распаковывал. Тут cortex-m0, шины проще. Согласно пикче у ядра нет отдельной шины ICode. Все идет через системную шину. Может вечером попробую, ожидаю на нем самый быстрый код из ОЗУ.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Да у Cortex M0 одна системная шина. single 32-bit AMBA-3 AHB-Lite system interface that provides simple integration to all system peripherals and memory
Касаемо Cortex M3 4 шины.
Информация по кортексам извлекается из документов на архитектуры от ARM. По реализации периферии смотрите у вендора на конкретный МК.
_________________ Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
На одном форуме видел утверждение, что код из CCMRAM не выполняется на одних камнях, только как хранилище, а на других уже можно.
Я проверял на F3, там из CCM выполняется так же быстро, как из флеша при нулевых тактах ожидания, только флеш с 0WS сильно не разгонишь... А на F4 у меня стек в CCM, это тоже дает заметное увеличение производительности.
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2693 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
В рабочее время не удалось, сделал в обед. МК f103
Контроль скорости так же по частоте на порте. Массив на 256 32битных элементов, инициализирован некими числами. Зацикленная функция. Спойлер
Код:
void foo(void) { volatile uint32_t a = -1; while(1) { GPIOA->ODR^=1;//Инвертируем выход A0 uint8_t i=255; uint32_t buf=0;
while(i--) { buf+=Mass[i]; } a=buf; } };
Оптимизация включена.
Четыре варианта теста. Массив в ОЗУ и во Флеш. Функция в ОЗУ и во Флеш.
Первая половина теста. Массив в ОЗУ. Частота порта foo из флеша 12.788 кГц foo из ОЗУ 11.710 кГц
Собственно - это повторение вчерашнего результата.
Теперь массив во Флеш. foo из флеша 10.050 кГц foo из ОЗУ 10.050 кГц
Хотя я ожидал не совсем такого результата. Ожидал что скорость понизится во флеш, а что понизится и в ОЗУ не ожидал. Да еще и скорость стала одинаковая.
---------- Сейчас кое-что дотестирую и допишу еще одним постом. Тоже на мой взгляд интересная вещь.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2693 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
В функции foo была объявлена локальная переменная а, хотя и как volatile. Убрал и объявил глобально. И все перевернулось. Теперь ОЗУ нагибает флеш. Да еще как и во всех случаях расположения массива.
Первая половина теста. Массив в ОЗУ. Частота порта foo из флеша 12.723 кГц foo из ОЗУ 14.025 кГц
Теперь массив во Флеш. foo из флеша 7.418 кГц foo из ОЗУ 11.710 кГц
Так что, мутно тут усё и однозначно что-то утверждать нельзя видимо.
Добавлено after 9 minutes 2 seconds:
dosikus писал(а):
а к чему эти гонки ?
Понятно что эти не те камни, на которых можно считать количество команд, чтобы точно дернуть ногой. Однако в этих изысканиях может быть и практическое значение. Существуют же математические очень затратные операции и почему бы не поразмышлять как можно их ускорить?
ARV писал(а):
Вы еще этот массив при помощи DMA выводите куда-нибудь в порт, вот тогда и станет понятно, кто виноват и что делать.
Думаю будет только еще не понятнее. . Каналов DMA не один, модулей DMA тоже может быть не один. У них свои приоритеты переназначаемые, и еще будут драться за шину(ы) между собой и ядром. Полнейший арбитраж одним словом.
Кстати, как я понял, память CCM избавлена от домогательств со стороны DMA. Тут может быть свой минус.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Нет, просто для 72MHz достаточно 1WS и тогда твой пример из флеша у меня выполняется чуть быстрее, а при 2WS уже заметно медленнее. Но это F1, у F2 уже есть ART, а L1 относительно медленные и 2WS для них бесполезны. И пример достаточно специфичный, в цикле складываются данные и все, а я проверял на реальных приложениях и там всегда флеш был быстрее...
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2693 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Reflector писал(а):
1WS
Что это?
Reflector писал(а):
И пример достаточно специфичный, в цикле складываются данные и все, а я проверял на реальных приложениях и там всегда флеш был быстрее...
специфичный он или нет, не столь важно. Сам факт, что скорость выполнения там или там оказывается вещь не очень определенная. При том что, самый первый раз я сравнивал дизассеблерный код и он был идентичный для обоих расположений кода. В других разах тоже стоило так сделать конечно, но крайне лень.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Флеш медленный, на больших частотах приходится вводить такты ожидания. Хотя для 72MHz рекомендуется 2 такта, но реально с двумя уже можно мк и на 144 запустить В общем ищи в доках FLASH->ACR, там LATENCY.
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2693 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Залез в startup, да, устанавливается 2ws, согласно PM. Можно и тут поиграться конечно. Выключить буфер предвыборки и поглядеть что он дает в цифрах. Или устанвить 1ws. Да и разгон с одной стороны хорошо, но все же плохо . Еще какой доступ за пол такта есть ко флеш HLFCYA: Flash half cycle access enable.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2693 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Oxford писал(а):
Попробуй обьявить
Переменная а в принципе не использовалась. Смысл исполнения кода из флеш и хранения массива во флеш был как можно больше занять шину ICode, но не занимать остальные системные шины. И затем сравнить исполнение кода из озу, при том же массиве констант во флеше.
Для этого в foo была введена переменная buf не волатайл (чтобы не занимала системную шину), наверняка она была регистром, а чтобы оптимизатор не выкинул вычисления, результат сохранялся в переменную а. Но по всей видимости он ее все равно выкинул каким-то образом. Переменная а была объявлена только в области видимости функции, переменная а нигде не использовалась (варнинг был об этом). Однозначно, а нигде не могла использоваться(что четко видно компилятору) и видимо это дало повод компилятору все оптимизировать не смотря на то, что она волатайл. Т.е. первый эксперимент с foo, был неудачный, т.е. не вышло то что я хотел.
Объявив же a глобально, код заработал именно так, как и был написан. Т.е. уже понадобились данные из флеш, что и сильно понизило скорость выполнения кода из флеш.
Я думаю, что определение а в регистр эффекта не должно дать. Наверное сейчас попробую.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Дизассемблер листинг прикладывай увидим тогда что там было, иначе вангование на кофейной гуще. Ну смотри сам я просто увидел код с твоей переменной подумал что если...измениться что нет Можешь по шагам пройтись в отладке и посмотреть где лежит переменная в ОЗУ или регистре.
_________________ Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения