Юрий_СВ (18.07.2013 17:10, просмотров: 9419)
Почему-то строка "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