Делаю так: инвертирую пин до и после куска кода и смотрю логическим анализатором. Ваш вариант более правильный но нужно всегда держать в голове время выполнения самой команды регистратора.
Владимир, огромное спасибо за Ваши ролики. Чётко, доступно, понятно. Сейчас смотрю на какие контроллеры переходить и есть ли смысл это делать вообще. Можно уточнить, на какой частоте Вы делаете эти замеры? Меня очень удивило, что такой мощный МК выполняет приведенный цикл (8:28) за 2.169 сек. Atmega выполняет этот код за 2,72 сек на частоте 8МГц, а на 16 МГц - 1,36 сек.
Ролик посвящен возможностям отладки и тому, как измерять время выполнения программы. Код показанный в ролике создает задержку и не может использоваться для оценки производительности микроконтроллера. А тем более сравнения различных архитектур. Так что сравнение stm - atmel по данной методике не имеет смысла ибо ничего не означает.
@@VladimirMedintsev В ролике показан цикл, в котором вычисляется 32000 корней без каких-либо задержек между EventRecord2(0x01... и EventRecord2(0x02... Для сравнения я взял именно этот участок кода, показанный в ролике (8:28 - 9:04).
Еще раз это не является способом сравнения эффективности процессоров. Скорости и эффективности процессоров сравнивают по другой методике и другим кодом. Показанное на видео это просто синтетическая задержка. То, что данный кусок кода выполняется на других процессорах какое-то время ни о чем не говорит. Ну в смысле вообще ни о чем.
Только что отключил логический анализатор от платы. Замерял "ногодрыг" на выделенной ножке при входе и выходе из прерывания. Чтобы понять, сколько времени тратится на код прерывания и стабильность частоты (15 кГц всё-таки). Сейчас попробую этот регистратор событий.Знал про него, но думал что он только под фирменным программатором работает. Попробую через ST-Link v2.0 :) Спс
Попробовал. Не заработал регистратор :-( В окне Event Recorder пусто. Заодно проверил вывод через printf->ITM - тут всё работает (SWO из программатора выведен). У вас какой программатор? Может с китайским свистком ST-Link это не поддерживается?
На днях разбирался c таймером DWT для оценки скорости выполнения кода в тактах. А оно оказывается уже все есть готовенькое... В STM32CubeIDE идентичного не нашел, но есть консоль "SWV Trace Log" в которой фиксируются события и показывается время. Тут не нашел никаких функций, кроме как отправки числа в ITM. В качестве меток начала и конца отсчета времени отправляю число в ITM, оно отображается в консоле и по нему определяю время выполнения интересующего меня куска кода. Или можно написать пару функций которые будут выводить табулированные данные в саму консоль SWV ITM Data.
У меня EventRecorder почему-то всегда показывает большую погрешность: например, на задержку HAL_Delay(500) показывает выполнение в 1,6 сек - не подскажите, в чём может проблема? у Вас на видео просто космическая точность) пробовал по-разному...
У меня аналогично, только при HAL_Delay(500) показывает 24 сек. Читать доку в кейле по этой функции лень, сделал на таймере. Берётся ненужный таймер, допустим TIM6. Если нужно измерение с точностью 1 мкс, то prescaler-ом делим частоту так, что бы на выходе был 1 МГц (частота шины 240МГц - прескалер = 240). Далее перед измеряемой функцией time1 = TIM6->CNT. После измеряемой функции time2 = TIM6->CNT; time3 = time2 - time1. Всё, в time3 лежит значение в микросекундах времени выполнения функции.
@@VladimirMedintsev нет) а что только ulink может? У меня stlink китайский, только что прикрутил к нему SWO по вашему видео. Переменные стали отображаться в анализаторе. А вот пин добавить в анализатор пока не получается
Скорее всего я не понял вашего вопроса. Потому что тут дело не в предпочтениях. У вас есть некоторые входные значения и есть выходные они уже имеют некоторую разрядность. В зависимости от того как и по какому алгоритму вы производите математическую обработку внутри своего алгоритма и какая точность вам необходима вы можете просчитать требуемую разрядность для каждого этапа своих вычислений. И выбрать соответствующие переменные. Разумеется что операции с плавающей запятой часто отнимают гораздо больше времени. От них как правило можно избавиться ну к примеру считать не 1,304 Ампера, а в миллиамперах 1304 миллиампера. Ну это в качестве примера. И таким образом уходить от операций с плавающей точкой. Ну и конечно же надо понимать, что современные микроконтроллеры очень скоростные. Нет оснований для паранои и страха перед использованием операций с плавающей точкой. Так что предпочтений нету. Я использую минимально достаточные переменные.
Вопрос Владимиру, но если кто знает, расскажите: как сделать так, чтобы функции отладки не компилировались в релизном коде? Я видел, что есть в Кейле возможность задавать конфигурации, но моего ума не хватает, чтобы понять, как это настраивается.
Для этого вам вначале придется определить (ну как минимум для самого себя) что вы подразумеваете под понятием релизный код. А вообще в окне Options for Targer на закладке Output. Тут та часть о которой вы спросили. А потом когда-нибудь расскажу о том, о чем вы не спросили.
@@VladimirMedintsev , для самого себя я определил, теперь проблема это сформулировать. Но я попробую, а вы, если хотите, ответите или снимете про это ролик. В процессе создания проекта в теле программы появляется куча отладочных функций, как то вывод информации или ввод тестовых или случайных данных. Для отладки выполнение этих функций нужно, а для работы устройства - нет. Как сделать так, чтобы скомпилировать окончательную версию кода исключив из нее отладочные функции? Но при этом не удалять физически отладочные функции из тела кода, чтобы при дальнейшей разработке не пришлось их записывать заново. Спинной мозг подсказывает, что это возможно сделать (какой-то full_assert использовать), но в интернете об этом никто внятно еще не рассказал. По крайней мере я ответа не нашел.
После обновления Keil до последней версии (на версии 5.17 ругается на последнюю версию DFP) возникли проблемы с русским шрифтом. В кодировке UTF-8 русские буквы есть, но для работы с LCD(OLED) эта кодировка не подходит. А в кодировке 1251 уже написанный текст читается, но про написании нового рисуются только вопросики. В старых версиях был патч UvEdit.dll который решает проблему. Как Вы выходите из ситуации в текущей версии Keil? Ведь при выводе текстовой информации на экран разных LCD это актуально.
Я изначально не пользовался никакими патчами и использовал UTF-8. Поэтому проблема кодировок русского языка меня не сильно волнует. А что касается текстовых констант ну вынесите их в отдельный < .h > файл и напишите его в любом редакторе хоть в блокноте. А вызывайте в программе по именам и проблемы не будет. UPD. Но мне вот тут подсказывают что вроде в последних версиях этой проблемы и вовсе нету. Но лично не проверял.
@@VladimirMedintsev Возникала мысль в создании констант, но надеялся обойтись без них. Последняя скачанная версия у меня - 5.27. Кодировку 1251 показывает нормально, а вот редактировать не дает.
Дык вы все закладываемые в код отладочные строки кода предваряйте инструкцией #ifdef а завершайте #endif это позволит вам включать -выключать режим отладки кода одной строкой #define. Просто ознакомьтесь с директивами компилятора. Очень удобно
Еще можно макросы условно определять. Например: #ifdef DEBUG #defined some_test(x) call_test_func(x) #else #define some_test(x) #endif Без дебага в программе ничего лишнего.
После добавления EventRecorder у меня в EventRecorder.c присутствует строка #include CMSIS_device_header. Когда я сюда добавляю разные заголовочные файлы или просто ее комментирую то вылазят десятки ошибок. Подскажите как это исправить
@@VladimirMedintsev После разных экспериментов обновил Keil до версии 5.27 в итоге теперь тестовый проект сформированный с использованием HALошибок не дает. Если же проект сделан под SPL библиотеки то появляется множество ошибок в файле EventRecorder.c При этом компилятор #include CMSIS_device_header уже понимает. Можете что нибудь посоветовать?
Большое спасибо за урок ! Теперь я у себя в коде хоть стал понимать, какая функция тормозит.
Огромное спасибо за Ваш труд!!!
Делаю так: инвертирую пин до и после куска кода и смотрю логическим анализатором. Ваш вариант более правильный но нужно всегда держать в голове время выполнения самой команды регистратора.
Тоже хороший вариант. Правда анализатор нужен, но идея хорошая.
Спасибо вам за видео
Спасибо за видео)
Большое спасибо!
Владимир, огромное спасибо за Ваши ролики. Чётко, доступно, понятно. Сейчас смотрю на какие контроллеры переходить и есть ли смысл это делать вообще. Можно уточнить, на какой частоте Вы делаете эти замеры? Меня очень удивило, что такой мощный МК выполняет приведенный цикл (8:28) за 2.169 сек. Atmega выполняет этот код за 2,72 сек на частоте 8МГц, а на 16 МГц - 1,36 сек.
Ролик посвящен возможностям отладки и тому, как измерять время выполнения программы. Код показанный в ролике создает задержку и не может использоваться для оценки производительности микроконтроллера. А тем более сравнения различных архитектур. Так что сравнение stm - atmel по данной методике не имеет смысла ибо ничего не означает.
@@VladimirMedintsev В ролике показан цикл, в котором вычисляется 32000 корней без каких-либо задержек между EventRecord2(0x01... и EventRecord2(0x02... Для сравнения я взял именно этот участок кода, показанный в ролике (8:28 - 9:04).
Еще раз это не является способом сравнения эффективности процессоров. Скорости и эффективности процессоров сравнивают по другой методике и другим кодом. Показанное на видео это просто синтетическая задержка. То, что данный кусок кода выполняется на других процессорах какое-то время ни о чем не говорит. Ну в смысле вообще ни о чем.
Только что отключил логический анализатор от платы.
Замерял "ногодрыг" на выделенной ножке при входе и выходе из прерывания. Чтобы понять, сколько времени тратится на код прерывания и стабильность частоты (15 кГц всё-таки).
Сейчас попробую этот регистратор событий.Знал про него, но думал что он только под фирменным программатором работает. Попробую через ST-Link v2.0 :)
Спс
Попробовал. Не заработал регистратор :-( В окне Event Recorder пусто. Заодно проверил вывод через printf->ITM - тут всё работает (SWO из программатора выведен).
У вас какой программатор? Может с китайским свистком ST-Link это не поддерживается?
На днях разбирался c таймером DWT для оценки скорости выполнения кода в тактах. А оно оказывается уже все есть готовенькое...
В STM32CubeIDE идентичного не нашел, но есть консоль "SWV Trace Log" в которой фиксируются события и показывается время. Тут не нашел никаких функций, кроме как отправки числа в ITM. В качестве меток начала и конца отсчета времени отправляю число в ITM, оно отображается в консоле и по нему определяю время выполнения интересующего меня куска кода.
Или можно написать пару функций которые будут выводить табулированные данные в саму консоль SWV ITM Data.
А кроме Кейла используете что-то?
У меня EventRecorder почему-то всегда показывает большую погрешность: например, на задержку HAL_Delay(500) показывает выполнение в 1,6 сек - не подскажите, в чём может проблема? у Вас на видео просто космическая точность) пробовал по-разному...
У меня аналогично, только при HAL_Delay(500) показывает 24 сек. Читать доку в кейле по этой функции лень, сделал на таймере. Берётся ненужный таймер, допустим TIM6. Если нужно измерение с точностью 1 мкс, то prescaler-ом делим частоту так, что бы на выходе был 1 МГц (частота шины 240МГц - прескалер = 240). Далее перед измеряемой функцией time1 = TIM6->CNT. После измеряемой функции time2 = TIM6->CNT;
time3 = time2 - time1. Всё, в time3 лежит значение в микросекундах времени выполнения функции.
Здравствуйте , Владимир. Скажите , вы встроенный в Кеил логический анализатор использовали когда нибудь? Я никак не могу его победить.
А у вас программатор-отладчик uLink?
@@VladimirMedintsev нет) а что только ulink может? У меня stlink китайский, только что прикрутил к нему SWO по вашему видео. Переменные стали отображаться в анализаторе. А вот пин добавить в анализатор пока не получается
В рабочих проектах какую предпочитаете арифметику целочисленную или с плавающей точкой и какой точности 32 или 64 бита?
Скорее всего я не понял вашего вопроса. Потому что тут дело не в предпочтениях. У вас есть некоторые входные значения и есть выходные они уже имеют некоторую разрядность. В зависимости от того как и по какому алгоритму вы производите математическую обработку внутри своего алгоритма и какая точность вам необходима вы можете просчитать требуемую разрядность для каждого этапа своих вычислений. И выбрать соответствующие переменные.
Разумеется что операции с плавающей запятой часто отнимают гораздо больше времени. От них как правило можно избавиться ну к примеру считать не 1,304 Ампера, а в миллиамперах 1304 миллиампера. Ну это в качестве примера. И таким образом уходить от операций с плавающей точкой. Ну и конечно же надо понимать, что современные микроконтроллеры очень скоростные. Нет оснований для паранои и страха перед использованием операций с плавающей точкой. Так что предпочтений нету. Я использую минимально достаточные переменные.
Вопрос Владимиру, но если кто знает, расскажите: как сделать так, чтобы функции отладки не компилировались в релизном коде? Я видел, что есть в Кейле возможность задавать конфигурации, но моего ума не хватает, чтобы понять, как это настраивается.
Для этого вам вначале придется определить (ну как минимум для самого себя) что вы подразумеваете под понятием релизный код.
А вообще в окне Options for Targer на закладке Output. Тут та часть о которой вы спросили. А потом когда-нибудь расскажу о том, о чем вы не спросили.
@@VladimirMedintsev , для самого себя я определил, теперь проблема это сформулировать. Но я попробую, а вы, если хотите, ответите или снимете про это ролик.
В процессе создания проекта в теле программы появляется куча отладочных функций, как то вывод информации или ввод тестовых или случайных данных. Для отладки выполнение этих функций нужно, а для работы устройства - нет.
Как сделать так, чтобы скомпилировать окончательную версию кода исключив из нее отладочные функции? Но при этом не удалять физически отладочные функции из тела кода, чтобы при дальнейшей разработке не пришлось их записывать заново.
Спинной мозг подсказывает, что это возможно сделать (какой-то full_assert использовать), но в интернете об этом никто внятно еще не рассказал. По крайней мере я ответа не нашел.
Посмотрите на директивы компилятора #ifdef
все ими пользуются это правда к среде программирования никак не относится это язык.
@@VladimirMedintsev , ifdef я знаю, но неужели нет другого способа, кроме как обрамлять каждый кусок отладочного кода директивами ifdef?
А как сделать чтобы в Кейле подсказки функций всплывали как в ролике .
Откомпилировать проект.
@@VladimirMedintsev это было бы слишком просто. За 3 года пользования кейлом такую удобную функцию я вижу только в роликах у других. Keil 5.17.0.0
@@ORISDBDRAG А у меня 5.30.0.0
А есть ли подобный функционал для куб иде?
Разумеется есть.
скорее всего нет.Ты про stm32cubeIde ?
А можно получить доступ к ST_CURRENT или VAL напрямую и присвоить в переменную, так как вы делали с HAL_GetTick() ?
Нашел Start = SysTick->VAL; )))
Очень кстати и полезно. Спасибо.
Честно говоря не понял о чем вы.
Можно получать значение с точностью до каждого тика.
@@alinetali2222 1 тик = 1 миллисекунда = 36000 тактов процессора на тактовой частоте 36 мегагерц.
1 тик это просто вечность.
После обновления Keil до последней версии (на версии 5.17 ругается на последнюю версию DFP) возникли проблемы с русским шрифтом. В кодировке UTF-8 русские буквы есть, но для работы с LCD(OLED) эта кодировка не подходит. А в кодировке 1251 уже написанный текст читается, но про написании нового рисуются только вопросики. В старых версиях был патч UvEdit.dll который решает проблему. Как Вы выходите из ситуации в текущей версии Keil? Ведь при выводе текстовой информации на экран разных LCD это актуально.
Я изначально не пользовался никакими патчами и использовал UTF-8. Поэтому проблема кодировок русского языка меня не сильно волнует. А что касается текстовых констант ну вынесите их в отдельный < .h > файл и напишите его в любом редакторе хоть в блокноте. А вызывайте в программе по именам и проблемы не будет.
UPD. Но мне вот тут подсказывают что вроде в последних версиях этой проблемы и вовсе нету. Но лично не проверял.
@@VladimirMedintsev Возникала мысль в создании констант, но надеялся обойтись без них. Последняя скачанная версия у меня - 5.27. Кодировку 1251 показывает нормально, а вот редактировать не дает.
В новой версии 5.27 проблема с русским языком исправлена.
А как потом , после отладки, убрать из текста программы все упоминания от регистратора событий. Ведь он крадет память и процессорное время.
Дык вы все закладываемые в код отладочные строки кода предваряйте инструкцией #ifdef а завершайте #endif это позволит вам включать -выключать режим отладки кода одной строкой #define.
Просто ознакомьтесь с директивами компилятора. Очень удобно
Еще можно макросы условно определять. Например:
#ifdef DEBUG
#defined some_test(x) call_test_func(x)
#else
#define some_test(x)
#endif
Без дебага в программе ничего лишнего.
После добавления EventRecorder у меня в EventRecorder.c присутствует строка #include CMSIS_device_header. Когда я сюда добавляю разные заголовочные файлы или просто ее комментирую то вылазят десятки ошибок. Подскажите как это исправить
Не изменять этот файл.
@@VladimirMedintsev Так в нем присутствует запись на которую ругается компилятор - #include CMSIS_device_header.
Если все сделано правильно и стоит правильный пакет DFP то никакой ругани быть не должно. Судя по вопросам у вас проблемы с установкой Keil.
@@VladimirMedintsev После разных экспериментов обновил Keil до версии 5.27 в итоге теперь тестовый проект сформированный с использованием HALошибок не дает. Если же проект сделан под SPL библиотеки то появляется множество ошибок в файле EventRecorder.c При этом компилятор #include CMSIS_device_header уже понимает. Можете что нибудь посоветовать?
Я как пользователь Atollic true studio использую -> blog.atollic.com/cortex-m-debugging-measure-execution-time-using-swv/itm
Подскажите, в каком пункте меню вызывается данное окно?
Что то у меня этот EventRecorder отсутствует. Что делать?
Вопрос закрыт. Обновил расширения в PackInstaller и все появилось.
Рахував за допомогою осцилографа: підняв ногу, шматок коду, опустив ногу: таким чином розібрався із перериваннями таймерів.