Utilisation des fichiers de commandes pour maîtriser
l'édition des liens
De base un kit 68332 ne possède pas de système
d'exploitation mais un "simple" moniteur résident en EPROM
le 162Bug. Ce moniteur permet
de charger un programme en mémoire et de lancer sont
exécution.
Lancer l'exécution d'un programme n'est pas aussi simple qu'il
n'y parait. Sur
une station de travail la complexité du chargement et du
lancement du programme
en mémoire est masquée par le système
d'exploitation. Sur un kit 68332
c'est le programmeur qui doit charger et lancer en mémoire ses
programmes. Un simple
go a l'adresse d'implantation en mémoire de la fonction main()
ne suffit
pas. L'exécution du sous/programme main doit être faite
sous le contrôle d'un programme
appelé startup. Le startup doit
effectuer l'interface logiciel entre le
système cible
et le programme utilisateur. Pour un kit 68332 le
startup
écrit en assembleur
reste simple: il doit au minimum initialiser les registres de piles,
appeler le sous-programme main et redonner la main au moniteur du kit.
Mais vous pouvez aussi initialiser
de la mémoire (un vecteur d'interruption par exemple) ou
configurer des circuits
périphériques (pia, ptm,...):
début Initialisation logiciel (mémoire, registres,...)
Initialisation matériel (circuit d'entrées/sorties,...)
Appel du programme utilisateur (fonction main)
Retour au moniteur
L'utilisation d'un startup est donc
obligatoire. Elle nécessite
d'assembler et de compiler séparément les modules en
assembleur et en langage C pour effectuer proprement
l'éditions
des liens
Étude d'un exemple simple sur kit68332
Les sources des fichiers qui suivent sont dans le répertoire
$kits68k/exemple/LinkCom.
Algorithme du startup minimum:
début Initialisation du registre de pile Appel de la fonction
main Retour au moniteur
end
Ce qui donne en assembleur (fichier startup332.s):
-
SECT
startup00 ;
Déclaration de la section
-
; Déclarations des symboles externes:
-
XREF
_main
; nom de la fonction principale
-
; Déclarations des symboles publics:
-
XDEF
exitkit
; S/P d'appel du moniteur
-
; Début du startup entry
-
MOVE.L #20000H,A7 ; init pile utilisateur
-
JSR
_main
; appel du sous/programme principal utilisateur
- exitkit TRAP
#15
; retour au moniteur du kit
- DC.W $63
Explication:
La directive SECT permet de nommer une section de code ou de
données. La directive XREF permet de faire
référence à un symbole déclaré dans
un autre module. Ici le symbole externe est _main qui est le nom objet
donné après compilation du fichier .c contenant
la fonction main(). La directive XDEF permet de rendre
accessible à un autre module un symbole local ici exitkit.
Ainsi un autre module pourra faire référence a ce
symbole.
Il suffit de lancer la commande a68: a68 startup00 Ce qui a pour effet
de générer un module objet startup00.o en code
opératoire 68k translatable.
Compilation du fichier C d'exemple test.c:
Il suffit de lancer la commande c68: c68 test Ce qui a pour effet de
générer un module objet test.o en code opératoire
68000 translatable.
Edition des liens :
Avant d'effectuer l'éditions des liens il faut imaginer
l'emplacement des différentes sections de code, de
données et de constantes dans la mémoire du kit cible: début
de la mémoire utilisateur sur kit 68000
=================================================================
000800h début de la section startup . . /
Initialisation du registre de pile . Code du Startup - Appel de la
fonction main . \ Retour au moniteur . . fin de la section de startup -----------------------------------------------------------------
. début de la section prog (code utilisateur) . . Elle
contient le code du fichier test.c et en . particulier le code de la
fonction main ainsi que . les éventuels appels aux routines des
librairies . standards. . . fin de la section prog du code
utilisateur --------------------------------------------- .
Puis suivent les sections const et data qui contiennent
. les constantes et les données de la section code utilisateur. -----------------------------------------------------------------
. Et enfin les autres sections: lib, libc, libm ,... . . Code des
fonctions des librairies standards appelées . par le code
utilisateur. -----------------------------------------------------------------
. . 01FFFFh
=================================================================
fin de la mémoire utilisateur sur kit 68000 Pour obtenir un
mapping mémoire identique a celui montre ci-dessus on doit
donner des directives a l'éditeur des liens (commande l68) par
l'intermédiaire d'un fichier de commande souvent appèle
LinkCom.k. La commande l68 va chercher les directives d'édition
des liens dans un fichier qui porte une extension en .k et qui doit
être dans le répertoire local de travail. Si ce fichier
est absent, la commande l68 va chercher un fichier de commande par
défaut. Dans notre exemple le fichier de commande des liens est test.k:
CHIP 68000
ORDER startup00,prog,const,lib,libc,data,libdata,libcdata
SECT startup00 = $800
LOAD startup00.o
LOAD /usr/hp64000/lib/68000/libm.a
LOAD /usr/hp64000/lib/68000/libc.a
LOAD /usr/hp64000/lib/68000/lib.a
END
Description du fichier test.k :
La directive CHIP précise le type du processeur. La
directive ORDER permet de spécifier l'ordre de placement
en mémoire des différentes sections de code, de
constantes et de donnees. Donc ici toutes les section de code
nommées startup00 des modules objets seront placées en
mémoire avant toutes les autres sections. La section suivante
sera prog, ect... La directive SECT permet de preciser
l'adresse de début d'une section. SECT startup00 = $800
fait commencer la section startup00 a partir de l'adresse 800 hexa. Les
autres sections (prog, const, lib,...) serront placees apres la section
startup comme le précise la directive ORDER. La
directive LOAD précise un module objet (en .o) ou une
librairie (en .a) qui doit etre charge. Le module objet contient des
sections de code opératoire translatable d'un ensemble de
routines et de données. Une librairie n'est qu'un fichier
archive qui contient un ensemble de fichiers objets.
Execution de l'edition des liens :
Il suffit de lancer la commande l68: l68 test Ce qui a pour effet de
générer un fichier téléchargable test.s29.
Avant de tester le programme regardez le fichier test.map
pour vérifier que les adresses d'implantation des sections sont
dans la mémoire utilisateur.
Les entrées/sorties sur kit 68332.