EEPROM — persistent data¶
Læringsmål
Forstå hvorfor EEPROM skiller seg fra SRAM og Flash, bruk EEPROM-grensesnittet i ATmega1284P fra Assembly og C, og verifiser en deterministisk write/readback i simulator.
Forutsetninger
Du bør forstå AVR-minneområder, registre, polling og grunnleggende funksjonskall.
EEPROM er ikke-flyktig minne: i motsetning til SRAM er innholdet ment å overleve at strømmen forsvinner. Det passer for små mengder persistent tilstand som konfigurasjon, kalibreringsverdier og tellere. EEPROM erstatter ikke vanlig RAM: skriving er tregere og minnet har begrenset write endurance.
Tre AVR-minneområder¶
Hold rollene adskilt:
- Flash lagrer programkode og konstanter.
- SRAM lagrer vanlige runtime-variabler og stack.
- EEPROM lagrer data som skal kunne bestå uavhengig av vanlig programkjøring.
EEPROM har sin egen adresse-, data- og kontrollmekanisme. En numerisk EEPROM-adresse er derfor ikke en SRAM-peker arkitekturmessig, selv om avr-libc tilbyr et praktisk pointer-formet API.
Det parede eksemplet¶
EduAVR bruker samme deterministiske transaksjon i C og Assembly:
- velg EEPROM-adresse
0x12; - skriv verdien
0x5a; - vent til skrivingen er ferdig;
- les adresse
0x12; - lagre den leste verdien i SRAM;
- stopp ved det stabile kvalifikasjonspunktet
eeprom_ready.
Den enkle transaksjonen gjør det lett å sammenligne implementasjonene og simulatorbeviset.
C-implementasjonen¶
C-eksemplet bruker EEPROM-API-et i avr-libc:
uint8_t *address = (uint8_t *)0x12;
eeprom_write_byte(address, 0x5a);
eeprom_busy_wait();
value = eeprom_read_byte(address);
Ikke stopp ved bibliotekskallet. Disassembler ELF-filen og finn registeroperasjonene som bibliotekimplementasjonen genererer eller kaller.
Assembly-implementasjonen¶
Assembly-versjonen viser maskinvaresekvensen direkte. Følg EEARL/EEARH for adresse, EEDR for data og EECR for kontroll/status.
Ved skriving kan du se den beskyttede write-enable-sekvensen: firmware setter master write-enable før selve EEPROM-skrivingen startes. Den venter også dersom en tidligere eller pågående skriving ikke er ferdig.
Ved lesing velger firmware adressen, starter EEPROM-lesingen og kopierer EEDR til SRAM.
Under panseret¶
Sammenlign C- og Assembly-ELF-ene med avr-objdump. Finn ut:
- hvilke instruksjoner som flytter adresse og data;
- hvor firmware venter på EEPROM;
- hva avr-libc skjuler;
- hvorfor observerbare SRAM-variabler er nyttige i en debuggerdrevet test.
Prøv selv¶
Bygg og disassembler de parede eksemplene:
Kjør deretter hele Q1-suiten:
Forventet resultat
Begge implementasjonene skriver 0x5a til EEPROM-adresse 0x12 og leser 0x5a tilbake i simavr-modellen.
Kvalifikasjon¶
Q0 bygger og disassemblerer begge implementasjonene.
Q1 kjører begge firmwarevariantene i simavr, stopper ved eeprom_ready og krever at observert adresse, skrevet verdi og lest verdi er 0x12, 0x5a og 0x5a.
Q1 beviser den modellerte firmwaretransaksjonen. Q2 kreves fortsatt for fysiske påstander som persistens gjennom faktisk strømbrudd, endurance, oppførsel ved ulike forsyningsspenninger og programmeringsforhold.
Sjekk forståelsen¶
- Hvorfor er EEPROM nyttig når SRAM allerede finnes?
- Hvorfor bør variabler som endres ofte normalt ligge i SRAM?
- Hvilke roller har EEAR, EEDR og EECR?
- Hvorfor må firmware vente på at en EEPROM-skriving blir ferdig?
- Hva beviser Q1-readback, og hva beviser den ikke?
Neste
Neste M5-emne er ADC. EEPROM gir oss først deterministisk persistent-data-oppførsel; ADC introduserer grensen mellom digital firmware og et analogt fysisk signal.