Los microcontroladores a menudo se programan desde cero, lo que significa que su programa debe inicializar la CPU y la RAM para que su programa funcione. Esto se denomina script de inicio y algunos IDE / compiladores pueden ocultarlo del usuario a primera vista.
El script de inicio hace lo mínimo para llegar a una C principal, combinado con el C "entorno". Esto es (opcionalmente) llenando RAM con ceros, y lo más importante es copiar variables con valores predefinidos desde FLASH a RAM. P.ej. Si declara una variable (global) con un valor inicial, se almacena en el programa FLASH y se copia en la RAM antes de llamar a main.
Sospecho que usas el compilador XC16 o C30. Puede encontrar estos scripts en XC16 / v *. ** / src / libpic30.zip en los archivos crt0_standard.s. Contiene el siguiente código de inicio (simplificado para este ejemplo):
mov #__SP_init,w15 ; initialize w15
mov #__SPLIM_init,w14
mov w14,_SPLIM ; initialize SPLIM
nop ; wait 1 cycle
mov #__enable_fixed, w0
cp0 w0
bra z, CORCON_RESET
mov #0x0010,w0
mov w0,CORCON ; enable super saturation and clear IF
CORCON_RESET:
rcall __psv_init ; initialize PSV
mov #__dinit_tbloffset,w0 ; w0,w1 = template
mov #__dinit_tblpage,w1 ;
rcall __data_init_standard ; initialize data
mov #__has_user_init,w0
cp0 w0 ; user init functions?
bra eq,1f ; br if not
call __user_init ; else call them
1:
call _main ; call user's main()
.pword 0xDA4000 ; halt the simulator
reset ; reset the processor
Incluso si no habla el ensamblador con fluidez, debería ver lo que está pasando. El script inicializa la pila, algunos registros de CPU, inicializan PSV & memoria de datos (por ejemplo, copiando contenidos variables preinicializados de FLASH a RAM) y luego llame a su función principal.
La secuencia de comandos más o menos espera que el main nunca regrese, por lo que a menudo ves un tiempo (1) al final de cualquier programa incrustado.
Si regresa por alguna razón, ejecutará la instrucción de reinicio. Esto reinicializa todo de nuevo y eventualmente lo llama main de nuevo. Esto se convierte en el comportamiento que estás viendo, es decir, está en bucle.