Inicialice los registros ARM a un valor específico a través del ensamblaje en línea

2

Tengo la necesidad de inicializar los registros ARM de mi placa de desarrollo ARM7TDMI a unos valores específicos mediante el ensamblaje en línea. Por ejemplo, actualmente hago algo como lo siguiente:

    #pragma ARM
        void init(char * reg)  {

            __asm  {
                MOV    R0,#0x0
                MOV    R1,#0x1
                MOV    R2,#0x2
                MOV    R3,#0x3
               ...
}

La idea es controlar de cerca el contenido de cada uno de los registros aquí. Estoy usando KEIL UVision 5 y me advierte que esto puede no ser algo inteligente. Y mirando al depurador no hay garantía de que la inicialización se realice según mi solicitud. Por ejemplo, el valor 0x2 puede almacenarse en el registro r12 en lugar de r2 como solicité en mi ensamblaje en línea.

a.c(102): warning:  #1267-D: Implicit physical register R0 should be defined as a variable

Leer la documentación de Keil enlace Se sugiere utilizar nombres de variables. Algo como esto

{
  int val2;

__asm
    {
    MOV val2,0xFFFF0000
    MOV val,val,LSL #16
    }

Bueno, esto no es lo suficientemente bueno para mí, ya que quiero un control preciso sobre el contenido de mi registro. ¿Cómo es posible hacer? ¿Alguna idea?

Gracias

    
pregunta rockstar

2 respuestas

3

El IDE que está utilizando, como la mayoría de los IDE, automatiza la inicialización de la CPU al nivel más bajo. Es responsable de generar, por ejemplo, el contenido de la tabla de vectores.

Al usar un lenguaje de nivel superior al de ensamblador, todo lo relacionado con la manipulación de los registros y la inicialización está bastante oculto, especialmente si las optimizaciones del compilador están habilitadas.

Creo que deberías escribir el código crítico en el ensamblador , para garantizar el rendimiento de la CPU. Quizás el resto de su aplicación se pueda desarrollar al más alto nivel, teniendo el código de bajo nivel como una biblioteca.

    
respondido por el Martin Petrei
-1

Utilizo la siguiente función en mi código con uVision 4.70

__asm void SetPOWCON(
    u16 u16POWCON)  // POWCON register value
{   
Z_PLL   EQU     0xFFFF0400  // PLL base address
R_NUM   EQU     0x12345678  // Random Number for Dummy Multiplication

   LDR      r3,=R_NUM      // Load random number for multiplication
   LDR      r1,=Z_PLL      // Load base address of PLL / POWCON related MMRs
   MOV      r2,#1          // POWKEY0 = 1
   STR      r2,[r1,#4]
   STR      r0,[r1,#8]     // Set POWCON value
   MOV      r0,#0xf4       // POWKEY1 = 0xF4
   STR      r0,[r1,#0xc]
   UMLAL    r2,r0,r3,r1    
   BX       lr
}
    
respondido por el Holger Grothe

Lea otras preguntas en las etiquetas

¿Conectar la señal a tierra a tierra de seguridad? ___ relación qstnhdr ___ E y H ______ qstntxt ___

¿Puede alguien explicar por qué la dirección de H es -Z y + Y? una vez que hago el producto cruzado y lo multiplico por -100, obtengo -Z y -Y como instrucciones.

    
______answer192409___

Supongo que tiene un error en el cálculo del producto cruzado. Como no muestra su cálculo, no puedo decir cuál es el error, pero supongo que olvidó que la segunda fila del resultado difiere un poco de las otras ...

Aquí está mi cálculo paso a paso. Lo siento por la notación ligeramente diferente ...

$$ \ vec {H} = - 100 \ cdot \ begin {pmatrix} 1 \\ 0 \\ 0 \ end {pmatrix} \ times \ begin {pmatrix} 0 \\ 10 \\ 20 \ end {pmatrix } \ cdot e ^ {- j4x} \ cdot10 ^ {- 3} $$

$$ = - 100 \ cdot \ begin {pmatrix} 0 \ cdot20-0 \ cdot10 \\ 0 \ cdot0-1 \ cdot20 \\ 1 \ cdot10-0 \ cdot0 \ end {pmatrix} \ cdot e ^ { -j4x} \ cdot10 ^ {- 3} $$

$$ = - 100 \ cdot \ begin {pmatrix} 0 \\ -20 \\ + 10 \ end {pmatrix} \ cdot e ^ {- j4x} \ cdot10 ^ {- 3} $$

$$ = \ begin {pmatrix} 0 \\ +2 \\ - 1 \ end {pmatrix} \ cdot e ^ {- j4x} $$

$$ = (- \ vec {e} _z + 2 \ vec {e} _y) \ cdot e ^ {- j4x} $$

    
___