Los microcontroladores verdaderos solo ejecutan código interno, y por lo tanto solo hacen lo que el código interno les dice que hagan. Ese código interno tiene que entrar de alguna manera. Los microcontroladores modernos usualmente tienen memoria flash donde se almacena el código y tienen pines especiales que se pueden mover de manera especial para escribir datos en esa memoria. Los dispositivos que se conectan a un puerto común en computadoras normales (como el USB) en un lado y se conectan a dichos pines en el otro lado para permitir que los datos se transfieran desde la computadora a la memoria del programa del microcontrolador generalmente se conocen como "programadores". Esta es la forma común de obtener un programa en un microcontrolador. Esta es también la única forma de convertir un programa en un dispositivo en blanco o no programado.
Para los micros que son capaces de escribir en su propia memoria de programa, es posible poner un programa específico en el micro (usando un programador como se describe anteriormente), que puede leer datos de un puerto serie, puerto SPI, IIC, o cualquier otra interfaz que pueda implementar en ese micro y escribir esos datos en su memoria de programa. Dicho programa en el micro a veces se denomina "cargador de arranque".
Hay algunos errores y restricciones con los cargadores de arranque. Primero y más obvio, el cargador de arranque debe escribirse en la memoria del programa inicialmente mediante la programación regular. Luego, debe asegurarse de que el cargador de arranque no se sobrescriba a sí mismo, o que el nuevo programa escrito por el cargador de arranque no tenga un error, por lo que el cargador de arranque ya no se puede ejecutar para cargar una solución, etc. . El gestor de arranque también requerirá algunos recursos, que deben tenerse en cuenta al diseñar las aplicaciones que cargará el gestor de arranque. Tienes que pensar en los errores de comunicación con mucho cuidado, ya que eso podría conducir a un código dañado. Hay muchos esquemas. Los cargadores de arranque pueden ser conceptualmente simples, pero hay mucho más en ellos cuando miras los detalles.
También es posible que el programa en el micro actúe como intérprete. Eso significa que el código del programa de alto nivel está en un idioma diferente que el intérprete interpreta sobre la marcha y ejecuta. El código de alto nivel podría almacenarse externamente en una memoria grande. El gran inconveniente es que la ejecución general es mucho más lenta que cuando se ejecuta de forma nativa. Es por esto que los intérpretes rara vez se utilizan para proyectos reales.
La mayoría de las veces, escribe un código para ejecutar de forma nativa en el micro, lo escribe en el micro con un programador y luego lo ejecuta. Esa es la manera simple y fácil. A menos que haya una buena razón para no hacerlo de esta manera, eso es lo que debe hacer.