Обновить

Пуск DWT Таймера на ARM Cortex-M (или Ядерный Таймер)

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели10K
Всего голосов 13: ↑12 и ↓1+12
Комментарии10

Комментарии 10

Спасибо, просто и со вкусом.

Единственная деталь - все же этот таймер использовать как таймер общего назначения - ну в специальных случаях. А вот оценить время реакции кода на событие - это его основная задача, с которой он очень успешно справляется. Выдавая прямо мечту любого embedder'а - количество тиков. И тут, как правило, отрезка даже в секунду более чем достаточно.

Юзаю DWT для оценки производительности участков кода

То есть по назначению! =)

А вот эта строка ifn(Config->DWTx), это макрос или функция такая?

Это макрос для if not

/*If not()  */
#define ifn(CONDITION)    if(!(CONDITION))
#define nif(CONDITION)    if(!(CONDITION))

Это простенький вспомогательный макрос, чтобы делать код лаконичнее.

У каждого, конечно, свои представления о красивом коде и свой стиль. Но скобки, оборачивающие "!", в целом излишни. А между

ifn(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 есть встроенный аппаратный механизм получения таймстампов.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации