STM32 Отладка. Регистрация событий. Оценка времени выполнения кода.

แชร์
ฝัง
  • เผยแพร่เมื่อ 25 ธ.ค. 2024

ความคิดเห็น •

  • @PastuhMedvedey
    @PastuhMedvedey 5 ปีที่แล้ว +3

    Большое спасибо за урок ! Теперь я у себя в коде хоть стал понимать, какая функция тормозит.

  • @kogram
    @kogram 5 ปีที่แล้ว +3

    Огромное спасибо за Ваш труд!!!

  • @lysergicenemy
    @lysergicenemy 5 ปีที่แล้ว +5

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

    • @VladimirMedintsev
      @VladimirMedintsev  5 ปีที่แล้ว

      Тоже хороший вариант. Правда анализатор нужен, но идея хорошая.

  • @ДаниилВласов-н2б
    @ДаниилВласов-н2б 2 ปีที่แล้ว +1

    Спасибо вам за видео

  • @danilgaijin8366
    @danilgaijin8366 5 ปีที่แล้ว +2

    Спасибо за видео)

  • @golyakoff
    @golyakoff 3 ปีที่แล้ว +1

    Большое спасибо!

  • @andreymozgovoy8705
    @andreymozgovoy8705 5 ปีที่แล้ว +2

    Владимир, огромное спасибо за Ваши ролики. Чётко, доступно, понятно. Сейчас смотрю на какие контроллеры переходить и есть ли смысл это делать вообще. Можно уточнить, на какой частоте Вы делаете эти замеры? Меня очень удивило, что такой мощный МК выполняет приведенный цикл (8:28) за 2.169 сек. Atmega выполняет этот код за 2,72 сек на частоте 8МГц, а на 16 МГц - 1,36 сек.

    • @VladimirMedintsev
      @VladimirMedintsev  5 ปีที่แล้ว

      Ролик посвящен возможностям отладки и тому, как измерять время выполнения программы. Код показанный в ролике создает задержку и не может использоваться для оценки производительности микроконтроллера. А тем более сравнения различных архитектур. Так что сравнение stm - atmel по данной методике не имеет смысла ибо ничего не означает.

    • @andreymozgovoy8705
      @andreymozgovoy8705 5 ปีที่แล้ว

      @@VladimirMedintsev В ролике показан цикл, в котором вычисляется 32000 корней без каких-либо задержек между EventRecord2(0x01... и EventRecord2(0x02... Для сравнения я взял именно этот участок кода, показанный в ролике (8:28 - 9:04).

    • @VladimirMedintsev
      @VladimirMedintsev  5 ปีที่แล้ว

      Еще раз это не является способом сравнения эффективности процессоров. Скорости и эффективности процессоров сравнивают по другой методике и другим кодом. Показанное на видео это просто синтетическая задержка. То, что данный кусок кода выполняется на других процессорах какое-то время ни о чем не говорит. Ну в смысле вообще ни о чем.

  • @BalabayUA
    @BalabayUA 4 ปีที่แล้ว

    Только что отключил логический анализатор от платы.
    Замерял "ногодрыг" на выделенной ножке при входе и выходе из прерывания. Чтобы понять, сколько времени тратится на код прерывания и стабильность частоты (15 кГц всё-таки).
    Сейчас попробую этот регистратор событий.Знал про него, но думал что он только под фирменным программатором работает. Попробую через ST-Link v2.0 :)
    Спс

    • @BalabayUA
      @BalabayUA 4 ปีที่แล้ว +1

      Попробовал. Не заработал регистратор :-( В окне Event Recorder пусто. Заодно проверил вывод через printf->ITM - тут всё работает (SWO из программатора выведен).
      У вас какой программатор? Может с китайским свистком ST-Link это не поддерживается?

  • @olegp.3012
    @olegp.3012 4 ปีที่แล้ว

    На днях разбирался c таймером DWT для оценки скорости выполнения кода в тактах. А оно оказывается уже все есть готовенькое...
    В STM32CubeIDE идентичного не нашел, но есть консоль "SWV Trace Log" в которой фиксируются события и показывается время. Тут не нашел никаких функций, кроме как отправки числа в ITM. В качестве меток начала и конца отсчета времени отправляю число в ITM, оно отображается в консоле и по нему определяю время выполнения интересующего меня куска кода.
    Или можно написать пару функций которые будут выводить табулированные данные в саму консоль SWV ITM Data.

  • @WWolf_13
    @WWolf_13 ปีที่แล้ว

    А кроме Кейла используете что-то?

  • @87Spectr
    @87Spectr 4 ปีที่แล้ว

    У меня EventRecorder почему-то всегда показывает большую погрешность: например, на задержку HAL_Delay(500) показывает выполнение в 1,6 сек - не подскажите, в чём может проблема? у Вас на видео просто космическая точность) пробовал по-разному...

    • @poludenny
      @poludenny 4 ปีที่แล้ว

      У меня аналогично, только при HAL_Delay(500) показывает 24 сек. Читать доку в кейле по этой функции лень, сделал на таймере. Берётся ненужный таймер, допустим TIM6. Если нужно измерение с точностью 1 мкс, то prescaler-ом делим частоту так, что бы на выходе был 1 МГц (частота шины 240МГц - прескалер = 240). Далее перед измеряемой функцией time1 = TIM6->CNT. После измеряемой функции time2 = TIM6->CNT;
      time3 = time2 - time1. Всё, в time3 лежит значение в микросекундах времени выполнения функции.

  • @VasyaPupkinus
    @VasyaPupkinus 5 ปีที่แล้ว

    Здравствуйте , Владимир. Скажите , вы встроенный в Кеил логический анализатор использовали когда нибудь? Я никак не могу его победить.

    • @VladimirMedintsev
      @VladimirMedintsev  5 ปีที่แล้ว

      А у вас программатор-отладчик uLink?

    • @VasyaPupkinus
      @VasyaPupkinus 5 ปีที่แล้ว

      @@VladimirMedintsev нет) а что только ulink может? У меня stlink китайский, только что прикрутил к нему SWO по вашему видео. Переменные стали отображаться в анализаторе. А вот пин добавить в анализатор пока не получается

  • @adminroot1345
    @adminroot1345 4 ปีที่แล้ว

    В рабочих проектах какую предпочитаете арифметику целочисленную или с плавающей точкой и какой точности 32 или 64 бита?

    • @VladimirMedintsev
      @VladimirMedintsev  4 ปีที่แล้ว +1

      Скорее всего я не понял вашего вопроса. Потому что тут дело не в предпочтениях. У вас есть некоторые входные значения и есть выходные они уже имеют некоторую разрядность. В зависимости от того как и по какому алгоритму вы производите математическую обработку внутри своего алгоритма и какая точность вам необходима вы можете просчитать требуемую разрядность для каждого этапа своих вычислений. И выбрать соответствующие переменные.
      Разумеется что операции с плавающей запятой часто отнимают гораздо больше времени. От них как правило можно избавиться ну к примеру считать не 1,304 Ампера, а в миллиамперах 1304 миллиампера. Ну это в качестве примера. И таким образом уходить от операций с плавающей точкой. Ну и конечно же надо понимать, что современные микроконтроллеры очень скоростные. Нет оснований для паранои и страха перед использованием операций с плавающей точкой. Так что предпочтений нету. Я использую минимально достаточные переменные.

  • @АндрейИ-ф3л
    @АндрейИ-ф3л 5 ปีที่แล้ว

    Вопрос Владимиру, но если кто знает, расскажите: как сделать так, чтобы функции отладки не компилировались в релизном коде? Я видел, что есть в Кейле возможность задавать конфигурации, но моего ума не хватает, чтобы понять, как это настраивается.

    • @VladimirMedintsev
      @VladimirMedintsev  5 ปีที่แล้ว

      Для этого вам вначале придется определить (ну как минимум для самого себя) что вы подразумеваете под понятием релизный код.
      А вообще в окне Options for Targer на закладке Output. Тут та часть о которой вы спросили. А потом когда-нибудь расскажу о том, о чем вы не спросили.

    • @АндрейИ-ф3л
      @АндрейИ-ф3л 5 ปีที่แล้ว

      @@VladimirMedintsev , для самого себя я определил, теперь проблема это сформулировать. Но я попробую, а вы, если хотите, ответите или снимете про это ролик.
      В процессе создания проекта в теле программы появляется куча отладочных функций, как то вывод информации или ввод тестовых или случайных данных. Для отладки выполнение этих функций нужно, а для работы устройства - нет.
      Как сделать так, чтобы скомпилировать окончательную версию кода исключив из нее отладочные функции? Но при этом не удалять физически отладочные функции из тела кода, чтобы при дальнейшей разработке не пришлось их записывать заново.
      Спинной мозг подсказывает, что это возможно сделать (какой-то full_assert использовать), но в интернете об этом никто внятно еще не рассказал. По крайней мере я ответа не нашел.

    • @VladimirMedintsev
      @VladimirMedintsev  5 ปีที่แล้ว

      Посмотрите на директивы компилятора #ifdef
      все ими пользуются это правда к среде программирования никак не относится это язык.

    • @АндрейИ-ф3л
      @АндрейИ-ф3л 5 ปีที่แล้ว

      @@VladimirMedintsev , ifdef я знаю, но неужели нет другого способа, кроме как обрамлять каждый кусок отладочного кода директивами ifdef?

  • @ORISDBDRAG
    @ORISDBDRAG 4 ปีที่แล้ว

    А как сделать чтобы в Кейле подсказки функций всплывали как в ролике .

    • @VladimirMedintsev
      @VladimirMedintsev  4 ปีที่แล้ว

      Откомпилировать проект.

    • @ORISDBDRAG
      @ORISDBDRAG 4 ปีที่แล้ว

      @@VladimirMedintsev это было бы слишком просто. За 3 года пользования кейлом такую удобную функцию я вижу только в роликах у других. Keil 5.17.0.0

    • @VladimirMedintsev
      @VladimirMedintsev  4 ปีที่แล้ว +1

      @@ORISDBDRAG А у меня 5.30.0.0

  • @trololoface6855
    @trololoface6855 2 ปีที่แล้ว

    А есть ли подобный функционал для куб иде?

  • @alinetali2222
    @alinetali2222 5 ปีที่แล้ว

    А можно получить доступ к ST_CURRENT или VAL напрямую и присвоить в переменную, так как вы делали с HAL_GetTick() ?

    • @alinetali2222
      @alinetali2222 5 ปีที่แล้ว

      Нашел Start = SysTick->VAL; )))
      Очень кстати и полезно. Спасибо.

    • @VladimirMedintsev
      @VladimirMedintsev  5 ปีที่แล้ว

      Честно говоря не понял о чем вы.

    • @alinetali2222
      @alinetali2222 5 ปีที่แล้ว

      Можно получать значение с точностью до каждого тика.

    • @VladimirMedintsev
      @VladimirMedintsev  5 ปีที่แล้ว

      @@alinetali2222 1 тик = 1 миллисекунда = 36000 тактов процессора на тактовой частоте 36 мегагерц.
      1 тик это просто вечность.

  • @Саня-о3ь
    @Саня-о3ь 5 ปีที่แล้ว

    После обновления Keil до последней версии (на версии 5.17 ругается на последнюю версию DFP) возникли проблемы с русским шрифтом. В кодировке UTF-8 русские буквы есть, но для работы с LCD(OLED) эта кодировка не подходит. А в кодировке 1251 уже написанный текст читается, но про написании нового рисуются только вопросики. В старых версиях был патч UvEdit.dll который решает проблему. Как Вы выходите из ситуации в текущей версии Keil? Ведь при выводе текстовой информации на экран разных LCD это актуально.

    • @VladimirMedintsev
      @VladimirMedintsev  5 ปีที่แล้ว

      Я изначально не пользовался никакими патчами и использовал UTF-8. Поэтому проблема кодировок русского языка меня не сильно волнует. А что касается текстовых констант ну вынесите их в отдельный < .h > файл и напишите его в любом редакторе хоть в блокноте. А вызывайте в программе по именам и проблемы не будет.
      UPD. Но мне вот тут подсказывают что вроде в последних версиях этой проблемы и вовсе нету. Но лично не проверял.

    • @Саня-о3ь
      @Саня-о3ь 5 ปีที่แล้ว

      @@VladimirMedintsev Возникала мысль в создании констант, но надеялся обойтись без них. Последняя скачанная версия у меня - 5.27. Кодировку 1251 показывает нормально, а вот редактировать не дает.

    • @VladimirMedintsev
      @VladimirMedintsev  5 ปีที่แล้ว

      В новой версии 5.27 проблема с русским языком исправлена.

  • @retro55i
    @retro55i 3 ปีที่แล้ว

    А как потом , после отладки, убрать из текста программы все упоминания от регистратора событий. Ведь он крадет память и процессорное время.

    • @VladimirMedintsev
      @VladimirMedintsev  3 ปีที่แล้ว +1

      Дык вы все закладываемые в код отладочные строки кода предваряйте инструкцией #ifdef а завершайте #endif это позволит вам включать -выключать режим отладки кода одной строкой #define.
      Просто ознакомьтесь с директивами компилятора. Очень удобно

    • @rxlroman
      @rxlroman 3 ปีที่แล้ว

      Еще можно макросы условно определять. Например:
      #ifdef DEBUG
      #defined some_test(x) call_test_func(x)
      #else
      #define some_test(x)
      #endif
      Без дебага в программе ничего лишнего.

  • @Саня-о3ь
    @Саня-о3ь 5 ปีที่แล้ว

    После добавления EventRecorder у меня в EventRecorder.c присутствует строка #include CMSIS_device_header. Когда я сюда добавляю разные заголовочные файлы или просто ее комментирую то вылазят десятки ошибок. Подскажите как это исправить

    • @VladimirMedintsev
      @VladimirMedintsev  5 ปีที่แล้ว

      Не изменять этот файл.

    • @Саня-о3ь
      @Саня-о3ь 5 ปีที่แล้ว

      @@VladimirMedintsev Так в нем присутствует запись на которую ругается компилятор - #include CMSIS_device_header.

    • @VladimirMedintsev
      @VladimirMedintsev  5 ปีที่แล้ว

      Если все сделано правильно и стоит правильный пакет DFP то никакой ругани быть не должно. Судя по вопросам у вас проблемы с установкой Keil.

    • @Саня-о3ь
      @Саня-о3ь 5 ปีที่แล้ว

      @@VladimirMedintsev После разных экспериментов обновил Keil до версии 5.27 в итоге теперь тестовый проект сформированный с использованием HALошибок не дает. Если же проект сделан под SPL библиотеки то появляется множество ошибок в файле EventRecorder.c При этом компилятор #include CMSIS_device_header уже понимает. Можете что нибудь посоветовать?

  • @azzzza9957
    @azzzza9957 5 ปีที่แล้ว +1

    Я как пользователь Atollic true studio использую -> blog.atollic.com/cortex-m-debugging-measure-execution-time-using-swv/itm

    • @andreymozgovoy8705
      @andreymozgovoy8705 5 ปีที่แล้ว

      Подскажите, в каком пункте меню вызывается данное окно?

  • @Саня-о3ь
    @Саня-о3ь 5 ปีที่แล้ว

    Что то у меня этот EventRecorder отсутствует. Что делать?

    • @Саня-о3ь
      @Саня-о3ь 5 ปีที่แล้ว +1

      Вопрос закрыт. Обновил расширения в PackInstaller и все появилось.

  • @ibrag2012
    @ibrag2012 5 ปีที่แล้ว +1

    Рахував за допомогою осцилографа: підняв ногу, шматок коду, опустив ногу: таким чином розібрався із перериваннями таймерів.