_delay_us где-то работает...где-то - нет!

Joiner
Offline
Зарегистрирован: 04.09.2014

Вот кусочек кода

for(int i=0; i<Dist_Acceleration; i++)
        {
        Start_Speed=Start_Speed-accelerationByStep;
        PORTB |= (1<<STEP_PIN);
        delayMicroseconds(IMPULS_TIME);//и ждем длительность импульса и по истечении
        PORTB &= ~(1<<STEP_PIN);
        delayMicroseconds(Start_Speed);//Выдерживаем паузу между импульсами
        }

Если delayMicroseconds заменить на _delay_us, то в одной строке это работает, а во второй нет. Компилятор выдает ошибку.

IMPULS_TIME это целое число, которое задано дифайном,  а Start_Speed это целое число, которое вычисляется программой до применения в цикле.

Компилятор что-то объясняет, но я его не понимаю..... Подскажите, плиз.

Joiner
Offline
Зарегистрирован: 04.09.2014

Неправильно написал. Надо так :

MPULS_TIME это целое число, которое задано дифайном,  а Start_Speed это целое число, которое вычисляется по ходу цикла. Но также не работает, и если Start_Speed вычислено до исполнения цикла, и в ходе цикла не изменяется.

А вот чего говорит компилятор:

Изменена опция сборки, пересобираем все
 
C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=attiny13 -DF_CPU=1200000L -DARDUINO=10605 -DARDUINO_AVR_ATTINY13C -DARDUINO_ARCH_AVR -IC:\Users\Sergey\Documents\Arduino\hardware\attiny13\avr\cores\core13 C:\Users\Sergey\AppData\Local\Temp\build8077023018260215118.tmp\jure_Tinny13_final_port.cpp -o C:\Users\Sergey\AppData\Local\Temp\build8077023018260215118.tmp\jure_Tinny13_final_port.cpp.o 
 
In file included from jure_Tinny13_final_port.ino:7:0:
c:\program files (x86)\arduino\hardware\tools\avr\avr\include\util\delay.h: In function 'void Move()':
c:\program files (x86)\arduino\hardware\tools\avr\avr\include\util\delay.h:245:40: error: __builtin_avr_delay_cycles expects a compile time integer constant
  __builtin_avr_delay_cycles(__ticks_dc);
                                        ^
Ошибка компиляции.
 
Все это написано для Attiny13/

 

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

_delay_us требует константу для рассчета задержки при компиляции. То есть, туда должно быть подставлено число заранее. До компиляции, а не в процессе выполнения программы.

https://myrobot.ru/forum/topic.php?forum=2&topic=511&postid=1355862983#1...

Joiner
Offline
Зарегистрирован: 04.09.2014

Jeka_M, спасибо!  

А нахрена тогда нужен этот  _delay_us, который имеет такие ограничения, когда есть  delayMicroseconds, который этих ограничений не имеет? 

b707
Offline
Зарегистрирован: 26.05.2017

Joiner пишет:

 

А нахрена тогда нужен этот  _delay_us, который имеет такие ограничения, когда есть  delayMicroseconds, который этих ограничений не имеет? 

подозреваю, что памяти они занимают сильно по разному

Joiner
Offline
Зарегистрирован: 04.09.2014

Ок, проверю. Спасибо.

P.S. По быстренькому проверил.

В исходной программе используется delayMicroseconds. Результат компиляции 584 байта (57%).

В трех строках заменил delayMicroseconds на _delay_ms. Результат -  602 байт (58%).

sadman41
Offline
Зарегистрирован: 19.10.2016

delayMicroseconds надо менять на _delay_us, IMHO

Joiner
Offline
Зарегистрирован: 04.09.2014

Ой, затупил немного. Но, теперь при замене результат остается без изменений,  584 байта в первом случае, и 584 байта во втором.

 

b707
Offline
Зарегистрирован: 26.05.2017

Joiner пишет:

Ой, затупил немного. Но, теперь при замене результат остается без изменений,  584 байта в первом случае, и 584 байта во втором.

 

ну значит оптимизация работает :)