Contenido>Indice>Intro CursoC51

LAS MACROS XBYTE Y XWORD


Para permitir que los dispositivos mapeados en memoria, sean accesibles desde C, se requiere un método para que los apuntadores señalen a direcciones fijas de memoria. Con C51 hay varias formas de lograrlo, la más sencilla de las cuales consiste en utilizar las macros XBYTE[dir16] y XWORD[dir16].

Por ejemplo, el acceso al registro PORT8_DDI de un dispositivo de IO mapeado en la dirección 0x8000 de memoria, se realiza de la siguiente manera:

    #include "absacc.h";  /* Contiene las definiciones de las macros */
    #define port8_ddi   XBYTE[0x8000]
    #define port8_data  XBYTE[0x8001]

Y se usan así:

    port8_ddi = 0xFF       ;
    input_val = port8_data ;

Para acceder a una palabra situada en una dirección par de memoria externa:

    #define word_reg XWORD[0x4000] /* Palabra en dirección 0x8000 */
/* pues la dirección byte 0x8000 corresponde a la dirección word 0x4000 */

La dirección indicada por "word_reg" es fija y queda fijada en tiempo de compilación. Dentro de los corchetes solo se acepta una constante. 

No es posible cambiar la dirección apuntada con métodos basados en el uso de estas macros. Sin embargo, es el mejor método para direccionar posiciones fijas en el hardware, que no van a cambiar en tiempo de ejecución.

Prescindiendo de la macro XWORD, la línea C equivalente sería:

    #define word_reg_ptr ((unsigned int *) 0x24000L)
/* crea un puntero genérico a unsigned en xdata apuntando a dir 0x8000 */
/* pues la dirección byte 0x8000 corresponde a la dirección word 0x4000 */

Que se utilizaría así:

    *word_reg_ptr = 0xFFFF ;

Veamos el código generado en algunos casos:

; #define XBYTE ((unsigned char volatile *) 0x20000L) 
; #define XWORD ((unsigned int volatile *) 0x20000L)
; 
; main() {

	RSEG  ?PR?main?T2
	USING	0
main:
; char x ;
; int  y ;
; 
; x = XBYTE[0x8000]       ;
	MOV  	DPTR,#08000H
	MOVX 	A,@DPTR
	MOV  	x?040,A
; 
; y = XWORD[0x8000/sizeof(int)] ;
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	y?041,R6
	MOV  	y?041+01H,A
; } 
	RET  	
; END OF main

 

El uso del tipo de almacenamiento volatile, resulta esencial para evitar que el optimizador elimine lecturas de datos desde los puertos. Véase la Capítulo 7 "El tipo de almacenamiento "volatile" " para más detalles.

Nota: es necesario incluir el fichero de encabezamiento "absacc.h", que contiene la definición de las macros XBYTE, XWORD, etc. 


   Contenido>Indice>Intro CursoC51