En cualquiera de setup
o loop
, si tuviera que agregar una exit(0)
llamada, ¿a dónde pasaría el control? ¿Cuál sería el próximo estado del microcontrolador? ¿Pararía la ejecución y apagaría?
Estoy usando una revisión 2 Arduino Uno.
programming
arduino-uno
Asheeshr
fuente
fuente
NOP
declaraciones de ensamblaje, que solo se detienen por un par de ciclos de relojRespuestas:
Mi suposición inicial es incorrecta. Pensé que simplemente regresaría del bucle y la biblioteca principal simplemente llamaría al bucle () nuevamente. Sin embargo, veo que se creó el siguiente código. Notando que __stop_program es un bucle duro ...
Un extracto de la lista de Blink.ino, con la salida (0) agregada:
El desmontaje de lo anterior:
Tenga en cuenta que si _exit no hubiera llamado a cli, las interrupciones podrían hacer cosas. Pero ese no es el caso.
fuente
avr-objdump -S {compiled *.elf file}
produce un archivo que incluye el código C que conduce a cada sección del código de ensamblaje. Es mucho más fácil de seguir.*.elf
de eso y luego obtuve los símbolos de depuración adecuados. Creo que el editor de texto Arduino / botón-macro (me niego a llamarlo IDE porque no lo es) está quitando la información de depuración solo del archivo C ++ principal compilado, por alguna razón extraña y estúpida.avr-objdump -S -I/path/to/the/sketch/folder xxx.elf
. Esa es la ruta de la carpeta de croquis , no el archivo .ino en sí. Entonces deberías obtener la fuente C en el basurero.Bueno, acabo de probarlo con mi Arduino Uno y simplemente detuvo completamente el código y dejó todas las salidas como estaban cuando el código dejó de funcionar (por lo que dejó un LED que tenía encendido). Parece que no hay una limpieza de E / S cuando llamas a exit. Esto era lo que esperaba porque el Arduino IDE proporciona las funciones de configuración y bucle, si programa el ATMEGA * 28 con cualquier otro IDR AVR, comienza con la función principal como todos los programas C / C ++. Las funciones de configuración y bucle no son estándar en las MCU AVR.
Nota: La presión del botón de reinicio reinicia el código, si se lo preguntaba.
fuente
exit(0)
las instrucciones desmontadas son (IIRC)__stop_program
,cli
y un spinlock. Quería verificar si eso es correcto con una explicación de cómo se pasa el control, es decir, ¿pila de llamadas pop ?, ¿llamada ISR?