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

Поделиться
HTML-код
  • Опубликовано: 25 авг 2024
  • Рассказывается о журнале событий и статистике анализа длительности выполнения фрагментов кода при отладке в среде Keil.
    ------------------------------------------
    Поддержать автора канала можно перейдя по ссылке:
    yoomoney.ru/to...
    Или просто отправив перевод на Yandex.кошелек:
    4100116547550395
    А также переводом по номеру карты Сбер:
    4279-3000-1033-0561
    ------------------------------------------

Комментарии • 56

  • @lysergicenemy
    @lysergicenemy 5 лет назад +5

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

    • @VladimirMedintsev
      @VladimirMedintsev  5 лет назад

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

  • @PastuhMedvedey
    @PastuhMedvedey 5 лет назад +3

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

  • @kogram
    @kogram 5 лет назад +3

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

  • @user-sy2dh3we5x
    @user-sy2dh3we5x 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 3 года назад

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

    • @BalabayUA
      @BalabayUA 3 года назад +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 10 месяцев назад

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

  • @azzzza9957
    @azzzza9957 5 лет назад +1

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

    • @andreymozgovoy8705
      @andreymozgovoy8705 5 лет назад

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

  • @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 миллиампера. Ну это в качестве примера. И таким образом уходить от операций с плавающей точкой. Ну и конечно же надо понимать, что современные микроконтроллеры очень скоростные. Нет оснований для паранои и страха перед использованием операций с плавающей точкой. Так что предпочтений нету. Я использую минимально достаточные переменные.

  • @user-fo1bu9zc4e
    @user-fo1bu9zc4e 5 лет назад

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

    • @VladimirMedintsev
      @VladimirMedintsev  5 лет назад

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

    • @user-fo1bu9zc4e
      @user-fo1bu9zc4e 5 лет назад

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

    • @VladimirMedintsev
      @VladimirMedintsev  5 лет назад

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

  • @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

  • @87Spectr
    @87Spectr 4 года назад

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

    • @poludenny
      @poludenny 3 года назад

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

  • @trololoface6855
    @trololoface6855 2 года назад

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

  • @user-zi1hf6xn2w
    @user-zi1hf6xn2w 5 лет назад

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

    • @VladimirMedintsev
      @VladimirMedintsev  5 лет назад

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

    • @user-zi1hf6xn2w
      @user-zi1hf6xn2w 5 лет назад

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

    • @VladimirMedintsev
      @VladimirMedintsev  5 лет назад

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

    • @user-zi1hf6xn2w
      @user-zi1hf6xn2w 5 лет назад

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

  • @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 тик это просто вечность.

  • @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
      Без дебага в программе ничего лишнего.

  • @user-fo1bu9zc4e
    @user-fo1bu9zc4e 5 лет назад

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

    • @VladimirMedintsev
      @VladimirMedintsev  5 лет назад

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

    • @user-fo1bu9zc4e
      @user-fo1bu9zc4e 5 лет назад

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

    • @VladimirMedintsev
      @VladimirMedintsev  5 лет назад

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

    • @user-fo1bu9zc4e
      @user-fo1bu9zc4e 5 лет назад

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

  • @user-fo1bu9zc4e
    @user-fo1bu9zc4e 5 лет назад

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

    • @user-fo1bu9zc4e
      @user-fo1bu9zc4e 5 лет назад +1

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

  • @ibrag2012
    @ibrag2012 4 года назад +1

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