Contenido>Indice>Intro CursoC51

USO BÁSICO DEL LINKER L51


Estos temas originan cierto grado de confusión, sobre todo en los usuarios de otros compiladores.

El linker,  L51 en el caso de Keil o RL51 en el caso de Intel, es el encargado de combinar los distintos módulos de un programa C. El compilador no asigna direcciones definitivas a las líneas de código que produce, tan solo genera un desplazamiento desde el comienzo del fichero. Obviamente, el código antes de ser ejecutado debe tener asignada una dirección en memoria de código. Este trabajo de asignación también lo realiza el linker que además busca en las librerías el código necesario y lo inserta en el programa ejecutable.

Un ejemplo de invocación del linker es:

l51 startup.obj, modulo1.obj, modulo2.obj, modulo3.obj, C51L.lib to exec.abs

Aquí, el linker combina tres módulos de código objeto y el fichero startup.obj, buscando las funciones de librería necesarias en C51L.lib. Para lograrlo, deberá ajustar las direcciones definitivas de todas las instrucciones JMP y CALL. Como resultado de la combinación de los cinco ficheros anteriores, produce un fichero absoluto o ejecutable llamado EXEC.ABS. El linker también genera otro fichero llamado EXEC.M51, que contiene un resumen de las operaciones realizadas por el linker, y lo que es más importante, con la dirección de todos los símbolos utilizados en el programa, y el tamaño de cada módulo.

Salvo en las aplicaciones sencillas, el número de parámetros que necesita el linker en su invocación puede ser muy elevado. En el sistema operativo DOS, la longitud máxima de la línea de llamada es de 128 caracteres. Si esta longitud resulta insuficiente, es posible utilizar varias líneas terminando cada línea con un & seguido de un retorno de carro. Para facilitar el proceso en las sucesivas llamadas que habitualmente se producen durante la depuración, es posible especificar los parámetros en un fichero ASCII, con lo que la llamada al linker se reduce a:

   l51 @fichero_de_entrada

Siendo el contenido del fichero_de_entrada el siguiente:

   startup.obj,&
   module1.obj,&
   module2.obj,&
   module3.obj,&
   &
   C51L.lib &
   &
   to exec.abs

El linker dispone de controles para determinar la dirección en la cual debe ubicar cada tipo de memoria. Por ejemplo, si la RAM externa del chip comienza en dirección 0x4000, y la memoria de código (EPROM) en la 0x8000, la llamada al linker debe ser:

l51 startup.obj, module1.obj, module2.obj, module3.obj,
C51L.lib to exec.abs CODE(8000H) XDATA(4000H)

Con ello, todas las variables de RAM externa se colocarán a partir de la dirección 0x4000, y el programa ejecutable a partir de la dirección 0x8000. 

Nota: El nuevo entorno de desarrollo para Windows, desarrollado por Keil, y denominado µVision, incluye un editor, un gestor de proyectos, y un gestor de aplicaciones. El nuevo entorno de trabajo, ayuda a mantener actualizados los proyectos cada vez que se realizan cambios en los ficheros fuente, y elimina la necesidad de aprender la compleja sintaxis de llamada al compilador o al linker.


   Contenido>Indice>Intro CursoC51