Contenido>Indice>Intro CursoC51

INTRODUCCIÓN


C es un lenguaje bastante conciso y en ocasiones desconcertante. Considerado ampliamente como un lenguaje de alto nivel, posee muchas características importantes, tales como: programación estructurada, un método definido para llamada a funciones y para paso de parámetros, potentes estructuras de control, etc. 

Sin embargo gran parte de la potencia de C reside en su habilidad para combinar comandos simples de bajo nivel, en complicadas funciones de alto nivel, y en permitir el acceso a los bytes y words del procesador. En cierto modo, C puede considerarse como una clase de lenguaje ensamblador universal. La mayor parte de los programadores familiarizados con C, lo han utilizado para programar grandes máquinas que corren Unix o últimamente MS-DOS. En estas máquinas el tamaño del programa no es importante, y el interface con el mundo real se realiza a través de llamadas a funciones o mediante interrupciones DOS. Así el programador en C sólo debe preocuparse en la manipulación de variables, cadenas, matrices, etc.

Con los modernos microcontroladores de 8 bits, la situación es algo distinta. Tomando como ejemplo el 8051, el tamaño total del programa debe ser inferior a los 4 u 8K, y debe usarse menos de 128 o 256 bytes de RAM. Idealmente, los dispositivos reales y los registros de funciones especiales deben ser direccionados desde C. Las interrupciones, que requieren vectores en direcciones absolutas también deben ser atendidas desde C. Además, se debe tener un cuidado especial con las rutinas de ubicación de datos para evitar la sobre-escritura de datos existentes. 

Uno de los fundamentos de C es que los parámetros (variables de entrada) se pasan a las funciones (subrutinas) en la pila, y los resultados se devuelven también en la pila. Así las funciones pueden ser llamadas desde las interrupciones y desde el programa principal sin temor a que las variables locales sean sobre-escritas (re-entrancia).

Una seria restricción de la familia 8051 es la carencia de una verdadera pila. En un procesador como el 8086, el apuntador de la pila tiene al menos 16 bits. Además del apuntador de pila, hay otros registros que pueden actuar como apuntadores a datos en la pila, tal como el BP (Base Pointer). En C, la habilidad para acceder a los datos en la pila es crucial. Como ya ha sido indicado, la familia 8051 está dotada de una pila que realmente sólo es capaz de manejar direcciones de retorno. Con 256 bytes disponibles, como máximo, para la pila no se pueden pasar muchos parámetros y realizar llamadas a muchas funciones.

De todo ello, puede pensarse que la implementación de un lenguaje que como C haga un uso intensivo de la pila, es imposible en un 8051. Hasta hace poco así ha sido. El 8051, hace tiempo que dispone de compiladores C, que en su mayor parte han sido adaptados de micros más potentes, tal como el 68000. Por ello la aproximación al problema de la pila se ha realizado creando pilas artificiales por software. Típicamente se ha apartado un área de RAM externa para que funcione como una pila, con la ayuda de rutinas que manejan la pila cada vez que se realizan llamadas a funciones. Este método funciona y proporciona capacidad de re-entrancia, pero a costa de hacer los programas muy lentos. Por lo tanto, con la familia 8051, la programación en lenguaje ensamblador ha sido la única alternativa real para el desarrollo de pequeños sistemas en los que el tiempo es un factor crítico.

Sin embargo, en 1980, Intel proporcionó una solución parcial al problema al permitir la programación del 8051 en un lenguaje de alto nivel llamado PLM51. Este compilador no era perfecto, había sido adaptado del PLM85 (8085), pero Intel fue lo suficientemente realista para evitar el uso de un lenguaje totalmente dependiente del uso de la pila.

La solución adoptada fue sencillamente pasar los parámetros en áreas definidas de memoria. Así cada función o procedure tenía su propia área de memoria en la que recibía los parámetros, y devolvía los resultados. Si se utilizaba la RAM interna para el paso de parámetros, la sobrecarga de las llamadas a funciones era muy pequeña. Incluso utilizando RAM externa, siempre más lenta que la RAM interna, se consigue mayor velocidad que con una pila artificial.

El problema que tiene esta especie de "pila compilada" es que la re-entrancia no es posible. Esta aparentemente seria omisión, en la práctica no tiende a causar problemas con los típicos programas del 8051. Sin embargo las últimas versiones de C51 permiten la re-entrancia selectiva, es decir permiten que unas pocas funciones críticas sean re-entrantes, sin comprometer la eficiencia de todo el programa.

Otras consideraciones dignas de destacar para el C en un microcontrolador son:

  1. Control de los periféricos internos y externos del chip.
  2. Servicio de las interrupciones.
  3. Hacer el mejor uso de los limitados conjuntos de instrucciones.
  4. Soportar diferentes configuraciones de ROM/RAM.
  5. Un alto nivel de optimización para conservar el espacio de código.
  6. Control de la conmutación de registros.
  7. Soporte para los derivados de la familia (87C751, 80C517 etc.).

El compilador Keil C51 contiene todas las extensiones para el uso del lenguaje C con microcontroladores. Este compilador C utiliza todas las técnicas apuntadas por Intel con su PLM51, pero añade características propias tales como la aritmética en coma flotante, la entrada/salida (I/O) con formato, etc. Se trata de la implementación del estándar ANSI C específico para los procesadores 8051.


   Contenido>Indice>Intro CursoC51