Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: вопрос по IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
asen
как замерить сколько тактов/команд выполняется та или иная функция
prottoss
Цитата(asen @ Oct 23 2006, 13:39) *
как замерить сколько тактов/команд выполняется та или иная функция
В ИАРе, не знаю, а вот в AVRStudio можно замерить вплоть до муллиметра))) в ИАР в опциях Linker->Output или Linker->Extra Output ставишь тип выходного файла ubrof 7 (forced). После компиляции появляется файлих с расширением *.dbg. Его то Студией и открываешь. Ну а там все такты посмотреть можно. Кроме того, что бы в Студии был виден не только ассемблерный, но и Си-шный код, на вкладке Compiler->Output надо поставить галку на Generate debug information...
dxp
Цитата(asen @ Oct 23 2006, 12:39) *
как замерить сколько тактов/команд выполняется та или иная функция

В симуляторе? В окошке, где регистры (основные) должен быть типа регистр Cycles. Вот по нему и можно засекать.
gormih
Если IAR умеет создавать объектный файл - то легко можно загрузить его в AVR отладчик, и посмотреть по счетчику выполненых команд.
SasaVitebsk
Цитата(Михаил Горюнов @ Oct 23 2006, 10:10) *
Если IAR умеет создавать объектный файл - то легко можно загрузить его в AVR отладчик, и посмотреть по счетчику выполненых команд.


IAR, естественно, умеет создавать объектные файлы. В том числе такой, который понимает AVR Studio (UBROF8). Это если смотреть из симулятора.

Иногда необходимо посмотреть время исполнения значительного объёма проги. Причём в динамике. И, например замерить максимальное значение времени исполнения какого-то куска. Я это делаю так.

1. Выделяю и инициализирую под это дело таймер.
2. Вначале данного куска вставляю
...
uint16_t MaxT; // %%%% Для отладки
TCNT5 = 0; // %%%% Для отладки
...

3. В конце данного куска вставляю
...
__disable_interrupt();
MaxT = TCNT5;
__enable_interrupt();
if(MaxTime<MaxT) MaxTime=MaxT;
...

Это я взял из реальной проги.

Если таймер запущен в режиме CLK/1, то вот тебе и такты. smile.gif
arttab
если точность не требуется, а достаточно узнать свободные временные ресурсу на главный цикл и прерывания, то делаю так:
свободный вывод выставляю в 1, а в прерывании в 0и при выходе из прерывания восстанавливаю в 1. И смотрю на цифровом осциле время 1 и 0.
gormih
Это все излишество... с таймером.
В симуляторе AVR Studio 4 во время отладки в окне WorkSpace есть Группа Processor, так вот в этой группе есть такая замечательная весчь - Cycle Counter. Если взять ее значение в начале какого того фрагмента кода, и вычесть это значение из значения в конце фрагмента кода - то получишь количество циклов, которое данный фрагмент выполняется. С точностью до цикла :-) excl.gif
юзаем Breakpoints
Dog Pawlowa
Цитата(arttab @ Oct 23 2006, 12:45) *
И смотрю на цифровом осциле время 1 и 0.

a14.gif Так делал, даже когда осциллографы не были цифровыми. biggrin.gif
Удобно, что виден разброс в зависимости от прочих ситуаций, прерываний и проч.
Old1
Цитата(Михаил Горюнов @ Oct 23 2006, 14:02) *
Это все излишество... с таймером.
В симуляторе AVR Studio 4 во время отладки в окне WorkSpace есть Группа Processor, так вот в этой группе есть такая замечательная весчь - Cycle Counter. Если взять ее значение в начале какого того фрагмента кода, и вычесть это значение из значения в конце фрагмента кода - то получишь количество циклов, которое данный фрагмент выполняется. С точностью до цикла :-) excl.gif
юзаем Breakpoints

ИМХО не такое уж и излишество, если отлаживать через JTAG, то Cycle Counter неактивен и вариант с таймером, предложенный SasaVitebsk , нормальное решение...
SasaVitebsk
Цитата(Old1 @ Oct 23 2006, 20:55) *
ИМХО не такое уж и излишество, если отлаживать через JTAG, то Cycle Counter неактивен и вариант с таймером, предложенный SasaVitebsk , нормальное решение...


Совершенно в дырочку. smile.gif Причём я же оговорился: "на больших отрезках проги". Иногда даже на моей машине и то никаких сил не хватит ждать результатов симулятора. А иногда это просто нельзя сделать по простой причине, - симулятор не эмулирует внешнего оборудования, тем более если оно сложное. Но чаще всего такое приходится делать на изделии где несколько прерываний разного уровня. И есть шанс повторного входа в прерывание. Можно конечно на ножку и осциллографом, как предложили, но это оценочный путь. Так можно проценты посмотреть или среднее значение, а моим я максимальное определяю на больших статистических данных.
defunct
Можно и в Run-time определять:
Перед вызовом функции обнулить и запустить таймер, после - остановить.
прочитать значение таймера (время выполнения функции в тактах).
gormih
Цитата(SasaVitebsk @ Oct 24 2006, 00:42) *
Цитата(Old1 @ Oct 23 2006, 20:55) *

ИМХО не такое уж и излишество, если отлаживать через JTAG, то Cycle Counter неактивен и вариант с таймером, предложенный SasaVitebsk , нормальное решение...


Причём я же оговорился: "на больших отрезках проги". Иногда даже на моей машине и то никаких сил не хватит ждать результатов симулятора. А иногда это просто нельзя сделать по простой причине, - симулятор не эмулирует внешнего оборудования, тем более если оно сложное. Но чаще всего такое приходится делать на изделии где несколько прерываний разного уровня. И есть шанс повторного входа в прерывание. Можно конечно на ножку и осциллографом, как предложили, но это оценочный путь. Так можно проценты посмотреть или среднее значение, а моим я максимальное определяю на больших статистических данных.


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