53 | | Il existe plusieurs façons de définir et de générer le code binaire qui sera exécuté par le (ou les) processeur(s) du |
54 | | MPSoC. Si on part d'une application logicielle écrite en langage C, il faut utiliser un cross-compilateur spécifique |
55 | | pour le processeur choisi. Le résultat est un fichier binaire au format ELF. Le code binaire correspondant doit ensuite |
56 | | être chargé dans les mémoires embarquées du MPSoC. Il y a donc deux étapes bien distinctes pour la génération et le chargement. |
57 | | |
58 | | == 3.1 Génération du code == |
59 | | |
60 | | Les composants de la bibliothèque SoCLib permettent de modéliser des architectures matérielles complexes, capables d'exécuter des |
61 | | systèmes d'exploitation généralistes (tels que LINUX ou NetBSD), ou des systèmes d'exploitation spécialisés pour MPSoC (tels que [https://www.mutek.fr/ MutekH]. Mais dans ce TP et les suivants, on se contentera d'un |
62 | | système d'exploitation minimal, constitué par un Gestionnaire d'Interruptions, Exceptions et Trappes (GIET). Cet OS minimal fournit quelques appels systèmes |
63 | | permettant aux programmes utilisateurs d'accéder aux périphériques, il traite les requêtes d'interruption vectorisées, et facilite le debug du logiciel embarqué en signalant les exceptions. |
64 | | Le code du GIET est écrit en C et en assembleur MIPS32. |
65 | | |
66 | | Les processeurs disponibles dans SoCLib sont principalement des processeurs RISC, capables |
67 | | de démarrer une instruction à chaque cycle, grâce à leur structure pipe-line. |
68 | | Le processeur doit, à chaque instruction (donc à chaque cycle) lire l'instruction dans le cache, la décoder et l'exécuter. En cas de MISS, c'est le contrôleur |
69 | | du cache qui se charge de délencher une transaction VCI pour aller lire le code binaire chargé dans les mémoires embarquées. |
70 | | |
71 | | Le code binaire doit donc être généré par un cross-compilateur spécifique pour le processeur Mips32. On utilise la chaîne de compilation GCC, pour compiler l'ensemble du logiciel embarqué (code applicatif et code système) et pour réaliser l'édition de liens entre le code applicatif écrit par vous, et le code système. Le résultat de cette compilation est un fichier au format ELF, contenant le code binaire exécutable par le processeur MIP32. |
| 53 | Si l'application logicielle est écrite en langage C, il faut utiliser un cross-compilateur C spécifique |
| 54 | au processeur embarqué pour compiler ce code applicatif, ainsi que le code du système d'exploitation embarqué. |
| 55 | Le résultat est un fichier binaire au format ELF, qui doit ensuite être chargé dans les mémoires embarquées du MPSoC. |
| 56 | |
| 57 | == 3.1 Gestionnaire d'Interruptions, exceptions et Trappes == |
| 58 | |
| 59 | Les composants de la bibliothèque SoCLib permettent d'exécuter des systèmes d'exploitation généralistes (tels que LINUX ou NetBSD), ou des systèmes d'exploitation spécialisés pour MPSoC (tels que [https://www.mutek.fr/ MutekH]. Dans ce TP et les suivants, on se contentera d'un |
| 60 | système d'exploitation minimal, constitué par un Gestionnaire d'Interruptions, Exceptions et Trappes (GIET). Le GIET fournit quelques appels systèmes permettant aux programmes utilisateurs d'accéder aux périphériques, il traite les requêtes d'interruption vectorisées émises par les périphériques, et facilite le debug du logiciel embarqué en signalant les exceptions. |
| 61 | |
| 62 | Vous pouvez consulter le code source du système d'exploitation dans le répertoire |
| 63 | {{{ |
| 64 | /users/cao/alain/ue_almo/soft/giet |
| 65 | }}} |
| 66 | |
| 67 | * le fichier '''giet.s''' est écrit en assembleur et contient le code du Gestionnaire d'Interruption, Exceptions et Trappes. Le GIET est l'unique point d'entrée dans le système d'exploitation. Ce code s'exécute en mode ''kernel'', et se termine toujours par une instruction ''eret''. |
| 68 | * les fichier '''stdio.c''' et '''stdio.h''' sont écrits en C, et contiennent le code des appels systèmes permettant à un programme s'exécutant en mode ''user'' d'accéder aux périphériques. |
| 69 | * les fichiers '''drivers.c''' et '''drivers.h''' sont écrits en C et contiennent le code des fonctions systèmes qui s'exécutent en mode kernel, qui accèdent effectivement aux périphériques ou aux registres protégés du processeur. |
| 70 | * le fichier '''isr.s''' contient le code des routines de traitement des interruptions (Interrupt Service Routine). |
| 71 | |
| 72 | == 3.2 Génération du code == |
| 73 | |
| 74 | Le code binaire doit être généré par un cross-compilateur spécifique pour le processeur Mips32. On utilise la chaîne de compilation GCC, pour compiler l'ensemble du logiciel embarqué (code applicatif et code système) et pour réaliser l'édition de liens entre le code applicatif, et le code système. Le résultat de cette compilation est un fichier au format ELF, contenant le code binaire exécutable par le processeur MIP32. Le code du GIET étant tès compact, on recompilera l'ensemble du code source (y compris le code système) à chaque modification du code de l'application. |
122 | | |
123 | | Le logiciel embarqué est défini dans deux types de fichiers. |
124 | | |
125 | | Vous pouvez consulter le code source générique du système d'exploitation dans le répertoire |
126 | | {{{ |
127 | | /users/cao/alain/ue_almo/soft/giet |
128 | | }}} |
129 | | |
130 | | * le fichier '''giet.s''' est écrit en assembleur et contient le code du Gestionnaire d'Interruption, Exceptions et Trappes. Le GIET est l'unique point d'entrée dans le système d'exploitation. Ce code s'exécute en mode ''kernel'', et se termine toujours par une instruction ''eret''. |
131 | | * les fichier '''stdio.c''' et '''stdio.h''' sont écrits en C, et contiennent le code des appels systèmes permettant à un programme s'exécutant en mode ''user'' d'accéder aux périphériques. |
132 | | * les fichiers '''drivers.c''' et '''drivers.h''' sont écrits en C et contiennent le code des fonctions systèmes qui s'exécutent en mode kernel, qui accèdent effectivement aux périphériques ou aux registres protégés du processeur. |
133 | | * le fichier '''isr.s''' contient le code des routines de traitement des interruptions (Interrupt Service Routine). |