La única forma en la que podría pensar en implementar # 1 es CRC continuamente la memoria del programa contra un valor conocido y, si falla, la verificación del CRC recupera una buena copia del programa de otra fuente. Hay muchos inconvenientes para esto: el valor CRC almacenado puede corromperse de alguna manera o puede que no haya "otra fuente" de su programa disponible fácilmente - puede ser necesaria la intervención del usuario. Además, dado que la corrupción puede estar en cualquier lugar de la memoria del programa, puede afectar al código CRC, por lo que no se ejecuta o al gestor de arranque, por lo que no funcionará (puedes ir tan lejos por el agujero de conejo como quieras).
Puede combinar la verificación CRC con un temporizador de vigilancia o un monitor de salud externo, de modo que si el código CRC no se ejecuta o no produce el resultado correcto, el microcontrolador se reiniciará y ejecutará un cargador de arranque de recuperación especial en lugar de la aplicación. Lo que haría el cargador de arranque de recuperación dependerá de su aplicación: podría alertar a los usuarios de que se necesita una nueva carga del programa o si lo diseñó, intente recuperar una copia prístina de su programa de la memoria externa, si está disponible. Se aplica el mismo orificio de conejo que el anterior: ¿cómo sabes que la memoria externa no se ha dañado? O bien, si el CRC está dañado, su programa tendría razón, pero siempre fallaría la verificación.
En algún momento, su dispositivo no puede manejar este tipo de error por sí mismo y si desea que la cosa se siga ejecutando, tendrá que traer un sistema de desarrollo y un programador para que vuelva a activarse. Este tipo de esquema probablemente agregará unos pocos 9 a su confiabilidad aunque no sea perfecto.