Аналог __builtin_avr_delay_cycles () для Arduino DUE

Super_indian_coder
Offline
Зарегистрирован: 26.03.2021

Имею Arduino DUE и общаюсь с помощью неё с устройством по SPI.
Мне необходимо делать задержку в 0.5мкс без остановки кода, т.е. через цикл с использованием micros() не получится, нужна задержка в количествах циклов.
До этого мой скетч был для Atmega328p и для неё работала функция __builtin_avr_delay_cycles(8) и всё было замечательно, на DUE она конечно не работает. Есть ли какой-то ее аналог? Весь день гуглю и не могу нагуглить решение.

rkit
Offline
Зарегистрирован: 23.11.2016

Сколько это циклов займет придется измерить

for(volatile int i = 0; i < x; i++) {}

Super_indian_coder
Offline
Зарегистрирован: 26.03.2021

rkit пишет:

Сколько это циклов займет придется измерить

for(volatile int i = 0; i < x; i++) {}

Измерить не проблема, примерно 44 цикла. Вопрос в том, как это сделать частью кода.

Super_indian_coder
Offline
Зарегистрирован: 26.03.2021

rkit пишет:

Сколько это циклов займет придется измерить

for(volatile int i = 0; i < x; i++) {}

Не будет ли проблем с дополнительной задержкой при таком синтаксисе?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Так можно прямо кусок из функции delayMicroseconds взять

1uint32_t n = usec * (VARIANT_MCK / 3000000);
2   
3asm volatile(
4        "L_%=_delayMicroseconds:"       "\n\t"
5        "subs   %0, #1"                 "\n\t"
6        "bne    L_%=_delayMicroseconds" "\n"
7        : "+r" (n) :
8    );

Для половины микросекунды n=14

rkit
Offline
Зарегистрирован: 23.11.2016

Super_indian_coder пишет:

Не будет ли проблем с дополнительной задержкой при таком синтаксисе?

В предыдущем сообщении было "измерить не проблема". Теперь уже проблема?