Questa domanda è correlata alla deprogrammazione AVR stessa .
Informazioni sul progetto:
abbiamo un prodotto alimentato a batteria che utilizza un ATMEGA644P. L'applicazione funziona in modo permanente in modalità sospensione e si riattiva solo una volta al secondo (RTC) o quando viene attivata una delle due linee di interruzione esterne.
Il dispositivo dispone di un caricatore di avvio piuttosto semplice che sta comunicando tramite UART (utilizzando l'interfaccia IC RS232). Serve solo come metodo pratico per aggiornare il firmware in modo che non sia necessario alcun programmatore ISP hardware. (Il bootloader si aspetta telegrammi di checksum protetti)
I dispositivi sono stati progettati con brown-out interno DISABILITATO perché raddoppia il consumo energetico e la lunga durata della batteria è obbligatoria (immagino che avrebbe dovuto essere utilizzato un rilevamento brown-out esterno - è in corso una riprogettazione).
Problema:
ogni pochi mesi un dispositivo smette di funzionare, NON sono stati eseguiti aggiornamenti del firmware su tali dispositivi. Tuttavia, dopo un ulteriore esame, il contenuto flash di tali dispositivi sembra essere danneggiato. Inoltre, le batterie di alcuni di questi dispositivi erano ancora buone, ma non voglio escludere una sorta di situazione di sottotensione.
Questo è un confronto tra il contenuto flash originale (a sinistra) e il contenuto danneggiato (a destra):
Alcune osservazioni:
- Un blocco danneggiato è sempre costituito da almeno una pagina flash (256 byte) ed è allineato alla pagina. In altre parole: sono interessate solo le pagine intere, non i singoli byte.
- Il contenuto danneggiato legge 0xFF per la maggior parte del tempo, ma può anche contenere alcuni altri valori o essere completamente "casuale".
- La piccola barra sul lato sinistro dell'immagine mostra tutte le aree interessate. Per questo dispositivo, è circa un decimo del contenuto totale del flash.
- Avevamo un dispositivo in cui era interessata solo una singola pagina.
È assolutamente plausibile che una condizione di sottotensione durante la scrittura della memoria flash possa danneggiare i contenuti flash. Tuttavia, ciò significherebbe che alcune istruzioni sensibili al flash devono essere eseguite.
Forse il controller si riavvia in modo casuale a causa di sottotensione e il codice del caricatore di avvio agisce in modo completamente imprevedibile durante questo periodo. Per citare un ragazzo di un altro forum in merito alla sottotensione:
"Non si tratta solo di istruzioni casuali dall'esecuzione di Flash, ma di un periodo di istruzioni casuali (non vi è alcuna garanzia che il codice da Flash venga letto e interpretato correttamente). Insieme a queste altre parti del MCU potrebbe non comportarsi come previsto, compresa la protezione meccanismi ".
Domande:
ritieni che il "comportamento casuale durante la sottotensione e l'esecuzione di alcune istruzioni che modificano i dati nelle pagine flash" - la spiegazione sia valida? In tal caso, perché non vediamo sempre questo tipo di errori solo come causa di alcuni problemi del software (overflow dello stack, puntatori non validi).
Hai altre idee su cosa potrebbe causare questo tipo di corruzione? Questo potrebbe essere causato da EMI / ESD?