Aquí hay algunos pensamientos e ideas:
Usa ROM más creativamente.
Almacene todo lo que pueda en ROM. En lugar de calcular cosas, almacene tablas de búsqueda en ROM. (¡Asegúrese de que su compilador envíe sus tablas de búsqueda a la sección de solo lectura! ¡Imprima las direcciones de memoria en tiempo de ejecución para verificar!) Guarde su tabla de vectores de interrupción en ROM. Por supuesto, ejecute algunas pruebas para ver qué tan confiable es su ROM en comparación con su RAM.
Usa tu mejor RAM para la pila.
Los SEU en la pila son probablemente la fuente más probable de bloqueos, porque es donde viven típicamente variables de índice, variables de estado, direcciones de retorno y punteros de varios tipos.
Implemente las rutinas de temporizador de tic-tic y watchdog
Puede ejecutar una rutina de "verificación de cordura" cada vez que se active el temporizador, así como una rutina de vigilancia para manejar el bloqueo del sistema. Su código principal también podría incrementar periódicamente un contador para indicar el progreso, y la rutina de verificación de cordura podría asegurar que esto haya ocurrido.
Implemente códigos de corrección de errores en el software.
Puede agregar redundancia a sus datos para poder detectar y / o corregir errores. Esto agregará tiempo de procesamiento, lo que podría dejar al procesador expuesto a la radiación durante más tiempo, lo que aumenta la posibilidad de errores, por lo que debe considerar la compensación.
Recuerda los escondites.
Verifique los tamaños de sus cachés de CPU. Los datos a los que ha accedido o modificado recientemente probablemente estarán dentro de un caché. Creo que puede deshabilitar al menos algunas de las cachés (a un alto costo de rendimiento); deberías probar esto para ver qué tan susceptibles son los cachés a los SEU. Si las memorias caché son más resistentes que la RAM, puede leer y volver a escribir regularmente datos críticos para asegurarse de que permanezca en la memoria caché y vuelva a poner la RAM en línea.
Utilice los manejadores de fallas de página de manera inteligente.
Si marca una página de memoria como no presente, la CPU emitirá un error de página cuando intente acceder a ella. Puede crear un manejador de errores de página que realice algunas comprobaciones antes de atender la solicitud de lectura. (Los sistemas operativos de PC usan esto para cargar de forma transparente las páginas que se han intercambiado al disco).
Use lenguaje ensamblador para cosas críticas (que podrían ser todo).
Con el lenguaje ensamblador, sabes qué hay en los registros y qué hay en la RAM; usted sabe qué tablas RAM especiales está utilizando la CPU, y puede diseñar cosas de forma indirecta para mantener su riesgo bajo.
Utilícelo objdump
para ver realmente el lenguaje ensamblador generado y calcule cuánto código ocupa cada una de sus rutinas.
Si está utilizando un gran sistema operativo como Linux, entonces está buscando problemas; hay tanta complejidad y tantas cosas que salen mal.
Recuerda que es un juego de probabilidades.
Un comentarista dijo
Cada rutina que escriba para detectar errores estará sujeta a fallar por la misma causa.
Si bien esto es cierto, las posibilidades de errores en los (digamos) 100 bytes de código y datos necesarios para que una rutina de verificación funcione correctamente es mucho menor que la posibilidad de errores en otros lugares. Si su ROM es bastante confiable y casi todo el código / datos está realmente en ROM, entonces sus probabilidades son aún mejores.
Use hardware redundante.
Use 2 o más configuraciones de hardware idénticas con código idéntico. Si los resultados difieren, se debe activar un reinicio. Con 3 o más dispositivos, puede usar un sistema de "votación" para tratar de identificar cuál ha sido comprometido.