Changes between Version 47 and Version 48 of SoclibCourseTp4


Ignore:
Timestamp:
Nov 30, 2010, 1:27:23 PM (14 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SoclibCourseTp4

    v47 v48  
    11{{{
    22#!html
    3 <h1>TP4 : Outil soclib-cc & communications par interruption</h1>
     3<h1>TP4 : Communications par interruption</h1>
    44}}}
    55[[PageOutline]]
     
    77= 1 Objectif =
    88
    9 Le but de ce quatrième TP est principalement d'introduire la chaîne de compilation '''soclib-cc''', qui permet d'automatiser la génération du (des) simulateurs. On en profitera pour introduire dans l'architecture de nouveaux
    10 composants matériels supportant la communication par interruption entre le(s) processeurs(s) et les périphériques.
     9Le but de ce quatrième TP est d'introduire dans l'architecture de nouveaux
     10composants matériels supportant la communication par interruption entre le(s) processeurs(s) et les périphériques,
     11et d'analyser les écanismes de communication entre un programme utilisateur et un périphérique.
    1112
    12 = 2 Outil soclib-cc =
     13Tous les périphériques utilisent les interruptions, mais il existe deux types de périphériques:
    1314
    14 L'architecture matérielle qui a été modélisée dans le TP3 était très simple
    15 (un seul processeur et 4 cibles), mais il a fallu compiler une cinquantaine de fichiers source (.cpp)
    16 et un nombre encore plus grans de fichiers d'en-tête (.h) pour générer le simulateur.
     15Un contrôleur TTY est un périphérique ''caractère'' car il supporte des requêtes de lecture ou d'écriture d'un seul caractère. Ce type de périphérique est généralement une ciblesur le bus, puisqu'il ne peut que recevoir des
     16commandes, et qu'il n'a pas la possibilité de lire ou d'écrire lui-même  en mémoire.
    1717
    18 Tous ces fichiers proviennent du serveur WEB SoCLib, qui contient lui-même un serveur SVN
    19 permettant d'archiver les différents modèles de simulation. Ce serveur SVN fournit un service de
    20 gestion de versions et supporte le développement coopératif de la plate-forme.
     18Par opposition un périphérique ''bloc'' tel qu'un contrôleur de disque, ou un contrôleur réseau doit tranférer
     19de grosses quantités de données entre la mémoire et le disque. Les transferts se font par blocs (un bloc contenant
     20généralement 512 octets), et ces périphériques ont généralement une capacité DMA : Ils sont à la fois maître et
     21cible sur le bus, et peuvent directement lire ou écrire en mémoire.
    2122
    22 Mais l'exploitation de cette bibliothèque de modèles de simulation pose (au moins) deux problèmes :
    23 
    24  1. Il faut identifier et localiser tous les fichiers nécessaires pour générer le simulateur d'une architecture particulière. L' archive qui vous a été fournie pour le  TP3 rassemblait dans un seul répertoire la centaine de fichiers nécessaires, et le Makefile vous était fourni. Mais dans le cas général,  l'identification des fichiers nécessaires à la compilation est un travail non négligeable, à cause des dépendances entre composants logiciels  (le fichier A fait référence à des objets définis dans le fichier B, qui lui-même fait appel au fichier C, etc.). De ce fait, la construction du Makefile est généralement un exercice laborieux.
    25 
    26  2. Par ailleurs, la plupart des modèles ont des paramètres templates (puisque la plupart des composants ont des interfaces VCI, et que les largeurs des champs VCI sont paramétrables). Pour chaque composant possédant un (ou plusieurs) paramètre(s) template, il faut donc modifier le fichier ''.cpp''  pour préciser la valeur des paramètres template avant de lancer la compilation de ce composant (on dit qu'on instancie les ''template''). Vous avez fait ce travail dans le TP2, et c'est un travail très fastidieux dès que les architectures modélisées deviennent complexes.
    27 
    28 La chaîne de compilation '''soclib-cc''' a pour but de résoudre ces deux problèmes dans le cas général,
    29 en automatisant la recherche des dépendances, l'instanciation des templates, et l'appel du compilateur.
    30        
    31 Pour permettre cette automatisation, tout composant logiciel de SoCLib doit être accompagné d'un fichier
    32 de ''metadata'' (fichier possédant le suffixe {{{.sd}}}) qui contient les informations suivantes:
    33  * le nom de la classe C++
    34  * les paramètres templates associés, avec leurs types et les valeurs par défaut (si applicable)
    35  * les chemins d'accès aux fichiers d'en-tête (.h) et d'implémentation (.cpp)
    36  * la liste des ports d'interface du composant
    37  * la liste des dépendances vers d'autres composants
    38  * les paramètres du constructeur, avec leurs types
    39 Ce fichier est écrit en un langage ad-hoc (mais que Python peut parser nativement), et on trouvera ci-dessous, à titre d'exemple, le fichier ''vci_simple_ram.sd'':
    40 {{{
    41        
    42 Module('caba:vci_simple_ram',
    43         classname = 'soclib::caba::VciSimpleRam',
    44         tmpl_parameters = [parameter.Module('vci_param',  default = 'caba:vci_param')],
    45         header_files = ['../source/include/vci_simple_ram.h',],
    46         implementation_files = ['../source/src/vci_simple_ram.cpp'],
    47         ports = [
    48                   Port('caba:vci_target', 'p_vci'),
    49                   Port('caba:bit_in', 'p_resetn', auto = 'resetn')     
    50                   Port('caba:clock_in', 'p_clk', auto = 'clock')],
    51         uses = [
    52                   Uses('caba:base_module'),
    53                   Uses('common:linked_access_buffer',
    54                              addr_t = parameter.StringExt('sc_dt::sc_uint<%d>', parameter.Reference('addr_size')),
    55                              id_t = parameter.StringExt('sc_dt::sc_uint<%d>', parameter.Reference('srcid_size'))),
    56                   Uses('common:loader'),
    57                   Uses('common:mapping_table',],
    58         instance_parameters = [
    59                   parameter.IntTab('ident'),
    60                   parameter.Module('mt', 'common:mapping_table', auto='env:mapping_table'),
    61                   parameter.Module('loader', 'common:loader', auto='env:loader'),
    62                   parameter.Int('latency')],
    63         extensions = [
    64                   'dsx:addressable=ident',
    65                   'dsx:get_ident=ident:p_vci',
    66                   'dsx:mapping_type=memory'],
    67 )
    68 }}}
    69 
    70 Il faut par ailleurs définir les caractéristiques de la top-cell dans un fichier de directives pour soclib-cc.
    71 Ce fichier est habituellement nommé '''platform.desc''', mais le nom n'est pas imposé.
    72 Ce fichier est également en langage parsable par Python, et contient : le nom de fichier de la top-cell SystemC, la liste des modèles des composants instanciés et les valeurs des paramètres template VCI.
    73 Vous trouverez ci-dessous, à titre d'exemple, le fichier '''tp3.desc''' décrivant l'architecture du TP3:
    74 
    75 {{{
    76 todo = Platform('caba', 'tp3_top.cpp',
    77             uses = [
    78                     Uses('caba:vci_xcache_wrapper', iss_t = 'common:mips32el'),
    79                     Uses('caba:vci_simple_ram'),
    80                     Uses('caba:vci_multi_tty'),
    81                     Uses('caba:vci_vgsb'),
    82                     Uses('caba:vci_gcd_coprocessor'),
    83                     Uses('common:mapping_table'),
    84                     Uses('common:elf_file_loader')],
    85             cell_size = 4,
    86             plen_size = 8,
    87             addr_size = 32,
    88             rerror_size = 1,
    89             clen_size = 1,
    90             rflag_size = 1,
    91             srcid_size = 12,
    92             pktid_size = 1,
    93             trdid_size = 1,
    94             wrplen_size = 1
    95 )
    96 }}}
    97 
    98 = 3 Communications par interruption =
     23= 2 Communications par interruption =
    9924
    10025La plate-forme matérielle du TP3 utilisait une technique de scrutation (polling) pour lire des caractères en provenance du terminal TTY.
     
    11944en allant écrire à certains emplacements prédéfinis en mémoire.
    12045
    121 Pour communiquer avec un périphérique, un programme utilisateur peut donc utiliser
    122 un tampon mémoire partagé DATA, protégé par une variable de synchronisation SYNC.
    123 Supposons qu'un programme utilisateur souhaite lire un caractère sur un terminal TTY.
    124 Plutôt que d'effectuer un appel système bloquant (qui effectue une scrutation directement sur le registre STATUS
    125 du TTY), le programme utilisateur va appeler une fonction de communication qui s'exécute en mode ''user'', et qui
    126 effectue une scrutation sur la variable SYNC. Le tampon est partagé entre le périphérique TTY et le programme
    127 utilisateur :
    128  * Le périphérique TTY écrit dans le tampon  DATA et active la variable SYNC (en déclenchant l'exécution de la routine d'interruption).
    129  * Le programme utilisateur  lit dans le tampon DATA et désactive la variable SYNC.
     46Pour communiquer avec un périphérique, un programme utilisateur utilise
     47un tampon mémoire partagé '''_tty_get_buf''', protégé par une variable de synchronisation '''-tty_get_full'''.
     48Ces deux variables appartiennent au système d'exploitation et sont stockées dans le segment ''seg_kunc'',
     49qui est à la fois protégé (non accessible par les programmes utilisateur) et non cachable.
     50 
     51Si un programme utilisateur souhaite lire un caractère sur un terminal TTY, il utilise l'appel système
     52''tty_getc_irq()'', défini dans le fichier ''stdio.c'' du GIET.
     53Plutôt que d'effectuer une scrutation sur le registre STATUS du contrôleur TTY, cet appel système
     54va tester la variable '''_tty_get_full''', ce qui permet (en principe) au système d'exploitation d'attribuer le processeur
     55à un autre programme utilisateur si te tampon est vide. C'est la routine d'interruption (ISR) associée au
     56terminal TTY qui se charge d'écrire le code ASCII du caractère dans le tampon  '''_tty_get_buf''', et de
     57forcer à 1 la variable de synchronsation '''_tty_get_full'''. Cette variable de synchronisation est remise à 0
     58par l'appel système ''tty_getc_irq()'' lorsque le caractère est transféré du tampon système '''tty_get_buf''' 
     59vers le tampon mémoire défini par l'utilisateur.
    13060
    131 Il existe évidemment un mécanisme symétrique pour l'écriture d'un caractère vers le contrôleur TTY.
     61Dans une architecture monoprocesseur, le processeur peut exécuter plusieurs tâches (plusieurs programmes utilisateurs) en pseudo-paralléliseme, par multiplexage temporel. Chaque tâche possède alors son propre terminal écran/clavier, mais il n'y a qu'un seul contrôleur TTY.
    13262
    133 '''Question:''' Que fait la routine d'interruption déclenchée par le périphérique TTY lors de la frappe d'un caractère lorsque la variable SYNC est déjà activée ? (ceci signifie
    134 que le précédent caractère écrit dans le tampon DATA n'a pas été lu par le programme utilisateur). La réponse se trouve dans le fichier '''isr.c'''. Expliquez ce comportement. 
     63Dans une architecture multi-processeurs, on aura un contrôleur TTY pour chaque processeur, et chaque
     64processeur peut exécuter plusieurs tâches.
     65 
     66Le GIET supporte au plus 8 processeurs, et au plus 4 tâches par processeur. Le GIET supporte donc au plus
     67 32 terminaux ecran/clavier, et définit donc deux tableaux '''_tty_get_buf[32]''' et '''_tty_get_full[32]''', indexés par le numéro du terminal concerné.
    13568
    136 '''Question:''' Quel est l'avantage de ce type de communication par interruption, comparé au mécanisme de scrutation utilisé dans le TP3 ?
     69'''Question''' : Comment l'écrivain (l'ISR) calcule-t-il l'index du terminal concerné ? Comment le lecteur
     70(l'appel système ''tty_get_irq()'' détermine-t-il cet index ? La réponse se trouve dans les fichier ''drivers.c'' et ''isr.s''.
     71
     72'''Question:''' Que fait la routine d'interruption ISR déclenchée par le périphérique TTY lors de la frappe
     73d'un caractère lorsque la variable '''_tty_get_full[i]''' vaut 1 ?  Ceci signifie que le précédent caractère écrit
     74dans le tampon '''_tty_get_buf[i]''' n'a pas été lu par le programme utilisateur. La réponse se trouve dans le fichier ''isr.s''.
     75
     76'''Question:''' Quel est l'avantage de ce type de communication par interruption, comparé au mécanisme de scrutation utilisé dans le TP2 ?
    13777
    13878= 4 Travail à réaliser =