Юрий_СВ (18.07.2013 17:10, просмотров: 10287)
Почему-то строка "rpm=1000000/rpm;" "помогает" выйти из цикла do/while. (WinAVR 2010 под AVR Studio). Никто не подскажет почему ? Если указанную строчку исключить - последний оператор (вывод на экран) работает, иначе - нет.
Текст после цикла выполняется нормально в любом случае.
Сам цикл :
do
{
u32_t tacho_period;
u16_t rpm;
u8_t  tacho_pure_val;
asm volatile("cli\n\t"::); // 
tacho_period=tacho.period;
tacho_pure_val=tacho.pure_val;
asm volatile("sei\n\t"::); // 
tacho_period>>=2; // 
rpm=tacho_period;
rpm=1000000/rpm;
rpm*=60; // 
printExtNum(rpm,     4);
} while(0);
Ассемблер:
183:      rpm=1000000/rpm;
+00000327:   E072        LDI       R23,0x02       Load immediate
+00000328:   9556        LSR       R21            Logical shift right
+00000329:   9547        ROR       R20            Rotate right through carry
+0000032A:   9537        ROR       R19            Rotate right through carry
+0000032B:   9527        ROR       R18            Rotate right through carry
+0000032C:   957A        DEC       R23            Decrement
+0000032D:   F7D1        BRNE      PC-0x05        Branch if not equal
+0000032E:   E040        LDI       R20,0x00       Load immediate
+0000032F:   E050        LDI       R21,0x00       Load immediate
+00000330:   E460        LDI       R22,0x40       Load immediate
+00000331:   E472        LDI       R23,0x42       Load immediate
+00000332:   E08F        LDI       R24,0x0F       Load immediate
+00000333:   E090        LDI       R25,0x00       Load immediate
+00000334:   D50C        RCALL     PC+0x050D      Relative call subroutine
+00000335:   01C9        MOVW      R24,R18        Copy register pair