исходный код:
int main(void) { Init(); //инициализация sei(); //глобальное разрешение прерываний while (1) { if((PINB & (1 << PB2)) != 0) {CSFlag = NEWCMD;}}; //бесконечный цикл return 0; //досюда вообще никогда не доходим }
ассемблерный код генерируемый avr - gcc (winavr - 20070525)при уровне оптимизации 0 (нету оптимизации) просматривал в AS 4.13 sp1 через файл ".elf ":
@000002F2: main 231: { +000002F2: 93CF PUSH R28 Push register on stack +000002F3: 93DF PUSH R29 Push register on stack +000002F4: B7CD IN R28,0x3D In from I/O location +000002F5: B7DE IN R29,0x3E In from I/O location 232: Init(); +000002F6: DD4F RCALL PC-0x02B0 Relative call subroutine 233: sei(); +000002F7: 9478 SEI Global Interrupt Enable +000002F8: C000 RJMP PC+0x0001 Relative jump 234: while (1) { if((PINB & (1 << PB2)) != 0) {CSFlag = NEWCMD;}}; +000002F9: E2E3 LDI R30,0x23 Load immediate +000002FA: E0F0 LDI R31,0x00 Load immediate +000002FB: 8180 LDD R24,Z+0 Load indirect with displacement +000002FC: 2799 CLR R25 Clear Register +000002FD: 7084 ANDI R24,0x04 Logical AND with immediate +000002FE: 7090 ANDI R25,0x00 Logical AND with immediate +000002FF: 9700 SBIW R24,0x00 Subtract immediate from word +00000300: F3C1 BREQ PC-0x07 Branch if equal +00000301: E081 LDI R24,0x01 Load immediate +00000302: 93800109 STS 0x0109,R24 Store direct to data space +00000304: CFF4 RJMP PC-0x000B Relative jump +00000305: CFFF RJMP PC-0x0000 Relative jump +00000306: FFFF ??? Data or unknown opcode +00000307: FFFF ??? Data or unknown opcode+00000308: FFFF ??? Data or unknown opcode +00000309: FFFF ??? Data or unknown opcode +0000030A: FFFF ???
т.е вроде бы всё нормально.
код генерируемый при уровне оптимизации s (размер)
@00000191: main 231: { +00000191: DEBD RCALL PC-0x0142 Relative call subroutine 233: sei(); +00000192: 9478 SEI Global Interrupt Enable 234: while (1) { if((PINB & (1 << PB2)) != 0) {CSFlag = NEWCMD;}}; +00000193: B183 IN R24,0x03 In from I/O location +00000194: CFFE RJMP PC-0x0001 Relative jump +00000195: CFFF RJMP PC-0x0000 Relative jump+00000196: 93FF PUSH R31 Push register on stack +00000197: C080 RJMP PC+0x0081 Relative jump +00000198: E4A5 LDI R26,0x45 Load immediate +00000199: E0B0 LDI R27,0x00 Load immediate +0000019A: E4E5 LDI R30,0x45 Load immediate +0000019B: E0F0 LDI R31,0x00 Load immediate +0000019C: 8180 LDD R24,Z+0 Load indirect with displacement +0000019D: 7F88 ANDI R24,0xF8 Logical AND with immediate +0000019E: 938C ST X,R24 Store indirect +0000019F: E082 LDI R24,0x02 Load immediate +000001A0: 93800100 STS 0x0100,R24 Store direct to data space +000001A2: C075 RJMP PC+0x0076 Relative jump +000001A3: 858B LDD R24,Y+11 Load indirect with displacement +000001A4: 93800101 STS 0x0101,R24 Store direct to data space +000001A6: 858B LDD R24,Y+11 Load indirect with displacement +000001A7: 2799 CLR R25 Clear Register +000001A8: 718F ANDI R24,0x1F Logical AND with immediate +000001A9: 7090 ANDI R25,0x00 Logical AND with immediate +000001AA: 9700 SBIW R24,0x00 Subtract immediate from word +000001AB: F0F1 BREQ PC+0x1F Branch if equal +000001AC: E081 LDI R24,0x01 Load immediate +000001AD: 93800104 STS 0x0104,R24 Store direct to data space +000001AF: E8A8 LDI R26,0x88 Load immediate +000001B0: E0B0 LDI R27,0x00 Load immediate +000001B1: 858B LDD R24,Y+11 Load indirect with displacement ---- No Source ------------------------------------------------------------------------------------ +000001B2: 2799 CLR R25 Clear Register +000001B3: 718F ANDI R24,0x1F Logical AND with immediate +000001B4: 7090 ANDI R25,0x00 Logical AND with immediate +000001B5: 5C8C SUBI R24,0xCC Subtract immediate +000001B6: 4F9F SBCI R25,0xFF Subtract immediate with carry +000001B7: 839E STD ...
то есть выполнение никогда не перевалит за 2 -ю комманду:
while (1) { if((PINB & (1 << PB2)) != 0) {CSFlag = NEWCMD;}}; +00000193: B183 IN R24,0x03 In from I/O location //это выполнится +00000194: CFFE RJMP PC-0x0001 Relative jump //бесконечный цикл - но условие то не проверяется??? Выходит, генерируется неверный код?
Или может с make проблемы ?
|