= Plateforme matérielle simul_almo_generic = == Plateforme mono-processeur == === Vue graphique === [[Image(wiki:Images:hard_almo_mono_icu_timer_dma_ioc_fbf.png)]] === Brève description === En utilisant la plateforme `simul_almo_generic` sans spécifier d'argument, on obtient une plateforme mono-processeur MIPS32 telle qu'illustrée ci-dessus. Cette plateforme supporte jusqu'à quatre tâches logicielles s'exécutant en pseudo-parallélisme sur un seul processeur . De manière fixe, elle embarque une mémoire morte (`ROM`), une mémoire vive (`RAM`), un concentrateur d'interruptions matérielles (`ICU`), un contrôleur d'horloge (`TIMER`), un contrôleur DMA et un terminal d'entrée/sortie (`TTY`). Un contrôleur de périphérique de bloc (`IOC`) et un contrôleur graphique (`FBF`) peuvent être activés de manière optionnelle. === Arguments === La plateforme mono-processeur peut être lancée avec les arguments suivants : * -SYS : spécifie le chemin vers le fichier contenant le code binaire du système d'exploitation (normalement `sys.bin`) * -APP : spécifie le chemin vers le fichier contenant le code binaire de l'application (normalement `app.bin`) * -NCYCLES : spécifie le nombre de cycles de simulation avant l'arrêt du simulateur * -NTASKS : spécifie le nombre de tâches maximum par processeur (entre 1 et 4) * -NICACHE : spécifie le nombre d'ensembles ('set') pour le cache d'instructions * -NDCACHE : spécifie le nombre d'ensembles ('set') pour le cache de données * -IOCFILE : active le périphérique de bloc et spécifie le chemin vers le fichier qui servira d'image pour ce contrôleur * -FBFSIZE : active le périphérique graphique et spécifie la largeur/hauteur de la fenêtre graphique (en pixels) * -TRACE : spécifie le chemin vers le fichier qui contiendra les informations de tracage * -STATS : spécifie le chemin vers le fichier qui contiendre les informations de statistiques * -DEBUG : spécifie le nombre de cycles à partir duquel le mode débogage est actif * -TOCYCLE : spécifie le nombre de cycles à partir duquel le mode débogage devient inactif * -LATENCY : spécifie la latence du bus (en nombre de cycles) === Cartographie de l'espace adressable === En fonction des adresses croissantes : ||= Adresse =||= Taille =||= Périphérique : Utilisation =|| || 0x00400000 || 0x00004000 || RAM : Code de l'application utilisateur || || 0x10000000 || 0x00080000 || RAM : Données de l'application utilisateur || || 0x20000000 || 0x00001000 || RAM : Pile de l'application utilisateur || || 0x80000000 || 0x00004000 || RAM : Code du système d'exploitation || || 0x81000000 || 0x00004000 || RAM : Données (cachables) du système d'exploitation || || 0x82000000 || 0x00001000 || RAM : Données (non-cachables) du système d'exploitation || || 0x90000000 || 0x00000200 || TTY || || 0x91000000 || 0x00000080 || TIMER || || 0x92000000 || 0x00000020 || IOC || || 0x93000000 || 0x00000100 || DMA || || 0x96000000 || 0x00004000 || FBF || || 0x9F000000 || 0x00000100 || ICU || || 0xBFC00000 || 0x00001000 || ROM : Code de démarrage || === Cartographie des interruptions === Le concentrateur d'interruptions matérielles (`ICU`) est capable de multiplexer jusqu'à 32 interruptions d'entrée vers 1 interruption de sortie (à destination du processeur MIPS32). L'interruption matérielle connectée à l'entrée `i` de l'ICU est notée irq_in[i]. Voici la cartographie des entrées pour la plateforme mono-processeur : ||= Entrée =||= Périphérique =|| || irq_in![0] || IOC || || irq_in![1] || TIMER || || irq_in![2] || DMA || || irq_in![3] || TTY0 : terminal de la tâche n°0 || || irq_in![4] || TTY1 : terminal de la tâche n°1 (n'existe que si NTASKS > 1) || || irq_in![5] || TTY2 : terminal de la tâche n°2 (n'existe que si NTASKS > 2) || || irq_in![6] || TTY3 : terminal de la tâche n°3 (n'existe que si NTASKS > 3) || == Plateforme multi-processeur == Pour une plateforme multi-processeur, les changements sont les suivants : * il n'y a toujours qu'un seul composant `IOC`. * il n'y a également qu'un seul composant pour les autres périphériques (`ICU`, `TIMER`, `DMA` et `TTY`) mais chaque composant possède plusieurs canaux indépendants. Chaque canal a son propre ensemble de registres adressables (en fonction du numéro de processeur) : * un processeur `P[i]` trouvera l'adresse de base du canal `ICU` qui lui est attaché avec la formule suivante : `icu_seg_base + proc_id * ICU_SPAN`. * même comportement pour les autres périphériques. Concernant la cartographie des interruptions, l'idée est la suivante : * `IOC` : une seule interruption, toujours connecté à irq_in![0]. * `TIMER` : une interruption par processeur * `DMA` : une interruption par processeur * `TTY` : une interruption par processeur et par tâche exécutée sur ce processeur Il y a donc (2 + N_TASKS) interruptions par processeur. Le calcul de l'index de la première interruption vers un processeur `P[i]` suit la formule : `irq_base_number = 1 + i * irq_span`. Enfin, on soulignera la contrainte suivante : il est impossible, avec les 32 lignes d'interruption possibles en entrée de l'`ICU`, de supporter la configuration maximale, à savoir 8 processeurs et 4 tâches par processeur. Le maximum supporté sera par exemple, 6 processeurs et 4 tâches/processeur ou 8 processeurs et 2 tâches/processeur.