Mam zaadeklarowana w programie zmienna: uint16_t ee_delay_period __attribute__ ((section(".eeprom"))) = 0x3000;
Potem mam taka linijke: _delay_loop_2( eeprom_read_word( adres_ale_jak ) );
Jak podac argument dla ``eeprom_read_word'' prawidlowo, aby wskazywal na ``ee_delay_period'' dokladnie tak, jak zostala ona wlozona przez linker (czy inne ustrojstwo). Raczej zakladam, ze nie wiadomo w momencie kompilacji, jaki jest jej adres, bo mogly pojawic sie inne zmienne wczesniej, albo cos zostalo zoptymalizowane... A moze jest sposob, aby z eepromu wartosc zostala zmirorrowana w ramie podczas inicjalizacji. Zaznaczam, ze chodzi mi o ktorys blok wykonany przed ``main()'', a wsadzany przez kompiulator automatycznie (jesli cos takiego istnieje).
No wlasnie o to chodzi, ze tak nie pojdzie... Ponizej zamieszczam fragment kodu w C i to co wygenerowal GCC. Zaznaczylem miejsce wywolania ``eeprom_read_word'' i przekazany parametr nijak ma sie do adresu 0x10 (taki specjalnie zadeklarowalem, zeby byl nadany dla tej zmiennej w EEPROM-ie).
No ale jak zadeklarowa³e¶ aby ta zmienna by³a pod adresem 0x10? Podziel sie wiedz± >:->
Widzê, ¿e chyba mylisz warto¶æ w EEPROM-ie z adresem w EEPROM-ie. Deklaracja w Twoim programie mówi o pocz±tkowej warto¶ci zmiennej, anie o jej adresie - wszystko zgodnie ze standardem jêzyka C.
Mo¿e nie zauwa¿y³e¶, ale kompilator prawid³owo wygenerowa³ kod, bo Twoja zmienna jest pod adresem 0 i taki adres przekaza³ do funkcji eeprom_read_word.
BTW> staraj siê nie umieszczac danych w EEPROM-ie AVR-a pod adresem 0.
void init_system( void ) { /* Timer #1 PWM Mode Setup */ outb( TCCR1A, (1 > testach zawsze jest podejrzane, bo ciezko jest stwierdzic co tak na prawde
Mysle, ze jednak dobrze rozumuje... Zwlaszcza jak popatrzysz na asma, to jest to logiczne. Do rejestrow r25:r24 lokuje sie adres komorki EEPROM, ktora chce sie odczytac i wywoluje procedure odczytu. Przytocze ja rowniez, aby bylo jasniej. To jest oczywiscie kod wygenerowany przez kompilator!
0000009a : 9a: e1 99 sbic 0x1c, 1 ; 28 9c: fe cf rjmp .-4 ; 0x9a 9e: 9f bb out 0x1f, r25 ; 31 a0: 8e bb out 0x1e, r24 ; 30 a2: e0 9a sbi 0x1c, 0 ; 28 a4: 01 96 adiw r24, 0x01 ; 1 a6: 0d b2 in r0, 0x1d ; 29 a8: 9f bb out 0x1f, r25 ; 31 aa: 8e bb out 0x1e, r24 ; 30 ac: e0 9a sbi 0x1c, 0 ; 28 ae: 80 2d mov r24, r0 b0: 9d b3 in r25, 0x1d ; 29 b2: 08 95 ret
Wlasnie, ze jest pod adresem 0x10. Chyba, ze jestem slepy... Wtedy prosze mi wybaczyc ;-) Przytaczam kod do EEPROM-a:
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.