Dolement_cycles с использованием регистров DWT

Рик Кимбалл
Пн 15 июня 2015 г., 21:20
Я был довольно испорчен другими архитектурами микроконтроллера, которые позволили вам использовать задержку задержки с задержкой, чтобы сделать суб -микросекундные задержки, просто используя NOPS. В Cortex-M3 есть все виды вещей, которые происходят, как прерывания, кэширование кода, трубопровод и т. Д. В действительности вы не можете считать количество циклов инструкций для данной куски кода. К счастью, на Cortex-M3 они предоставляют периферийную панель Trace Trace Debug, которую можно угнать и использовать для реализации функции Delay_cycles. Я создал класс и упаковал его в качестве файла заголовка здесь:

https: // Gist.GitHub.com/rickkimball/8bc ... 6F73CCF2E9

Чтобы использовать его в своей программе, сделайте что -то подобное. Включите файл заголовка, создайте экземпляр DWT_TIMER, вызовите функцию init () в setup (). Затем используйте функцию delay_cycles () с количеством циклов, которые вы хотите задержать. // #include "dwt_timer.h" static const dwt_timer usec_timer; void setup() { usec_timer.init(); } void loop() { DoSomething1(); usec_timer.delay_cycles((usec2cycles(1)-0)); /* optionally subtract cycles to deal with DoSomething1()'s overhead */ DoSomething2(); usec_timer.delay_cycles((usec2cycles(9)-0)); }

Rogerclark
Пн 15 июня 2015 г. 22:04
Рик,

Возможно, текущая задержка () может быть заменена этой версией.

Я посмотрел на текущую версию некоторое время назад, и Leaflabs приложил усилия, чтобы получить правильное время, но из комментариев, которые я видел на оригинальном форуме Maple, в основном функция задержки не очень точна.

Рик Кимбалл
Пн 15 июня 2015 г., 11:01 вечера
Я бы поместил этот материал в категории "влажную краску". Я получил это работа и решил поделиться богатством. Вы можете позволить ему возрастать. Я не уверен, есть ли какие -либо последствия использования вещей DWT с отладкой. Кажется, работает. Тем не менее, я не полностью исследовал это. Я просто пытался понять, смогу ли я достичь более точного времени микросекунды.

Вот еще один фрагмент кода, используя DWT_TIMER.Метод get (), чтобы выяснить, сколько циклов выполняет функции DigitalWrite, и учитывать их с задержкой: // slightly more accurate usec blink #include "dwt_timer.h" #define PIN PB12 static const dwt_timer usec_timer; void setup() { pinMode(PIN, OUTPUT); usec_timer.init(); } void loop() { uint32_t s0, e0; s0 = usec_timer.get(); digitalWrite(PIN,1); e0 = usec_timer.get(); const uint32_t overhead = e0-s0; digitalWrite(PIN,0); const uint32_t overhead1 = (e0-s0) + 21; /* the 21 hmm .. just kept tweaking until it was 10 usec cycle*/ while(1) { digitalWrite(PIN,1); usec_timer.delay_cycles(usec2cycles(1)-(overhead)); digitalWrite(PIN,0); usec_timer.delay_cycles(usec2cycles(9)-(overhead1)); } }

Rogerclark
Пн 15 июня 2015 г., 11:23
Рик,

ХОРОШО.

Это определенно стоит иметь в виду, как будущая замена на задержку () (и микросекундная задержка)

Стюарт
Вт 16 июня 2015 г. 12:02
Только если вы на самом деле не используете DWT для отладки, конечно... Не посмотрев внимательно на это, я бы
Интересно, была ли это хорошей идеей в коде общего назначения из -за этого..

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

Конечно, я мог бы говорить о мусоре - это действительно мешает? Нужно прочитать фактический код, когда я направляюсь, яснее
(проклятые встречи, враг продуктивности!)

Mrburnette
Вт 16 июня 2015 г. 12:26
Stuartw написал:Только если вы на самом деле не используете DWT для отладки, конечно... Не посмотрев внимательно на это, я бы
Интересно, была ли это хорошей идеей в коде общего назначения из -за этого..

Рик Кимбалл
Вт 16 июня 2015 1:20
В коде мой доступ ограничен регистром DWT_CYCCNT. Я установил его один раз во время init (), а затем просто прочитал его после этого. Видя, как большинство людей не используют сложные IDE, я сомневаюсь, что это повлияет на что -либо. Я знаю, что с некоторыми IDE, которые я использовал. Я вижу много других проектов, использующих этот стиль кода задержки в субтисекунде, чтобы достичь более точного времени, чем занято. Так что это, вероятно, несколько безопасно. Я бы не стал впадать в код на этом этапе. Люди должны попробовать это и сообщить о любой странности.

-рик

Mrburnette
Вт 16 июня 2015 г. 12:21
Люди должны попробовать это и сообщить о любой странности. Ну, это заставило меня глотать кофе!
Звучит как плакат CERN для: Кварка странность и очарование
https: // www.YouTube.com/watch?v = lfplggwmndc


Луча

Стевех
Ср. 09 сентября 2015 г. 18:19
С помощью 1000 прерываний в секунду в большинстве случаев, чтобы получить надежную точность микросекундного уровня, прерывания должны быть отключены для этой продолжительности. Соглашаться?

Рик Кимбалл
Чт 10 сентября 2015 г., 4:36 утра
Работаем на 72 МГц, вы получаете 72000 циклов между каждым прерыванием Systick. Кажется, что это даст вам достаточно времени, чтобы заняться каждым пробежком.

Mrburnette
Чт 10 сентября 2015 г. 11:54
Рик Кимбалл написал: <...>
К счастью, на Cortex-M3 они предоставляют периферийную панель Trace Trace Debug, которую можно угнать и использовать для реализации функции Delay_cycles. Я создал класс и упаковал его в качестве файла заголовка здесь:

https: // Gist.GitHub.com/rickkimball/8bc ... CCF2E9 [URL] [/url]

PE1MXP
Пт 18 сентября 2015 г. 15:11
Очень удобно, потому что мне нужна очень точная задержка с миросекундой.

Измерение задержки прерывания

Обратно