En cualquiera de setupo 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

NOPdeclaraciones 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.*.elfde 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,cliy 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?