Contenido>Indice>Intro CursoC51

ESPECIFICACIÓN LOCAL DEL MODELO DE MEMORIA



C51 permite asignar modelos de memoria a funciones individuales. Dentro de un mismo módulo, las funciones pueden declararse como SMALL, COMPACT o LARGE así:

#pragma COMPACT 
/* Una función con modelo SMALL */ 
void fsmall(void) small { 
   printf("HELLO") ;
   } 
/* Una función con modelo LARGE */ 
void flarge(void) large { 
   printf("HELLO") ;
   } 
main() { 
   fsmall() ;  // Llamada a función small.
   flarge() ;  // Llamada a función large. 
   } 

Un aspecto a vigilar en proyectos multi-modelo

Supongamos que un programa C51 utiliza el modelo COMPACT para todas sus funciones excepto para las funciones de interrupción, para las que se desea utilizar el modelo SMALL que resulta más rápido. En estos casos, de no actuar correctamente, el linker puede emitir mensajes del tipo MULTIPLE PUBLIC DEFINITION refiriéndose por ejemplo a la función putchar().

Ello se debe a que en los módulos compilados como COMPACT, C51 crea referencias a funciones de la librería COMPACT, mientras que los módulos SMALL acceden a las funciones de la librería SMALL. De esta forma el linker L51 puede encontarse con dos putchars() de distintas librerías.

La solución en este caso consiste en utilizar globalmente el modelo de memoria COMPACT y seleccionar localmente un modelo diferente para ciertas funciones.

Ejemplo:

#pragma COMPACT
    void fast_func(void) small{
    /* código */
    }
  

   Contenido>Indice>Intro CursoC51