Расчет времени, затрачиваемого функцией в приложениях микроконтроллера

Я хотел бы написать простой профилировщик для моего микроконтроллера STM32F100VE. Я видел, что могу включить time.h и на основе стандартных функций c я могу его использовать, но меня смутило _CLOCKS_PER_SEC_ 1000. Я не уверен, сработает ли этот подход или нет.

Как можно попытаться измерить время, затраченное функцией в приложении микроконтроллера?

Вам нужно знать, сколько времени функция должна выполняться, или вам нужно знать, сколько времени микроконтроллер проводит в функции, т.е. как часто она вызывается?
@VladimirCravero Я хочу знать, сколько времени микроконтроллер тратит на эту функцию. По сути, я запускаю игровой цикл и хотел бы знать, сколько эта функция «съела» из этого игрового цикла, который синхронизируется с 30FPS.
Один из методов, который я использовал для проверки конструкции, заключается в переключении контакта порта, после чего вы можете посмотреть на него на осциллографе. Обычно я знаю, что это должно быть из симуляции.
Идея со Спехро отличная, я тоже так делал. Просто установите пин-код при входе в функцию и отмените его при выходе. Вы можете проверить, сколько раз он вызывался, сколько времени требуется, чтобы вернуться и так далее. Имейте в виду: функция прерываемая?
@VladimirCravero Хорошая идея. но как бы вы рассчитали дельта-время между двумя триггерами вывода, если оно должно быть в миллисекундах.
Хм... Вы просто смотрите в прицел и измеряете его? Я предполагаю, что вы можете использовать прицел... Я не думаю, что понял последний вопрос,
@VladimirCravero Если бы у меня была возможность, я бы не задавал этот вопрос ^__^. Я не могу себе этого позволить, даже ICD, поэтому я ищу эквивалентные функции time.h, которые могут работать с stmf32.
Взгляните на этот вопрос: electronics.stackexchange.com/questions/21941/…
Не имея осциллографа, вы можете поставить RC-фильтр на переключатель и посмотреть, каков (усредненный) выходной сигнал с помощью мультиметра. Если вы знаете частоту цикла, вы можете рассчитать (среднее!) время, затрачиваемое на выполнение упражнения.
@WoutervanOoijen Хорошая идея. Гораздо лучше, чем ничего.

Ответы (3)

Самым простым маневром для сложных функций является использование встроенных таймеров.

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

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

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

Похоже, в вашем случае вам нужно что-то около 30 Гц (30 кадров в секунду), что очень долго по сравнению с временным циклом тактовой частоты процессора.

Хороший ответ, я просто хочу добавить, что если весь код работает с одними и теми же системными часами, то точная тактовая частота, вероятно, в этом случае не имеет значения. Обычно наибольший интерес представляет количество тактов, необходимых для выполнения функции.
@MathEE, можете ли вы объяснить подход к запуску и остановке таймера? Я бы запустил таймер для подсчета, затем вызвал бы мою функцию, а затем остановил ее, значение таймера было бы пропорционально времени, затраченному на функцию? но как мне преобразовать значение таймера в потраченные миллисекунды?
Вы можете запустить его и остановить, или вы можете просто оставить его работающим, а затем прочитать значения (разрешено, чтобы оно не переполнялось). Системные часы имеют частоту Ф С Д и скажем, вы установили свой таймер на увеличение с каждым тиком системных часов, тогда прошедшее время равно (  изменение таймера ) / Ф С Д .

Если это небольшая функция, вы можете просто посмотреть на разборку и посчитать инструкции.

К сожалению, у меня нет ИКД.
Вы можете посмотреть на сгенерированный ассемблер без ICD. Какие инструменты вы используете? Также это небольшая функция?
Это функция растеризации треугольника с вызовами кадрового буфера ЖК-дисплея для записи туда пикселей.
@Will В вашем коротком ответе содержится ценная информация, но он лучше подойдет в качестве комментария. У вас достаточно репутации, чтобы оставлять комментарии.
Некоторые недорогие ручные измерители могут измерять частоту и рабочий цикл. Например : TekPower TP4000ZC . (Обратите внимание, что один пользователь заявил, что импеданс этого не очень высок. Я вполне доволен своим...)

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

Это то, что я делаю все время. Гораздо проще, чем настроить еще один таймер.
Хотя использование прицела может быть самым быстрым и простым, я не думаю, что это самое точное. Использование встроенных таймеров позволяет выполнять функцию при широком наборе входных условий в течение длительного периода времени. Затем вы можете найти максимальное время выполнения в фактических тактовых циклах. Для кода, который имеет значительную изменчивость, было бы трудно уловить это в области видимости.
@JoeHass: многие современные области имеют функцию, называемую «режимом сохранения», при которой накладываются последовательные сигналы.