¿Arduino necesita el cargador de arranque si está programado con programador?

Estoy tratando de programar algunos Atmega328 (no Atmega328p) con un ICSP. Estos son TQFP.

Lo que intento hacer es cargar el programa en un chip nuevo sin tener que cargar primero el gestor de arranque. Yo uso un comando como este

avrdude -v -p m328 -c usbtiny -U flash:w:blink.cpp.hex:i

avrdude dice que se cargó con éxito, pero el programa en realidad no se ejecuta.

Sin embargo, cuando grabo por primera vez el cargador de arranque, usando la GUI de Arduino, luego uso la línea de comando y el programador para cargar el programa, el programa se ejecuta. Estoy confundido acerca de por qué esto se debe a que entendí que el cargador de arranque no era necesario si la programación se realizó con el programador.

¿Por qué es necesario el gestor de arranque?

En segundo lugar, si se necesita el cargador de arranque, ¿hay alguna manera de hacer que avrdude haga todo lo posible para cargar el cargador de arranque y el programa en una sola línea?

¿Cómo creaste el archivo blink.cpp.hex?
Usé el IDE de Arduino. Obtuve la ruta del archivo del IDE de Arduino usando la opción de salida detallada en la configuración.
Creo que deberías revisar la respuesta de Dave Tweed. electronics.stackexchange.com/a/43538/8627

Respuestas (2)

Para responder a la primera pregunta, se necesita el cargador de arranque porque su programa está construido de tal manera que depende de que el cargador de arranque resida en la dirección de reinicio del procesador y luego haga que el cargador de arranque salte a su programa. Es una función de cómo se configura el script del enlazador y el código de tiempo de ejecución para el entorno Arduino.

No sé la respuesta precisa a su segunda pregunta, pero ciertamente debería ser posible.

Una solución alternativa sería usar un script de enlace diferente para que su programa realmente resida en la dirección de reinicio.

interesante. Eso tiene sentido. Buscaré la solución. Gracias por la respuesta.

Creo que Dave Tweed tiene razón acerca de que el binario se compila para su uso con el cargador de arranque Arduino.

Utilizo el siguiente script bash para programar ATtiny y, a menudo, uso bibliotecas individuales de Arduino. No puedo probar su configuración específica, pero si cambia las diversas variables, podría funcionar.

#!/bin/bash

freq=9600000/8
baud=19200
src=main.cpp
avr=attiny13
dev=/dev/ttyUSB003

avr-gcc -g -DF_CPU=$freq -Wall -Os -mmcu=$avr -c -o tmp.o $src &&
avr-gcc -g -DF_CPU=$freq -Wall -Os -mmcu=$avr -o tmp.elf tmp.o &&
avr-objcopy -j .text -j .data -O ihex tmp.elf tmp.hex &&
avrdude -p $avr -cstk500v1 -P$dev -b$baud -v -U flash:w:tmp.hex