TODOPIC
Otros Microcontroladores / Dispositivos programables => Microcontroladores ARM => Mensaje iniciado por: Krlosb en 28 de Enero de 2013, 05:27:26
-
Buenos dias Amigos, soy nuevo en este foro. Tengo un pequeño problema con unos punteros. Estoy trabajando con la familia k60 de Freescale.
Tengo una tabla de codigo con unos textos los cuales quiero visualizar. La rutina para visualizar le paso la dirección del primer dato a visualizar pero me pasara una dirección erronea a la rutina.
const unsigned char VERSION[2][16]={
" MODELO ",
" CM8V001R01 "};
SacaLCD((unsigned long*) &VERSION[0][0],16,LINSUP,0);
void SacaLCD(unsigned long *dir,unsigned char longitud,unsigned char linea,unsigned char pos){
unsigned char a;
WriteLCDCTR(linea|pos); // Se posiciona en el LCD
for(a=0;a<longitud && *dir!='\0';a++,dir++)
WriteLCD(*dir); // Visualiza el dato
}
Si la dirección del priemer byte de VERSION[0][0] es 0x000046b9 , cuando entre en la rutina SacaLCD la dirección que me llega ( dir ) es 0x000048e8. He probado direfentes modificaciones, el puntero en char, int, pero siempre me pasa la dirección erroneamente. Si declaro la variable VERSION en RAM me la pasa correctamente. Pero deseo que sea una tabla de código.
Esto lo hacía siempre así trabajando con el complilador keil uvision para 8051, ahora el codewarior funciona diferente y no me reconoce correctamente esto. A Alguien le ha pasado algo así ?
-
Bueno ya lo he solucionado.
Es cosa del compilador. Debemos entrar en propiedades del proyecto.
C/C++ Build
Settings
ARM Compiler - Processor
Desactivar las pestañas Position-Independent Code y Position-Independent Data.
De esta manera consigo que me pase la dirección de la tabla correctamente a la rutina. :)
Saludos.
-
Hola! Bienvenido al foro! Y gracias por dar la solución al problema.
Saludos!