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

34

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

usuario18118
fuente
77
Siempre uso void main () cuando uso C para microcontroladores PIC. Cuando se utilizan compiladores de C para microcontroladores, realmente no importa en absoluto. Porque no hay ningún sistema operativo que ejecute (digamos) "main.c". Si hay algo como RTOS ejecutándose en ese microcontrolador, entonces el sistema operativo es el "main.c".
Abdullah Kahraman
44
No es realmente un duplicado, pero al menos está relacionado: electronics.stackexchange.com/q/30830/4950
PetPaulsen
1
Cómo se define la función de inicio generalmente no depende de usted decidir. El entorno que está utilizando documentará los formularios de función de inicio compatibles. Se requieren implementaciones de C alojadas para admitir dos formas de maincon dos firmas diferentes, las cuales devuelven int. Si está utilizando una implementación independiente de C, esa implementación dicta cómo debe escribir la función de inicio. No puede escribir una voidfunción de retorno solo porque no regresa. El comportamiento de no regresar es diferente del tipo de función que influye en las convenciones de llamadas generales.
Kaz

Respuestas:

42

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

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

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

Dave Tweed
fuente
1
Me ganaste a eso. +1 para sincronicidad.
Adam Lawrence
99
El estándar C que define main()tener un intvalor de retorno obviamente no fue diseñado con un microcontrolador sin sistema operativo en mente. Entonces, este es un comportamiento no especificado y cualquier cosa puede suceder dependiendo de su tiempo de ejecución C, como Dave enumeró.
ndim
44
C que se ejecuta en un microcontrolador OS-menos podría considerarse como una aplicación independiente, y el estándar de C ni siquiera requiere un environent independiente para tener una main(), y mucho menos definir su valor de retorno. Eso depende del implementador.
KutuluMike
2
@ndim: para dividir los pelos, void main( void )es un comportamiento definido de implementación , no un comportamiento no especificado .
Andrew
1
@MichaelEdenfield: De hecho. Sin embargo, todo el código en C se define en términos de funciones, por lo que nunca es posible tener un sistema actualizado completamente escrito en C; debe haber al menos un poquito de lenguaje ensamblador (o lo que sea) que configure un entorno mínimo para que se pueda llamar a una función C. El nombre más obvio para esa función es main().
Dave Tweed
5

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

El estándar C habla de dos implementaciones: alojada e independiente. "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 de metal desnudo. Los sistemas integrados son casi siempre sistemas independientes, incluso en el caso de RTOS.

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

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

Independientes implementaciones que hacen de retorno algo de main()muy cuestionable. Hace que te preguntes si las personas que hicieron el compilador realmente leen el estándar ...

Detalles aquí .

Lundin
fuente
3

El estándar del lenguaje C permite la variación definida de 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 reinicio, que realiza una inicialización básica (que incluye, por ejemplo, hacer frente a 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 realice un reinicio, si main()regresa

Andrés
fuente
0

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

Supongo que es similar en AVR-GCC, por lo que el script personalizado puede usar este valor después de los retornos principales.

kwesolowski
fuente
esto más bien pierde el punto
Chris Stratton
Hace hincapié en que quien llama mainpuede obtener su valor de retorno. Por supuesto, se ignora en situaciones del 99,9%, pero la respuesta proporciona información sobre quién puede recibir este valor de retorno.
kwesolowski