Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Измерение времени выполнения функции Keil J-Link
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
kt368
Здравствуйте!
Нужно измерить время выполнения функции на реальном железе, использую Keil + J-Link. Для этого поставил breackpoint на строку вызова функции и на следующую строку. При попытке посмотреть время выполнения программы от одного breackpoint'a до другого, значение Stop Watch почему-то не меняется, хотя, если программа крутится в бесконечном цикле, то время идёт, проверял по часам - довольно точно. Также вычитал тут про возможность применения "Debug->Execution Profiling->Time", но, как вычитал на сайте Keil'a, эта функция при дебаге работает только "with ETM Instruction Trace", а в моем отладчике возможность ETM Trace отсутствует.
Как можно померить время выполнения функции? В MPLAB IDE было так просто...
Herz
А как в MPLAB IDE? Никогда не пользовался. А, Stop Watch...
Если отладка идёт на реальном железе, то нельзя ли какой-нибудь пин порта временно использовать? Обычно всегда можно найти свободный в данный момент.
kt368
Пин то найти можно легко, только осциллографа под рукой нет, хотелось бы как-то без него.
Herz
Кстати, я у себя в MPLAB StopWatch почему-то не нахожу...

Нажмите для просмотра прикрепленного файла
kt368
Хм...может это у меня было в симуляторе... Ладно, буду пользоваться выводом сигнала на пин и осциллографом.
Falkon_99
какой контроллер? если STM32, то в нем есть регистр который считает такты ядра, зная частоту можно определить время. регистр вроде называется DWT_CYCCNT
Ixt
Цитата
Измерение времени выполнения функции


Для этого можно использовать любой таймер. Обычно их много и настраиваются не так сложно, поэтому всегда можно один таймер использовать для отсчёта времени (или "тиков" когда нужно работать с временами порядка нано/микросекунд).
Ну а дальше всё просто: запоминаем в переменной текущее состояние таймера, запускаем функцию. После завершения разность между новым состоянием таймера и запомненным даёт искомое время.
Tarbal
Цитата(Herz @ Nov 3 2013, 16:38) *
Кстати, я у себя в MPLAB StopWatch почему-то не нахожу...


Как в 95 начал с MPLABом работать так одни и те же проблемы. Баги редактора и StopWatch убирают через версию. В одной версии есть в следующей нет. Я уже у Микрочипа про StopWatch спрашивал. Ничего внятного они не смогли сказать.
kt368
Контроллер LPC1758, пока измеряю время с помощью осциллографа. Про таймер спасибо, буду иметь в виду такой вариант.
Tarbal
Цитата(kt368 @ Nov 3 2013, 14:44) *
Здравствуйте!
Нужно измерить время выполнения функции на реальном железе, использую Keil + J-Link. Для этого поставил breackpoint на строку вызова функции и на следующую строку. При попытке посмотреть время выполнения программы от одного breackpoint'a до другого, значение Stop Watch почему-то не меняется, хотя, если программа крутится в бесконечном цикле, то время идёт, проверял по часам - довольно точно. Также вычитал тут про возможность применения "Debug->Execution Profiling->Time", но, как вычитал на сайте Keil'a, эта функция при дебаге работает только "with ETM Instruction Trace", а в моем отладчике возможность ETM Trace отсутствует.
Как можно померить время выполнения функции? В MPLAB IDE было так просто...


Методы которые работают всегда:

Простейший способ приблизительно измерить время -- установить пин в единицу на время работы функции и измерить осциллографом.

Более точно -- считать значение счетчика таймера в начале и в конце и посчитать разницу. Этот метод будет правильно работать для времен короче времени цикла счетчика. Но введением делителя перед счетчиком можно увеличить интервал, снизив разрешение.


sm.gif Почитал ответы. Обнаружил, что опоздал.

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


Цитата(Ixt @ Nov 5 2013, 11:44) *
Для этого можно использовать любой таймер. Обычно их много и настраиваются не так сложно, поэтому всегда можно один таймер использовать для отсчёта времени (или "тиков" когда нужно работать с временами порядка нано/микросекунд).
Ну а дальше всё просто: запоминаем в переменной текущее состояние таймера, запускаем функцию. После завершения разность между новым состоянием таймера и запомненным даёт искомое время.


Бывает используют таймеры для нескольки input capture/output compare, а такие таймеры свободно бегущие. Такой таймер можно использовать.

Цитата(kt368 @ Nov 3 2013, 16:41) *
Хм...может это у меня было в симуляторе...


Нет, была просто другая версия sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.