redLed ha scritto:Questo é possibile in quanto tutti gli Atmega presenti in Arduino sono basati sull'architettura Harvard che, a differenza di quella di Newman dei classici PC, prevede una separazione fra la memoria del sistema operativo (eeprom), la memoria impiegata dal programma utente (la Flash) e la memoria per la gestione delle variabili dei dati, che é contenuta nella SRAM del microcontrollore, memoria volatile che permette un numero di scritture praticamente infinito.
Come ho già scritto più volte, non conosco in dettaglio il mondo Arduino, ma da decenni lavoro coi microcontroller (da 6 a 144 pin) e relativi firmware.
Il fatto che gli ATMega adottino l'architettura Harvard, e non la classica architettura Von Neumann, ha poco a che fare con l'impiego pratico delle risorse di memoria.
L'architettura Harvard prevede la separazione totale fra lo spazio delle istruzioni e lo spazio dei dati. E' una "furbata" che permette di svolgere più operazioni per ogni impulso di clock, a patto di accettare due percorsi elettrici distinti verso una memoria che conservi le istruzioni, e un'altra memoria che conservi i dati.
L'alrchitettura Von Neumann prevede che istruzioni e dati possano coesistere in un singolo spazio comune: lo svantaggio e che ogni operazione possa richiedere almeno due "cloccate" (una per il fetch dell'istruzione e una per il fetch dei dati); il vantaggio è che il micro adotti un solo percorso elettrico verso un solo spazio di memoria.
Anche non conoscendo i dettagli dell'implementazione Arduino, dubito che il "sistema operativo" (ammesso che esista) si trovi in uno spazio eeprom. Se i cosiddetti sketch diventano una sorta di "byte code" in stile Java, e quindi vengono interpretati, ci dev'essere un interprete residente nella flash. Se invece gli sketch vengono compilati in un oggetto nativo, a maggior ragione dovranno finire in flash, poiché la serie ATMega, proprio perché in architettura Harvard, non può eseguire da uno spazio dati (assumo che la flash sia lo spazio di programma, e la eeprom, insieme alla SRAM, siano lo spazio dati).
Anche se non è impossibile scrivere in flash durante l'esecuzione, di solito risulta più agevole e conveniente scrivere in eeprom, sia perché questa ha un limite di stress dieci volte maggiore della flash (100000 invece di 10000 cicli), sia perché è accessibile a byte e non previa cancellazione di un'intera pagina.
Infine, come nota personale, vorrei aggiungere che Arduino è una bellissima idea, una bellissima risorsa, un ottimo ausilio per avvicinarsi al mondo dei microcontroller, ma non è la Bibbia e non è la pietra di paragone verso cui confrontare tutto il resto.
redLed ha scritto:Si potrebbe indirizzare i dati anche nella flash ma questa, stando alle fonti ufficiali, é garantita solo fino a 10.000 scritture e quindi meglio essere parsimoniosi. Piuttosto semmai conviene utilizzare una memoria esterna gestita via bus con I2C.
Se proprio vuoi dormire tranquillo e non mettere limiti alla scrittura su memoria non volatile, usa una FRAM, che in teoria, anche aggiornando i dati una volta al secondo, dura più della vita biologica del proprietario / programmatore.
Se sbagli perché non sai, commetti un errore. Se sbagli perché non vuoi sapere, ne commetti due.