Changes between Version 14 and Version 15 of SoclibCourseTp3


Ignore:
Timestamp:
Sep 16, 2009, 8:00:03 PM (16 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SoclibCourseTp3

    v14 v15  
    8383}}}
    8484
    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 :
     85Cette archive contient un très grand nombre de fichiers, car les composants instanc!és sont des objets complexes,
     86qui 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).
     87Nous ne les décrivons pas en détail, mais vous pouvez consulter le fichier ''Makefile'' pour avoir la liste de tous les
     88fichiers objets qui doivent être compilés pour générer le simulateur.
     89
     90L'archive contient en particulier les fichiers suivants :
    10191 * `vci_xcache_wrapper.h` : définition du composant `VciXcacheWrapper`
    10292 * `vci_xcache_wrapper.cpp` : méthodes associées
     
    110100 * `vci_vgsb.cpp` : méthodes associées
    111101 * `tp3_top.cpp` : top-cell de l'architecture
    112  * `tp3_segmentation.h` : adresses de base et des longueurs des segments.
    113 
    114 Le répertoire TP3 contient également un sous-répertoire ''soft'' qui est utilisé pour la génération du logiciel embarqué.
     102
     103Elle contient également un sous-répertoire ''soft'' qui est utilisé pour la génération du logiciel embarqué.
    115104
    116105== 4.1 Segmentation de l'espace adressable ==
    117106
    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.
     107Cette 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.
    122111 * '''seg_reset''' est le segment contenant contient le code de ''boot'' exécuté à la mise sous tension. Il est évidemment assigné à la ROM. L'adresse de base 0xBFC00000 est imposée par la spécification du processeur MIPS32. On choisira une capacité de stockage de 4Koctets.
    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
     119composants matériels.
     120 1. Dans le fichier ''soft/ldscript'' qui est utilisé par l'éditeur de liens lors de la compilation du logiciel embarqué.
     121Ce fichier doit définir les adresses de base des différents segments (mémoire et périphériques). 
     122
    130123On définit donc ces valeurs dans un séparé fichier ''tp3_segmentation.h'', qui sera inclus dans tous les fichiers qui ont besoin de cette information.
    131124
    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''' :
     125Complê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
     129Le logiciel embarqué est défini dans plusieurs fichiers source, que vous trouverez dans le répertoire ''soft''.
     130Certains 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.
     133Ce 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
     135sur 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
     138appels systèmes d"finis dans ''stdlib.c''.
     139 * le fichier ''Makefile'' permet de lancer la compilation du logiciel embarqué.
     140
     141On peut considérer que les trois fichiers ''reset.s'', ''giet.s'', et ''syscalls.s'' jouent le rôle d'un système d'exploitation
     142extrêmement réduit, qui se contente de lancer une unique application en mode ''user'', en protègeant l'accès aux
     143périphériques et à la mémoire.
     144 
     145Question : Quels sont les appels système disponibles?qui (un tout petit bombre
     146
     147On 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
     148ou du coprocesseur
     149
     150Puisqu'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
     151terminer proprement le programme par un appel à la fonction C ''exit()''.
     152
    144153Lancez l'exécution du Makefile. Un fichier ''soft.bin'' doit doit être créé dans le répertoire ''soft''.
    145154