¿Quién recibe el valor devuelto por main ()?

34

Sé que en las computadoras, el sistema operativo recibe el valor devuelto por la función main() . Pero, ¿qué sucede en la función main() de un microcontrolador?

    
pregunta user18118

4 respuestas

41

En un microcontrolador, no se espera que main() salga nunca, y el comportamiento si lo hace no está definido, por lo que depende de quien haya escrito el tiempo de ejecución de C para el microcontrolador. He visto sistemas que:

  • Tenga un bucle implícito alrededor de main() , de modo que si sale, simplemente se vuelva a llamar.
  • Tenga un simple bucle de "salto a sí mismo" que se ejecute si main() alguna vez sale.
  • Simplemente ejecute el resto de la memoria de código que sigue la llamada a main() . Esto se denomina "correr hacia la maleza".

Nunca he visto uno que realmente haga algo con el valor devuelto por main() . Si esto es algo que realmente te importa, entonces deberías echar un vistazo al código fuente de la biblioteca de tiempo de ejecución de C de tu sistema, y posiblemente modificarlo.

    
respondido por el Dave Tweed
5

Un malentendido / mito común es que int main es la única forma válida especificada por el estándar. Eso no es cierto.

El estándar C habla de dos implementaciones: alojada y autoestable. "Implementación" en este caso significa compilador. Los compiladores alojados compilan para un sistema operativo específico y los compiladores independientes compilan para una aplicación específica. Los sistemas integrados son casi siempre sistemas independientes, incluso en el caso de RTOS.

Las implementaciones independientes pueden usar cualquier forma para main() , ni siquiera necesitan tener una función llamada main. La mayoría de las veces, utilizan el formulario void main (void) , ya que no tiene ningún sentido devolver nada.

Lo importante a tener en cuenta aquí es que siempre es el compilador el que decide la forma de main() y nunca el programador.

Las implementaciones independientes que do devuelven algo de main() son muy cuestionables. Hace que te preguntes si las personas que hicieron el compilador realmente leyeron el estándar ...

Más detalles aquí .

    
respondido por el Lundin
3

El estándar del lenguaje C permite la variación definida por la implementación void main( void ) y esta es la forma habitual en los sistemas integrados, simplemente porque no se espera que regresen.

Si observa la configuración del compilador, generalmente hay un fragmento de código de arranque, llamado desde el vector de restablecimiento, que realiza una inicialización básica (incluida, por ejemplo, el copiado de los valores de inicialización en variables) antes de llamar a main ().

Esto también (generalmente) estará dentro de un bucle infinito, o tal vez realizará un restablecimiento, si main() devuelve

    
respondido por el Andrew
0

Depende (como se mencionó en otras respuestas) de su cadena de herramientas, pero, por ejemplo, en GCC main se compila como otras funciones, por lo que su valor de retorno se almacenará de acuerdo con las convenciones de llamadas (en ARM estoy usando correctamente no con GCC se pondrá a R0 justo antes de regresar).

Supongo que es similar en AVR-GCC, por lo que las secuencias de comandos personalizadas pueden usar este valor después de las devoluciones principales.

    
respondido por el kwesolowski

Lea otras preguntas en las etiquetas