
Комментарии 10
Спасибо, просто и со вкусом.
Единственная деталь - все же этот таймер использовать как таймер общего назначения - ну в специальных случаях. А вот оценить время реакции кода на событие - это его основная задача, с которой он очень успешно справляется. Выдавая прямо мечту любого embedder'а - количество тиков. И тут, как правило, отрезка даже в секунду более чем достаточно.
Юзаю DWT для оценки производительности участков кода
А вот эта строка ifn(Config->DWTx), это макрос или функция такая?
Это макрос для if not
/*If not() */
#define ifn(CONDITION) if(!(CONDITION))
#define nif(CONDITION) if(!(CONDITION))
Это простенький вспомогательный макрос, чтобы делать код лаконичнее.
В ARM Cortex-M процессорах помимо SysTick есть еще один 32 битный таймер по имени DWT.
Это не совсем верная информация, в Cortex-M0/0+ его нет.
вместо деления на константу для получения микросекунд, при желании, можно перейти к измерениям в наносекундах и в этом случае надо умножать на константу, что делатеся всегда за один тик вместо неопределенного числа тиков в некотором интервале для деления (на Cortex-M).
Теперь, благодаря работе с 64-битным счетчиком можно считать вплоть до 1,09e11 секунд. Это, к слову, 3454 лет.
Но зачем?
Зачем считать с ценой деления в 10нс до Х тысяч лет, если самые крутые кварцы дают ошибку 1...10ppm (то есть в течение 1 секунды погрешность достигнет 100...1000 делений)?
enter_critical();
<...>
exit_critical();Занимает это всё великолепие где-то от нескольких десятков до многих десятков машинных циклов. Worst case на выполнение любого другого критического действия увеличивается на эти самые десятки тактов.
Кроме этого, с учётом необходимости либо обработки текущего события в моменте, либо загрузки таймстампа в кольцевой буфер, время реакции на два соседних события составит плюс-минус 1мкс.
Это всё при том, что у Cortex-M есть встроенный аппаратный механизм получения таймстампов.
Пуск DWT Таймера на ARM Cortex-M (или Ядерный Таймер)