вычисление времени выполнения кода в высоко оптимизированном коде

Я работаю над Cortex M3 и использую IAR EWARM. Я использую DWT_DYCCNT для расчета времени. Проблема в том, что когда я оптимизирую код по скорости (используя параметры компилятора), я теряю значение DWT_DYCCNT во время отладки. Код находится на C и C ++. Я также попытался напечатать значение переменной, используя printf но это также возвращает ошибки.

Я пытался сделать переменную volatile, но это тоже не помогает.

Во время отладки я всегда получаю unknown value для этой переменной.

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

РЕДАКТИРОВАТЬ:

     volatile int count = 0;
volatile unsigned int *DWT_CYCCNT = (unsigned int *)0xE0001004; //address of the register
volatile unsigned int *DWT_CONTROL = (unsigned int *)0xE0001000; //address of the register
volatile unsigned int *SCB_DEMCR = (unsigned int *)0xE000EDFC; //address of the register

*SCB_DEMCR = *SCB_DEMCR | 0x01000000;
*DWT_CYCCNT = 0; // reset the counter
*DWT_CONTROL = *DWT_CONTROL | 1 ; // enable the counter

_DO_SOMETHING_HERE_

count = *DWT_CYCCNT;
printf("\n COUNT!!!! = %d",*DWT_CYCCNT);

Значение count «теряется» при отладке кода.

Спасибо

1

Решение

Если вы хотите измерить период времени, вы можете использовать осциллограф. Просто установите вывод на ВЫСОКИЙ при входе в секцию кода, время которой вы хотите измерить, а затем установите вывод на НИЗКИЙ, когда секция заканчивается.

Это наиболее точный способ измерения таймингов во встроенных системах.

1

Другие решения

Если вы объявите переменную с __root (двойное подчеркивание), тогда IAR не будет его оптимизировать.

__root volatile int count = 0;

У вас все еще могут быть другие проблемы. Ваш _DO_SOMETHING_HERE_ код все еще может быть оптимизирован. Вам может понадобиться использовать __root для других объявлений также.

Другая проблема, которую я часто вижу, заключается в том, что отладчик не показывает значения локальных переменных время от времени при использовании оптимизаций. Вам нужно будет открыть окно «Разборка» окна «Регистры» и посмотреть, какой регистр (где-то между R0-R12) используется для хранения count, Надежным способом было бы иметь функцию, возвращающую ваше значение счетчика. ARM Cortex использует R0 для возвращаемых значений, поэтому после того, как функция завершает значение в R0 это значение количества. К сожалению, это то, что вы должны делать при отладке с оптимизацией.

0

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

Заказываются только волатильные операции.

Я использую аналогичный код для бенчмаркинга, но я предпочитаю глобальный volatile для count (он работал для меня с arm-none-eabi-gcc 4.6)

0
По вопросам рекламы [email protected]