Felaktig variabeldeklaration = nära katastrof! (AVR)
Postat: 23 mars 2012, 14:01:54
Jag har haft ett projekt ganska länge, när jag råkade upptäcka att en variabel som skulle ligga i eeprom istället hamnade i SRAM. Eftersom jag bara använde pekare till variabeln i eeprom läs och skriv -funktionerna så innebar det att jag skrev över data på fel ställe i eepromet! Hur gick detta till då? Jo kolla här:
Här ser vi att jag vill spara en variabel i eeprom. Men vad händer?
Jag kollar i filen projekt.map:
ee_hardware saknas i listan!
och jag hittar den inte alls i map-filen....
Det visar sig att jag råkat skriva i fel ordning:
skall vara:
Konstigt att ingen varning eller något liknande uppstod!
När jag kör simulatorn hittar jag den i SRAM på adress 0x0136.
I verkligheten (processorn) hade den hamnat i eeprom på adress 0x136.
Det fungerar alltså som tänkt - data lagras i eeprom och jag kan återkalla det när jag startar om på nytt.
Men detta är mycket förrädiskt! Tänk om något annat hade legat på just den adressen i eeprom?
Då hade de skrivit över varandra och mycket märkliga fel hade kunnat uppstå!
Kod: Markera allt
struct settings { ... bla bla.. };
struct klocka { ... bla bla.. };
struct hw_setup { ... bla bla.. };
// SRAM data - globala variabler
struct settings set = { 0 };
struct klocka clock = { 0 };
struct hw_setup hardware = { 0 }
// EEPROM data
struct settings EEMEM ee_set = { 0 };
struct klocka EEMEM ee_clock = { 0 };
struct EEMEM hw_setup ee_hardware = { 0 };
eeprom_write_word(&ee_hardware.modules, hardware.modules);
Jag kollar i filen projekt.map:
Kod: Markera allt
.eeprom 0x00810000 0x2b8 main.o
0x00810000 ee_reset_count
0x00810002 ee_set
0x00810030 ee_clock
0x0081003d ee_vald_profil
0x0081003e ee_profilnamn
0x008100b6 ee_profiler
... etc.

och jag hittar den inte alls i map-filen....

Det visar sig att jag råkat skriva i fel ordning:
Kod: Markera allt
struct EEMEM hw_setup ee_hardware = { 0 };
Kod: Markera allt
struct hw_setup EEMEM ee_hardware = { 0 };
När jag kör simulatorn hittar jag den i SRAM på adress 0x0136.
I verkligheten (processorn) hade den hamnat i eeprom på adress 0x136.
Det fungerar alltså som tänkt - data lagras i eeprom och jag kan återkalla det när jag startar om på nytt.
Men detta är mycket förrädiskt! Tänk om något annat hade legat på just den adressen i eeprom?
Då hade de skrivit över varandra och mycket märkliga fel hade kunnat uppstå!