Contenido>Indice>Intro CursoC51

SOPORTE PARA EL 87C751



El Philips 87C751 se diferencia del 8051 en que solo dispone de 2k de memoria de código, sin que sea posible aumentar la ROM externamente. El compilador C51 puede ser forzado a utilizar las instrucciones de 2 bytes AJMP y ACALL en lugar de las instrucciones de 3 bytes LJMP y LCALL.

87C751 - Pasos a seguir

  1. Invocar a C51 con C51 myfile.c ROM(SMALL) NOINTVECTOR o utilizar "#pragma ROM(SMALL)"
  2. Utilizar el fichero startup INIT751.A51 del directorio LIB.
  3. No utilizar aritmética de coma flotante, divisiones de int o long, printf, scanf etc., ya que utilizan LCALLs.
  4. Se dispone de una librería especial para el 87C751 que contiene llamadas cortas a las funciones de la librería estándar.

Promoción de enteros

Para cumplir con las recientes exigencias ANSI, a partir de la versión 3.40 de C51, las sentencias IF incorporan la promoción de enteros, lo cual facilita la portabilidad desde los compiladores C de Microsoft o Borland. Así, cualquier char dentro de una sentencia condicional se convierte a int antes de realizar cualquier comparación. Esta característica tiene sentido en máquinas de 16 bits que son tan eficientes o más con los int, que con los char, pero produce una pérdida de eficiencia en el 8051. Por ello, Keil proporciona el "#pragma NOINTPROMOTE" para deshabilitar la promoción a enteros. En este caso se puede utilizar un forzado explícito (cast) si otro tipo de dato resulta afectado por la operación.

Este fragmento de C demuestra la importancia de este #pragma:
char c ;
unsigned char c1, c2 ;
int i ;
main() {
   if((char)c == 0xff) c = 0 ;
   if((char)c == -1) c = 1 ;
   i = (char)c + 5 ;
   if((char)c1 < (char)c2 + 4) c1 = 0 ;
   }

Tamaños de código

47 bytes - C51 v3.20 
76 bytes - C51 v5.50 (INTPROMOTE) 
53 bytes - C51 v5.50 (NOINTPROMOTE)

Una vez más se demuestra que la portabilidad compromete la eficiencia en los programas del 8051 ...


   Contenido>Indice>Intro CursoC51