Перейти к содержанию
    

Чудеса оптимизации GCC 4.3.3 WinAVR 20100110

Проект на 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Миллион раз новички в изучении языка Си наступают на эти грабли.

Переменную step_counter надо объявит со спецификатором volatile:

volatile uint8_t step_counter;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Большое спасибо! Вопрос решен. На Сях, вернее С++ - для PC. А контроллеры в основном программирую в асме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Миллион раз новички в изучении языка Си наступают на эти грабли.

И одно только слово твердил:

volatile,

volatile,

volatile...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Судя по тому, что этот вопрос находится под номером 1 в avr-libc FAQ, твердят многие и постоянно, но безрезультативно :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...