Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: avr-gcc генерируемый код
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Androliz
исходный код:

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 проблемы ?
Палыч
Возможно, CSFlag нигде не используется, поэтому выполнение присваивания пустая трата времени вне зависимости от условия -транслятор оптимизировал так. Возможно, поможет спецификатор volatile для CSFlag.
defunct
Цитата
while (1) { if((PINB & (1 << PB2)) != 0) {CSFlag = NEWCMD;}}; //бесконечный цикл

Стиль - "Упопабыласобакаонеелюбилонасъелакусокмясаонееубил"

Как уже отметили выше, если CSFlag нигде более не используется, то оптимизатор сраведливо все выбрасывает.. Если используется в прерывании - то объявите CSFlag как volatile.
oran-be
Любой нормальный компилер выбросит такой код, а уж же-си-си так и подавно. Для того, стобы код сработал, нада CSFlag объявить, как volatile. Этот опрератор очень полезный, в особенности, если некая глобальная переменная используется в функции прерывания.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.