Barmaley13 0 17 ноября, 2010 Опубликовано 17 ноября, 2010 (изменено) · Жалоба Проект на 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 Изменено 17 ноября, 2010 пользователем Barmaley13 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
neiver 0 17 ноября, 2010 Опубликовано 17 ноября, 2010 · Жалоба Миллион раз новички в изучении языка Си наступают на эти грабли. Переменную step_counter надо объявит со спецификатором volatile: volatile uint8_t step_counter; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Barmaley13 0 17 ноября, 2010 Опубликовано 17 ноября, 2010 · Жалоба Большое спасибо! Вопрос решен. На Сях, вернее С++ - для PC. А контроллеры в основном программирую в асме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 17 17 ноября, 2010 Опубликовано 17 ноября, 2010 · Жалоба Миллион раз новички в изучении языка Си наступают на эти грабли. И одно только слово твердил: volatile, volatile, volatile... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 17 ноября, 2010 Опубликовано 17 ноября, 2010 · Жалоба Судя по тому, что этот вопрос находится под номером 1 в avr-libc FAQ, твердят многие и постоянно, но безрезультативно :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться