Voici quelques réflexions et idées:
Utilisez la ROM de manière plus créative.
Stockez tout ce que vous pouvez dans la ROM. Au lieu de calculer des choses, stockez les tables de recherche dans la ROM. (Assurez-vous que votre compilateur génère vos tables de recherche dans la section en lecture seule! Imprimez les adresses mémoire au moment de l'exécution pour vérifier!) Stockez votre table de vecteur d'interruption dans la ROM. Bien sûr, exécutez quelques tests pour voir la fiabilité de votre ROM par rapport à votre RAM.
Utilisez votre meilleure RAM pour la pile.
Les SEU de la pile sont probablement la source la plus probable de plantages, car c'est là que vivent généralement des éléments comme les variables d'index, les variables d'état, les adresses de retour et les pointeurs de diverses sortes.
Implémentez des routines d'horloge de minuterie et de surveillance.
Vous pouvez exécuter une routine de "vérification de l'état d'esprit" à chaque tic du minuteur, ainsi qu'une routine de surveillance pour gérer le verrouillage du système. Votre code principal peut également incrémenter périodiquement un compteur pour indiquer la progression, et la routine de vérification de l'intégrité peut garantir que cela s'est produit.
Implémentez des codes de correction d'erreur dans le logiciel.
Vous pouvez ajouter une redondance à vos données pour pouvoir détecter et / ou corriger les erreurs. Cela augmentera le temps de traitement, laissant potentiellement le processeur exposé aux rayonnements pendant plus longtemps, augmentant ainsi le risque d'erreurs, vous devez donc envisager le compromis.
N'oubliez pas les caches.
Vérifiez la taille de vos caches CPU. Les données auxquelles vous avez accédé ou modifié récemment seront probablement dans un cache. Je pense que vous pouvez désactiver au moins certains des caches (à un coût élevé de performance); vous devriez essayer ceci pour voir dans quelle mesure les caches sont sensibles aux SEU. Si les caches sont plus robustes que la RAM, vous pouvez régulièrement lire et réécrire les données critiques pour vous assurer qu'elles restent dans le cache et ramener la RAM en ligne.
Utilisez intelligemment les gestionnaires de défauts de page.
Si vous marquez une page mémoire comme non présente, le CPU émettra une erreur de page lorsque vous essayez d'y accéder. Vous pouvez créer un gestionnaire de défauts de page qui effectue une vérification avant de répondre à la demande de lecture. (Les systèmes d'exploitation PC l'utilisent pour charger de manière transparente les pages qui ont été échangées sur le disque.)
Utilisez le langage d'assemblage pour les choses critiques (qui pourraient être tout).
Avec le langage d'assemblage, vous savez ce qui est dans les registres et ce qui est dans la RAM; tu sais quelles tables RAM spéciales le processeur utilise, et vous pouvez concevoir les choses de manière détournée pour limiter vos risques.
Utilisation objdump
pour regarder réellement le langage d'assemblage généré et déterminer la quantité de code que chacune de vos routines prend.
Si vous utilisez un gros système d'exploitation comme Linux, vous demandez des ennuis; il y a tellement de complexité et tant de choses qui tournent mal.
N'oubliez pas que c'est un jeu de probabilités.
Un commentateur a dit
Chaque routine que vous écrivez pour détecter les erreurs sera sujette à l'échec de la même cause.
Bien que cela soit vrai, les chances d'erreurs dans les (disons) 100 octets de code et de données nécessaires pour qu'un programme de vérification fonctionne correctement sont beaucoup plus faibles que les chances d'erreurs ailleurs. Si votre ROM est assez fiable et que presque tout le code / les données sont réellement dans la ROM, alors vos chances sont encore meilleures.
Utilisez du matériel redondant.
Utilisez 2 configurations matérielles identiques ou plus avec un code identique. Si les résultats diffèrent, une réinitialisation doit être déclenchée. Avec 3 appareils ou plus, vous pouvez utiliser un système de "vote" pour essayer d'identifier celui qui a été compromis.