Ecco alcuni pensieri e idee:
Usa la ROM in modo più creativo.
Conserva tutto ciò che puoi nella ROM. Invece di calcolare le cose, archivia le tabelle di ricerca nella ROM. (Assicurati che il compilatore stia inviando le tue tabelle di ricerca alla sezione di sola lettura! Stampa gli indirizzi di memoria in fase di esecuzione per controllare!) Memorizza la tua tabella di vettore di interrupt nella ROM. Ovviamente, esegui alcuni test per vedere quanto è affidabile la tua ROM rispetto alla tua RAM.
Usa la tua RAM migliore per lo stack.
Le SEU nello stack sono probabilmente la fonte più probabile di arresti anomali, perché è dove vivono in genere cose come variabili di indice, variabili di stato, indirizzi di ritorno e puntatori di vario genere.
Implementare routine timer-tick e watchdog timer.
È possibile eseguire una routine di "controllo di integrità" ad ogni tick del timer, nonché una routine di controllo per gestire il blocco del sistema. Il codice principale potrebbe inoltre incrementare periodicamente un contatore per indicare l'avanzamento e la routine di controllo di integrità potrebbe garantire che ciò si sia verificato.
Implementare i codici di correzione degli errori nel software.
È possibile aggiungere ridondanza ai dati per poter rilevare e / o correggere errori. Ciò aumenterà i tempi di elaborazione, lasciando potenzialmente il processore esposto alle radiazioni per un tempo più lungo, aumentando così la possibilità di errori, quindi è necessario considerare il compromesso.
Ricorda le cache.
Controlla le dimensioni della cache della CPU. I dati a cui hai avuto accesso o modificato di recente saranno probabilmente all'interno di una cache. Credo che puoi disabilitare almeno alcune delle cache (a un costo elevato per le prestazioni); dovresti provare questo per vedere quanto sono sensibili le cache alle SEU. Se le cache sono più difficili della RAM, è possibile leggere e riscrivere regolarmente i dati critici per assicurarsi che rimangano nella cache e riportare la RAM in linea.
Usa i gestori di errori di pagina in modo intelligente.
Se si contrassegna una pagina di memoria come non presente, la CPU genererà un errore di pagina quando si tenta di accedervi. È possibile creare un gestore degli errori di pagina che esegue alcuni controlli prima di eseguire la manutenzione della richiesta di lettura. (I sistemi operativi per PC lo utilizzano per caricare in modo trasparente pagine che sono state scambiate su disco.)
Usa il linguaggio assembly per le cose critiche (che potrebbero essere tutto).
Con il linguaggio assembly, sai cosa c'è nei registri e cosa c'è nella RAM; si sa cosa tavoli speciali RAM CPU sta usando, e si può progettare le cose in un modo indiretto per mantenere il rischio verso il basso.
Utilizzalo objdump
per esaminare effettivamente il linguaggio assembly generato e capire quanto codice occupa ciascuna delle tue routine.
Se stai usando un grande sistema operativo come Linux, allora stai chiedendo problemi; c'è così tanta complessità e tante cose che vanno male.
Ricorda che è un gioco di probabilità.
Ha detto un commentatore
Ogni routine che scrivi per rilevare errori sarà soggetta al fallimento stesso della stessa causa.
Sebbene ciò sia vero, le possibilità di errori nei (diciamo) 100 byte di codice e dati richiesti per il corretto funzionamento di una routine di controllo sono molto inferiori rispetto alla possibilità di errori altrove. Se la tua ROM è abbastanza affidabile e quasi tutto il codice / dati è effettivamente nella ROM, allora le tue probabilità sono ancora migliori.
Usa hardware ridondante.
Utilizzare 2 o più configurazioni hardware identiche con codice identico. Se i risultati differiscono, è necessario attivare un ripristino. Con 3 o più dispositivi è possibile utilizzare un sistema di "voto" per provare a identificare quale è stato compromesso.