реклама на сайте
подробности

 
 
> Чудеса оптимизации GCC 4.3.3 WinAVR 20100110, При включении оптимизации не компилируется часть кода
Barmaley13
сообщение Nov 17 2010, 09:43
Сообщение #1





Группа: Участник
Сообщений: 10
Регистрация: 10-10-05
Пользователь №: 9 428



Проект на 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
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01414 секунд с 7
ELECTRONIX ©2004-2016