Иногда нужно знать (хотя бы примерно) сколько тактов выполняется участок кода.
Я решил этим заняться дабы измерить (в процентном соотношении) на сколько правы холиварщики, которые обызвают плохими словами людей использующих SPL от STMicroelectronics. Но это ещё в работе, а пока опишу только то, как вообще можно замерить скорость выполнения.
В интернетах нагуглил, только инкремент переменной по прерыванию от системного счётчика. Прерывать каждый такт не шибко то удобно, а мерить в сотнях/тысячах циклов не слишком то круто 😉
Засим найдено было такое решение:
#define DWT_CYCCNT *(volatile unsigned long *)0xE0001004 #define DWT_CONTROL *(volatile unsigned long *)0xE0001000 #define SCB_DEMCR *(volatile unsigned long *)0xE000EDFC // в коде программы SCB_DEMCR |= 0x01000000; DWT_CONTROL|= 1; // включаем счётчик DWT_CYCCNT = 0; for(i=0;i<1000;i++){}; // замеряемый код time=DWT_CYCCNT;
Таким образом можно довольно просто получать точные значения скорости выполнения в тактах, которые попадают в переменную time, и доступны для дальнейшей обработки.
Что такое DWT ? Буржуи так назвали модуль микропроцессора, служащий для отладки — Data Watchpoint and Trace Unit.
В документации ARM процессора сказано:
The DWT is an optional debug unit that provides watchpoints, data tracing, and system profiling for the processor.
Вообще DWT модель содержит 4 компаратора, настроить которые мы можем как:
- аппаратную точку наблюдения
- ETM триггер
- триггер событий PC (Programm counter)
- триггер событий адреса памяти
Перевод отсебятинский и довольно хреновый если честно. Так что приложу оригинал:
a hardware watchpoint
an ETM trigger
a PC sampler event trigger
a data address sampler event trigger.
На самом деле это всё нас не особо то интересует. Нам важно что данный модуль содержит счётчик циклов, которым мы можем воспользоваться.
Описание всех регистров модуля можно прочитать на сайте arm.