Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Чудеса оптимизации GCC 4.3.3 WinAVR 20100110
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Barmaley13
Проект на 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
neiver
Миллион раз новички в изучении языка Си наступают на эти грабли.
Переменную step_counter надо объявит со спецификатором volatile:
Код
volatile uint8_t step_counter;
Barmaley13
Большое спасибо! Вопрос решен. На Сях, вернее С++ - для PC. А контроллеры в основном программирую в асме.
MrYuran
Цитата(neiver @ Nov 17 2010, 13:12) *
Миллион раз новички в изучении языка Си наступают на эти грабли.

И одно только слово твердил:
volatile,
volatile,
volatile...
ReAl
Судя по тому, что этот вопрос находится под номером 1 в avr-libc FAQ, твердят многие и постоянно, но безрезультативно :-)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.