Interruptor de modo ARM interrumpiendo la ejecución del programa

0

Estoy creando un sistema integrado en una frambuesa pi 3 B. Actualmente estoy tratando de cambiar los modos de ejecución para configurar las diferentes pilas (la pila de usuario, la pila de supervisor, la pila de interrupción ...). Según tengo entendido, debería bastar con escribir simplemente el valor correcto en el CPSR de la siguiente manera:

;@"================================================================"
;@ Now setup stack pointers for the different CPU operation modes.
;@"================================================================"
        ldr     sp, =0x8000 // initialize stack pointer
        mov r0, #1
        bl set_LED

        msr CPSR_c, #0xD1                  ;@ Switch to FIQ_MODE
        ldr sp, =__fiq_stack               ;@ Set the stack pointer for that mode
        msr CPSR_c, #0xD2                  ;@ Switch to IRQ_MODE
        ldr sp, =__irq_stack               ;@ Set the stack pointer for that mode
        msr CPSR_c, #0xD3                  ;@ Switch back to SRV_MODE
        ldr sp, =__svc_stack               ;@ Set the stack pointer for that mode

        mov r0, #0
        bl set_LED 

El set_LED enciende el led para un valor de 1 y se apaga para un valor de 0. Después de este código, hay un sistema operativo falso que imprime un mensaje tonto en la pantalla. Si trato de ejecutar este código, el led permanece encendido, por lo que parece que la CPU nunca logra ejecutar el segundo cambio de led y todo lo que puedo ver en mi monitor es una paleta de colores (la que por defecto utiliza Pi para indicar el VC). está trabajando). Si comento las 6 líneas en el código anterior que son relevantes para el cambio de contexto, mi programa funciona bien, con eso quiero decir que el led finaliza en un estado apagado después de que el programa alcance el bucle infinito final y mi monitor muestre una pantalla negra con un mensaje tonto que utilizo para la depuración (sin paleta de colores).

Me gustaría entender por qué este código está interrumpiendo la ejecución del programa, ya que toda la documentación que he leído parece decir que esta es la forma de cambiar los modos e inicializar los punteros de pila.

    
pregunta Makogan

0 respuestas

Lea otras preguntas en las etiquetas