Arduino 'carga' sus programas a través de una interfaz USB a serie.
Por lo tanto, si cargó un cargador de arranque Arduino ATmega168 (hay varios para elegir), haría exactamente lo que desea.
Esta página de Arduino Bootloader explica cómo hacerlo y proporciona enlaces al código fuente del bootloader.
Recuerde, hay varios ATmega diferentes utilizados en Arduino ', así que asegúrese de obtener la versión ATmega168.
Un ATmega88 / 168/328 tiene dos secciones de memoria Flash denominadas "Lectura en escritura" (RWW) y "No lectura en escritura" (NRWW). Se describen en la Sección "27.4 Secciones en Flash de Lectura Mientras Escribe y No Lectura Mientras Escribe" del manual de ATmega48 / 88/168/328.
La diferencia entre las dos secciones de Flash es que un ATmega88 / 168/328 puede ejecutar un programa en NRWW al mismo tiempo que la programación de RWW Flash . Sin embargo, la CPU Atmega se detiene cuando se está programando NRWW Flash, es decir, no ejecutará ningún programa mientras NRWW se esté programando. Por lo tanto, la memoria flash NRWW solo se puede programar utilizando un programador externo.
Además, el manual advierte contra el intento de leer RWW Flash mientras se está programando, por ejemplo, la CPU no debe intentar ejecutar un programa desde RWW Flash mientras se está programando RWW Flash:
Durante una programación en curso, el software debe garantizar que el RWW
Nunca se está leyendo la sección. Si el software del usuario está intentando leer
código que se encuentra dentro de la sección RWW (es decir, mediante una llamada / jmp / lpm
o una interrupción) durante la programación, el software podría terminar en un
estado desconocido.
Continúa explicando que las interrupciones deben ser deshabilitadas o manejadas dentro de la misma sección NRWW que el cargador de arranque. Por lo tanto, el código UART existente y el código del gestor de arranque deberán combinarse, y la combinación debe estar contenida completamente dentro de la sección NRWW, o no funcionará de manera confiable para reprogramar la 'aplicación' en RWW Flash,
También ATmega tiene su memoria Flash particionada en dos áreas que pueden protegerse utilizando bits de fusible, independientemente de la otra, para que no se sobrescriban accidentalmente. Podría valer la pena usar esta función para proteger la rutina de interrupción de UART y el cargador de arranque de daños accidentales.
El problema de cargar código no se resuelve solo con un cargador de arranque en Flash. También necesitará un programa en el PC host para cargar el programa. Muchas cadenas de herramientas ATmega, incluido el IDE de Arduino, utilizan avrdude . Si instala eso y sigue la documentación, avrdude se cargará a un cargador de arranque Arduino.
Lo bueno de este enfoque es que puede instalar el IDE de Arduino en una máquina y probar todo el proceso utilizando una cadena de herramientas que funciona y que admite ATmega168. Por lo tanto, debería ser relativamente sencillo hacer que funcione.
Editar:
También hay un proyecto de cargador de arranque AVR llamado kavr que dice ser de solo 512 bytes. No tengo experiencia de ello.