Contenido>Indice>Intro CursoC51

VARIABLES



Naturalmente todas las variables residen en RAM, la configuración de la RAM puede verse en el Capítulo 2 "Localización física de los espacios de memoria".

Variables no inicializadas

La directiva '#pragma SMALL' determina el modelo de memoria global. En este caso, todas las variables se colocan en RAM interna. Sin embargo, se puede forzar la residencia de algunas variables en áreas específicas de memoria, como sigue:

    #pragma SMALL
      .
      .
      unsigned char xdata velocidad_motor ;
      char xdata gran_array_de_variables[192] ;

Ahora la variable velocidad_motor se coloca en RAM externa. En el caso del array, no es posible colocarlo en RAM interna, debido a que el tamaño máximo de la misma es de 128 bytes.

Otro ejemplo es:

      .
    #pragma LARGE
      .
      .
      .
      función(unsigned char data para1)
      {
      unsigned char data variable_local ;
      .
      .
      .
      }

Aquí, los parámetros de la función se colocan en RAM interna para reducir el tiempo de llamada a la función. En caso de omitir la palabra 'data', los parámetros de la función residirían en XDATA, tal como corresponde al modelo de memoria LARGE.

En este caso puede ser mejor declarar la función como SMALL, aunque en el resto del programa se utilice el modelo LARGE. Esta técnica se utiliza para producir unas pocas funciones muy rápidas en programas grandes obtenidos con el modelo LARGE.

Si el sistema dispone de RAM externa paginada en el puerto P0, la directiva apropiada es pdata.

Véanse las notas del capítulo2 "Elección del mejor modelo de memoria" para ubicación óptima de variables.

Inicialización de Variables

El lenguaje C garantiza que en ausencia de una inicialización explícita, sólo las variables externas y las estáticas toman valor inicial cero. Si se desea un valor distinto a cero, o se quiere forzar un valor inicial para una variable que no sea externa, ni estática, es muy útil declarar e inicializar las variables al mismo tiempo, tal como se muestra a continuación:

    unsigned int velocidad_motor = 0x20 ;

    función()
      {
      .
      .
      }

Aquí se escribe el valor 0x20 en la variable antes de que cualquier función tenga acceso a la misma. Para lograrlo, el compilador reúne todos los valores iniciales de las variables en una tabla, y pasa el control del programa al módulo "startup.obj", que copia los valores de la tabla en las direcciones apropiadas de RAM, llamando seguidamente a la función main().

Es responsabilidad del usuario modificar el fichero en ensamblador "startup.a51" para informar al compilador del tamaño y dirección inicial de la memoria RAM disponible en su sistema hardware. Si se utiliza el modelo de memoria LARGE los parámetros a cambiar en "startup.a51" son: XDATASTART y XDATALEN.

 


   Contenido>Indice>Intro CursoC51