Contenido>Indice>Intro CursoC51

EXCLUSIÓN DE RANGOS DE MEMORIA EN XDATA


En gran parte lo que sigue tiene relación con la sección anterior. Ocasionalmente un dispositivo mapeado en memoria, tal como un chip de reloj, se utiliza como reloj y como RAM. Típicamente los primeros 8 bytes del chip están relacionados con el reloj, y se utilizan para almacenar los segundos, minutos, etc, y los restantes 248 bytes son RAM.

Si al linker L51 no se le informa en sentido contrario, coloca las variables xdata a partir de la dirección cero. Y si el reloj está mapeado en dirección 0, los accesos a las variables xdata sobre-escribirán las posiciones destinadas al reloj. Además suele ser conveniente referirse a los registros de forma individual.

Una solución consiste en definir un módulo especial que contenga solamente una estructura que describa los registros del reloj. En el programa principal, los accesos a los registros del reloj se hacen igual que a los elementos de una estructura. El truco para evitar la sobre-escritura descrita antes, consiste en asignar a este módulo especial la dirección 0, durante el proceso de linkado. Así el linker coloca esta estructura en la dirección 0, y a continuación coloca el resto de las variables XDATA. Este método puede utilizarse para evitar que L51 coloque variables en determinadas áreas de memoria. Veamos un ejemplo de exclusión de áreas específicas con L51:

/* Estructura situada en la dirección de base del chip de reloj */

Módulo MAIN.C

extern xdata struct {   unsigned char segundos;
                unsigned char minutos;
                unsigned char horas;
                unsigned char dias; } RTC_chip ;

/* Otros objetos XDATA */

xdata unsigned char uc_seg, uc_min;

void main(void) {

uc_seg = RTC_chip.segundos ; 
uc_min = RTC_chip.minutos ;

}

 

Módulo RTCBYTES.C
xdata struct { unsigned char segundos;
               unsigned char minutos ;
               unsigned char horas   ;
               unsigned char dias    ; } RTC_chip ;

 

Llamada al Linker para ubicar la estructura RTC_chip sobre los registros reales del reloj:

l51 main.obj,rtcbytes.obj XDATA(?XD?RTCBYTES(0h))  

   Contenido>Indice>Intro CursoC51