En mi experiencia, se reduce a lo que su costo es, si puede permitirse tener el doble de código/espacio de datos en el dispositivo que necesita y puede reiniciar, es simple, almacenar la nueva versión en todos sus extra espacio, haga una verificación de suma de comprobación adecuada en la nueva imagen y también recomiendo una verificación más profunda en la nueva imagen de firmware, ya que podría fallar si no lo hace, por ejemplo, algún tipo de clave cifrada que garantice el origen de la nueva imagen. También puede hacerlo con memorias externas, por ejemplo, en un proyecto que utiliza un PIC, tenía una EEPROM externa para la nueva imagen de firmware y una bandera que, si se configuraba en el arranque, cargaría una nueva imagen de la EEPROM.
si no tiene tanta suerte, es decir, no puede pagar ese espacio, entonces la vida se vuelve más interesante y es probable que no exista una forma garantizada de evitar por completo la posibilidad de falla durante una actualización. En todos los casos, el gestor de arranque debe estar en una memoria protegida y si puede permitirse el espacio, debe tener alguna forma básica de conectividad externa, he hecho sistemas con controladores USB muy simples en el gestor de arranque y sistemas con UDP REALMENTE simple solo pilas de red. O bien le permitirá al menos obtener una nueva imagen del dispositivo si falla durante una actualización. En estos casos, recomiendo encarecidamente colocar el gestor de arranque en un área de memoria de solo lectura, perderá la capacidad de actualizarlo, pero una actualización no segura también no lo dejará con un dispositivo completamente oculto. En tal caso, el gestor de arranque es lo suficientemente pequeño para que pueda estar seguro de su corrección.
la última posibilidad es un sistema que necesita actualizar una parte de su código mientras se ejecuta ... esto es realmente complicado y generalmente requiere un control complejo sobre la ubicación de las funciones en la memoria y una mayor planificación en el diseño de memoria para lograr . No es divertido, pero es factible.
solo curiosidad, ¿y si necesita actualizar el gestor de arranque? – sybreon
@sybreon: los roles inversos de la aplicación y el gestor de arranque, usando una estrategia similar. En otras palabras, el código de la aplicación podría contener la capacidad de descargar un nuevo gestor de arranque, con espacio para dos gestores de arranque reservados. Una vez que se descarga y se verifica un nuevo gestor de arranque, se realiza una escritura final (muy probablemente al vector de reinicio, o algún código de inicio inmutable), para asegurar que se llama al nuevo gestor de arranque al inicio. –
En general, el booloader es tan simple y hace cosas tan básicas que no hay necesidad de actualizarlo. – mouviciel