¿Qué sucede cuando se cae del final de main () en un PIC? [duplicar]

3

Otra pregunta incluyó este programa:

void main(void){
    TRISD = 0x00;
    PORTD = 0xFF;
}

Supongamos que hace exactamente lo que se pretendía hasta la última línea de main() .

Mi pregunta es, ¿qué sucede en un PIC18F4550 cuando el flujo de control cae fuera del final de main() ? Supongo que cualquier programador PIC decente llenará el espacio de instrucciones después de main() con all-1s o all-0s, pero no sé cuál.

Desde la documentación del conjunto de instrucciones PIC puedo ver que una instrucción de todos ceros es NOP , que es inofensivo en sí mismo, pero ¿qué sucede cuando el contador del programa llega al final del espacio de instrucciones? ¿Se envuelve, se detiene, se incendia, emite monos ...?

Si los programadores de PIC llenan el espacio del programa con all-1s, como en una EEPROM vacía, parece que esa será una instrucción ADDLW que agrega 0xFF a W . Si eso es correcto y no nos importa lo que suceda con W , ¿es lo mismo que el caso NOP ?

¿Las respuestas a las preguntas anteriores argumentan para hacer otra cosa, como ejecutar un bucle infinito para evitar que la ejecución salga de main() ? No creo que podamos dormir el microcontrolador aquí, ya que eso no mantendrá las líneas del puerto D indefinidamente, como quería el OP.

    
pregunta Warren Young

3 respuestas

3

main() es una función como cualquier otra. Cuando "te quedas sin el final", vuelve a quien lo haya llamado. Para una discusión de lo que sucede entonces, consulte esta pregunta .

    
respondido por el Dave Tweed
6

Puede responder esto fácilmente por sí mismo mirando el desensamblaje del código compilado en MPLAB, para cualquier compilador que esté usando (y repasando el programa usando MPSIM).

Por lo general, volverá a comenzar al principio en lugar de ejecutar tareas aleatorias en la memoria del programa, ya que el programa se ingresará con una 'llamada' en lenguaje ensamblador y terminará con un 'retorno 0'.

Esto se considera un "entorno independiente" porque no hay ningún sistema operativo.

Oficialmente, según el estándar ISO / IEC 9899: 1999 (E) C, "El efecto de la finalización del programa en un entorno independiente es definido por la implementación " (énfasis agregado).

Probablemente no sea una buena idea invocar un comportamiento definido por la implementación si no es necesario.

    
respondido por el Spehro Pefhany
1

Si fuera mi intención ejecutar el procesador en un bucle infinito en ese punto, lo escribiría explícitamente y no contaría con lo que haga el código de inicialización de C / C ++ si alguna vez recupera el control (aunque un escenario probable es que vuelva a ejecutar la aplicación, la inicialización y todo).

    
respondido por el JRobert

Lea otras preguntas en las etiquetas