85 | | Cette archive contient les fichiers généraux suivants, extraits de la plate-forme SoCLib : |
86 | | * `vci_param.h` : definition des paramètres VCI. |
87 | | * `vci_signals.h` : definition d'un canal VCI. |
88 | | * `vci_initiator.h` : définition d'un port VCI initiateur. |
89 | | * `vci_target.h` : définition d'un port VCI cible. |
90 | | * `int_tab.h` : définition des index composites. |
91 | | * `segment.h` : définition d'un segment de l'espace adressable. |
92 | | * `segment.cpp` : implémentation des méthodes du segment. |
93 | | * `mapping_table.h` : définition de la mapping table. |
94 | | * `mapping_table.cpp` : implémentation des méthodes de la mapping table. |
95 | | * `address_decoding_table.h` : table indexée par une partie de l'adresse. |
96 | | * `address_decoding_table.cpp` : implémentation des méthodes de la table indexée. |
97 | | * `alloc_elems.h` : allocation de tableaux d'objets complexes |
98 | | * `exception.h` : traitement et report d'erreurs |
99 | | |
100 | | L'archive contient également les fichiers suivants : |
| 85 | Cette archive contient un très grand nombre de fichiers, car les composants instanc!és sont des objets complexes, |
| 86 | qui font appel à beaucoup de code ''caché'' (analyse du format de fichier binaire ELF et chargement de ce code binaire dans les mémoires embarquées ROM ou RAM, ou ouverture d'une fenêtre XTERM pour le composant TTY). |
| 87 | Nous ne les décrivons pas en détail, mais vous pouvez consulter le fichier ''Makefile'' pour avoir la liste de tous les |
| 88 | fichiers objets qui doivent être compilés pour générer le simulateur. |
| 89 | |
| 90 | L'archive contient en particulier les fichiers suivants : |
118 | | Cette architecture nécessite la définition de 6 segments: |
119 | | |
120 | | * '''seg_tty''' est le segment associé au contrôleur de terinaux TTY. On prendra pour adresse de base la valeur 0xC0000000, et pour longueur 64 octets, ce qui permet d'adresser jusqu'à 4 terminaux indépendants (consulter la spécification fonctionnelle du composant VciMultiTty). |
121 | | * '''seg_lcd''' est le segment associé au coprocesseur LCD. On prendra pour adresse de base la valeur 0xD0000000. La longueur de 16 octets correspond aux quatre registres adressables de ce composant. |
| 107 | Cette architecture nécessite la définition de 7 segments: |
| 108 | |
| 109 | * '''seg_tty''' est le segment associé au contrôleur de terminaux TTY. On prendra pour adresse de base la valeur 0xC0000000, et pour longueur 64 octets, ce qui permet d'adresser jusqu'à 4 terminaux indépendants (consulter la spécification fonctionnelle du composant VciMultiTty). |
| 110 | * '''seg_lcd''' est le segment associé au coprocesseur LCD. On prendra pour adresse de base la valeur 0xB0000000. La longueur de 16 octets correspond aux quatre registres adressables de ce composant. |
123 | | * '''seg_giet''' est le segment contenant le code du Gestionnaire d'Interruptions, Exceptions, et Trappes (GIET). Il est assigné à la RAM. L'adresse de base 0x80000000 est imposée par la spécification du processeur MIPS32. On choisira une capacité de stockage de 4 Koctets. |
124 | | * '''seg_code''' est le segment contenant le code de l'application logicielle embarquée. Il est assigné à la RAM. On choisira pour adresse de base la valeur 0x00400000, et une capacité de stockage de 16 Koctets. |
125 | | * '''seg_data''' est le segment contenant les données globales et la pile d'exécution de l'application logicielle embarquée. Il est assigné à la RAM. On choisira pour adresse de base la valeur 0x10000000, et une capacité de stockage de 64 Koctets. |
126 | | |
127 | | Contrairement à ce que nous avons fait dans le TP2, on ne définit pas les caractéristiques des segments (adresse de base et longueur) |
128 | | directement dans le fichier ''tp3_top.cpp'', car ces valeurs sont maintenant utilisées à la fois par le matériel et par le logiciel embarqué, |
129 | | qui a besoin des adresses de base des différents périphériques. |
| 112 | * '''seg_kernel''' est le segment contenant le code du système qui s'exécute en mode ''kernel''. Il s'agit principalement du Gestionnaire d'Interruptions, Exceptions, et Trappes (GIET) et du code des appels systèmes. Ce segment est assigné à la RAM. L'adresse de base 0x80000000 est imposée par la spécification du processeur MIPS32 qui impose que le point d'entrée est à l'adresse 0x80000180. On choisira une capacité de stockage de 4 Koctets. |
| 113 | * '''seg_text''' est le segment contenant le code de l'application logicielle embarquée, qui s'exécute en mode ''user''. Il est assigné à la RAM. On choisira pour adresse de base la valeur 0x00400000, et une capacité de stockage de 16 Koctets. |
| 114 | * '''seg_data''' est le segment contenant les données globales et la pile d'exécution de l'application logicielle embarquée. Il est assigné à la RAM. On choisira pour adresse de base la valeur 0x00000000, et une capacité de stockage de 64 Koctets. |
| 115 | * '''seg_stack''' est le segment contenant la pile d'exécution de l'application logicielle embarquée. Il est assigné à la RAM. On choisira pour adresse de base la valeur 0x00800000, et une capacité de stockage de 64 Koctets. |
| 116 | |
| 117 | '''Remarque importante''' : Ces informations de segmentation sont utilisées à la fois par le matériel et par le logiciel embarqué. Elles doivent donc être définies à deux endroits : |
| 118 | 1. Dans le fichier ''tp3_top.cpp'' pour définir le contenu de la !MappingTable, qui est utilisée configurer les |
| 119 | composants matériels. |
| 120 | 1. Dans le fichier ''soft/ldscript'' qui est utilisé par l'éditeur de liens lors de la compilation du logiciel embarqué. |
| 121 | Ce fichier doit définir les adresses de base des différents segments (mémoire et périphériques). |
| 122 | |
132 | | Complêtez le fichier ''tp3_segmentation.h'' qui se trouve dans le répertoire TP3. |
133 | | |
134 | | == 4.2 Génération du logiciel embarqué == |
135 | | |
136 | | Puisqu'on dispose d'un contrôleur de terminal dans l'architecture, le premier programme que vous allez exécuter se contente |
137 | | d'afficher le célèbre ''hello world'' sur le terminal. Ce programme est écrit en langage C. |
138 | | |
139 | | Placez-vous dans le sous-répertoire ''soft''. Ce répertoire contient les fichiers suivants : |
140 | | * '''reset.s''' : ce fichier contient le code de boot. |
141 | | * '''giet.s''' : |
142 | | * '''main.c''' : ce fichier contient le programme principal. |
143 | | * '''Makefile''' : |
| 125 | Complêtez les fichiers ''tp3_top.cpp'' et ''soft/ldsript'' pour définir les adresses de base et les longueurs des segments. |
| 126 | |
| 127 | == 4.2 Compilation du logiciel embarqué == |
| 128 | |
| 129 | Le logiciel embarqué est défini dans plusieurs fichiers source, que vous trouverez dans le répertoire ''soft''. |
| 130 | Certains de ces fichiers sont écrits en assembleur MIPS32, certains sont écrits en C : |
| 131 | * le fichier '''reset.s''' est écrit en assembleur et contient le code de boot qui est exécuté à la mise sous tension, ou lors de l'activation du signal NRESET. Ce code s'exécute en mode ''kernel et initialise quelques registres, avant d'exécuter l'instruction ''eret''. |
| 132 | * le fichier '''giet.s''' est écrit en assembleur et contient le code du Gestionnaire d'Interruption, Exceptions et Trappes. |
| 133 | Ce code s'exécute en mode ''kernel'', et se termine toujours par une instruction ''eret''. |
| 134 | * le fichier '''syscall.s''' est écrit en assembleur et contient le code des quelques appels système disponibles |
| 135 | sur cette plate-forme minimale. Ils s'exécutent en mode ''kernel'', et permettent l'accès aux périphériques. |
| 136 | * le fichier '''stdlib.c''' est la version C des appels système définis dans le fichier ''syscalls.s''. Ces fonction C se contentent d'encapsuler l'instruction assembleur ''syscall'' après avoir placé les valeurs des arguments dans les registres appropriés. Elles peuvent donc être appelées depuis un programme s'exécutant en mode ''user''. |
| 137 | * le fichier '''main.c''' est écrit en C et contient n'importequelle application logicielle qui se contente des quelques |
| 138 | appels systèmes d"finis dans ''stdlib.c''. |
| 139 | * le fichier ''Makefile'' permet de lancer la compilation du logiciel embarqué. |
| 140 | |
| 141 | On peut considérer que les trois fichiers ''reset.s'', ''giet.s'', et ''syscalls.s'' jouent le rôle d'un système d'exploitation |
| 142 | extrêmement réduit, qui se contente de lancer une unique application en mode ''user'', en protègeant l'accès aux |
| 143 | périphériques et à la mémoire. |
| 144 | |
| 145 | Question : Quels sont les appels système disponibles?qui (un tout petit bombre |
| 146 | |
| 147 | On rappelle que l'instruction ''eret'' modifie le registre SR pour que le processeur passe passe en mode ''user'' et se branche à l'adresse (registres généraux et registres systèmedu processeur |
| 148 | ou du coprocesseur |
| 149 | |
| 150 | Puisqu'on dispose d'un contrôleur de terminal dans l'architecture, le premier programme que vous allez exécuter se contentera d'afficher le célèbre ''hello world'' sur le terminal, en utilisant la fonction C ''fputs()''. N'oubliez pas de |
| 151 | terminer proprement le programme par un appel à la fonction C ''exit()''. |
| 152 | |