Проект на ATMega8.
Имеем часть кода:
Код
CW=1;
START_M;
step_counter=0;
while(step_counter<100)
{
wdt_reset();
}
wdt_reset();
home();
sound();
Эта часть выполняется в основном теле программы. Переменная step_counter инкрементируется в прерывании Таймера1. Тупо нужно подождать, пока её значение не достигнет 100.
С отключенной оптимизацией (-O0) как-бы все нормально:
Код
93: CW=1;
LDI R24,0x01 Load immediate
LDI R25,0x00 Load immediate
STS 0x0061,R25 Store direct to data space
STS 0x0060,R24 Store direct to data space
94: START_M;
LDI R24,0x4E Load immediate
LDI R25,0x00 Load immediate
LDI R18,0x0D Load immediate
MOVW R30,R24 Copy register pair
STD Z+0,R18 Store indirect with displacement
95: step_counter=0;
STS 0x006B,R1 Store direct to data space
STS 0x006A,R1 Store direct to data space
96: while(step_counter<1)
RJMP PC+0x0002 Relative jump
98: wdt_reset();
WDR Watchdog reset
96: while(step_counter<1)
LDS R24,0x006A Load direct from data space
LDS R25,0x006B Load direct from data space
SBIW R24,0x00 Subtract immediate from word
BREQ PC-0x06 Branch if equal
100: wdt_reset();
WDR Watchdog reset
101: home();
RCALL PC+0x0286 Relative call subroutine
102: sound();
RCALL PC+0x03B5 Relative call subroutine
+000000B2: E080 LDI R24,0x00 Load immediate
+000000B3: E090 LDI R25,0x00 Load immediate
+000000B4: E4A8 LDI R26,0x48 Load immediate
А вот при включении опции оптимизации (-O1...Os) наблюдаем следующее:
Код
93: CW=1;
LDI R24,0x01 Load immediate
LDI R25,0x00 Load immediate
STS 0x0061,R25 Store direct to data space
STS 0x0060,R24 Store direct to data space
94: START_M;
LDI R24,0x0D Load immediate
STD Z+0,R24 Store indirect with displacement
95: step_counter=0;
STS 0x0063,R1 Store direct to data space
STS 0x0062,R1 Store direct to data space
98: wdt_reset();
WDR Watchdog reset
RJMP PC-0x0001 Relative jump
98: wdt_reset();
CLI Global Interrupt Disable
RJMP PC-0x0000 Relative jump
+0000018F: 0001 ??? Data or unknown opcode
Далее пусто (0xFFFF).
Контроллер увисает на сбросе пса. А остального кода как-бы и нету!!! И, как видно, переменная step_counter не проверяется.
Проект не критичен, поэтому стал заморачиваться на С. Можно и без оптимизации. Но все-таки интересно, ГДЕ ЖЕ ОСТАЛЬНОЙ КОД???
Да, еще вот:
Код
avr-gcc -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=4000000UL -O0 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT UV.o -MF dep/UV.o.d -c ../UV.c
Сообщение отредактировал Barmaley13 - Nov 17 2010, 09:47