Tengo la necesidad de inicializar los registros ARM de mi placa de desarrollo ARM7TDMI a valores específicos usando 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 una decisión inteligente. Y mirando el depurador, no hay garantía de que la inicialización ocurra según mi solicitud. Por ejemplo, el valor 0x2 puede almacenarse en el registro r12 en lugar de r2 como lo solicité en mi ensamblaje en línea.
a.c(102): warning: #1267-D: Implicit physical register R0 should be defined as a variable
Leyendo la documentación de Keil http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka11441.html sugiere usar 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? Algunas ideas ?
Gracias
El IDE que está utilizando, como la mayoría de los IDE, automatiza la inicialización de la CPU al nivel más bajo. Se encarga de generar, por ejemplo, el contenido de la tabla de vectores.
Al utilizar un lenguaje de mayor nivel que ensamblador, todo lo relacionado con la manipulación de registros e inicialización queda bastante oculto, especialmente si se habilitan optimizaciones del compilador.
Creo que debería escribir el código crítico en ensamblador para garantizar el rendimiento de la CPU. Quizás el resto de su aplicación pueda desarrollarse al más alto nivel, teniendo el código de bajo nivel como biblioteca.
Uso 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
}
houston-fortney
estrella de rock
Wouter van Ooijen
david tweed