programa principal ejecutado como un bucle infinito while [duplicado]

0

Estoy trabajando en el microcontrolador PIC24F. Mi programa principal no tiene bucle infinito, pero se ejecuta como un bucle infinito. Antes de probar el código con el bucle while infinito (while (1)), pero cuando elimino el bucle while, todavía funciona como un bucle infinito. ¿Cuál es el problema?

Gracias

    
pregunta user6161

3 respuestas

6

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.

    
respondido por el Hans
2

No hay ningún sistema operativo en este microcontrolador, ¿verdad? Lo que sucede si permite que su función main () salga, depende del código de inicio de C (que es lo que llama a main () en primer lugar). Es de suponer que hay otro equivalente de while (1) bucle que rodea la llamada a main (); En general, la detención no sería tan útil como reiniciar el programa.

Si realmente desea que un microcontrolador se ejecute una vez y luego se detenga, debe detenerlo explícitamente en lugar de regresar de main ().

    
respondido por el MarkU
2

Un programa alojado en un HLL vuelve al sistema operativo cuando finaliza. Si no hay un sistema operativo, el comportamiento no está definido; puede saltar al principio, puede ejecutar bytes aleatorios en la memoria del programa hasta que la PC se desplace o se atasque de algún modo en un bucle, o en otra cosa completamente. >

Por supuesto, es determinista en algún nivel: puede obtener información al examinar el código de ensamblaje de inicio, el código emitido y el paso sencillo del código a través de un emulador o simulador. Debe tener un conocimiento razonable de la programación en lenguaje de máquina.

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas