что делает этот код на асм? не силен в асм

MacSim
Offline
Зарегистрирован: 28.11.2012

функция

{
  uint8_t tmp=0;

  asm volatile("sbiw    %0, 0x01 \n\t"
    "ldi %1, 0xFF \n\t"
    "cpi %A0, 0xFF \n\t"
    "cpc %B0, %1 \n\t"
    "brne .-10 \n\t"
    : "+r" (delay), "+a" (tmp)
    : "0" (delay)
    );
}

пожалуйста прокоментируйте

MacSim
Offline
Зарегистрирован: 28.11.2012

и чтоб тем не плодить...

for (byte mask = 0x01; mask; mask <<= 1){}

шаг1 mask=1(bin), шаг2 mask=11(bin).....

проверяется значение до какого? я привык указывать: for (byte mask = 0x01; mask<254; mask <<= 1)

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

ГуруСИ не серчайте за детские вопросы. объясните.

По асм: не написал вверху

inline void SoftwareSerial::tunedDelay(uint16_t delay) {
  uint8_t tmp=0;
 

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

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012
В либе, которая у меня эта функция выглядит так:
 
/* static */ 
inline void SoftwareSerial::tunedDelay(uint16_t delay) { 
  _delay_loop_2(delay);
}

 

Функция _delay_loop_2 стандартная, описание здесь: http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__util__delay__basic_1ga74a94fec42bac9f1ff31fd443d419a6a.html
 
Другой вопрос, зачем Вам нужна внутренняя private функция задержки, впрочем это не интересно.

 

MacSim пишет:

for (byte mask = 0x01; mask; mask <<= 1){}

шаг1 mask=1(bin), шаг2 mask=11(bin).....

"шаг1 mask=1(bin), шаг2 mask=11(bin)....." - вот это откуда взято? Придумано или как?

В цикле for, первый параметр - инициализация (однократно), второй параметр - проверка условия окончания цикла, третий - то, что выполняется после выполнения одного шага.

Здесь проверка конца цикла такая, что пока mask не равен 0, цикл продолжается. Цикл повторяется 8 раз, потому что шаг1: mask = 0x01, шаг2: mask = 0x02, шаг 3: mask = 0x04 и т.п. пока при очередном сдвиге mask обнулится, потому что ((byte)0x80) << 1 == 0x00.

 

MacSim
Offline
Зарегистрирован: 28.11.2012

спасибо. сам не придумывал. все из SoftwareSerial.ccp

у меня, видимо, отличается от вашей. в функции wright вывод 8бит в цикле так задан.

оператор цикла for понимал, но так в голову не пришло. век учись. теперь понял: делать пока true, 0-false.

а только ли 0 даст стоп или -1, -2 тоже?

а функция интереснатем стала, что она при запрете прерываний выполняется, в отличии от delay(ms), которая к таймеру привязана. как я понимаю внутри _delay_loop_2(delay)практически тоже самое.

шаг1 mask=1(bin), шаг2 mask=11(bin).....'это мои рассуждения, наверное нодо было так b00000001,b00000011,b00000111 и понял неверные, b00000001,b00000010,b00000100

 

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Во втором параметре проверяется логическое условие, в данном примере mask, что интерпретируется как mask != 0. А равны ли отрицательные числа нулю, думаю объяснять не нужно.