что делает этот код на асм? не силен в асм
- Войдите на сайт для отправки комментариев
Пт, 15/01/2016 - 12:08
функция
{
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)
);
}
пожалуйста прокоментируйте
и чтоб тем не плодить...
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 (передаются милисикунды) то в чем указавать тут? в тактах мк? похоже эта функция задерки.
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.
спасибо. сам не придумывал. все из
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
Во втором параметре проверяется логическое условие, в данном примере mask, что интерпретируется как mask != 0. А равны ли отрицательные числа нулю, думаю объяснять не нужно.