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?
microcontroller
avr
c
usuario18118
fuente
fuente
main
con dos firmas diferentes, las cuales devuelvenint
. 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 unavoid
funció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.Respuestas:
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:main()
, de modo que si sale, simplemente se lo vuelva a llamar.main()
alguna vez sale.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.fuente
main()
tener unint
valor 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ó.main()
, y mucho menos definir su valor de retorno. Eso depende del implementador.void main( void )
es un comportamiento definido de implementación , no un comportamiento no especificado .main()
.Un malentendido / mito común es que
int main
es 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 formulariovoid 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í .
fuente
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()
regresafuente
(Como se mencionó en otras respuestas) depende 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 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.
fuente
main
puede 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.