Cours II2-2014
Cours II2-2014
Cours II2-2014
Pierre-Louis Cayrel
www.cayrel.net
IUT de Saint-Etienne
d’après un cours de Florent Bernard
COURS II2
2
Table des matières
1 Introduction 9
1.1 (Micro) processeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.1.1 Définition et rôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.1.2 Bref historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2 Microcontrôleurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2 Codage de l’information 15
2.1 Information discrète . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.2 Représentation des nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3 Conversions d’entiers naturels . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.3.1 Passage d’une base quelconque à la base 10 . . . . . . . . . . . . . . . . . 16
2.3.2 Passage de la base 10 à une base quelconque . . . . . . . . . . . . . . . . 16
2.4 Représentation des nombres dans les processeurs . . . . . . . . . . . . . . . . . . 19
2.4.1 Limitation de la taille . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4.2 Les entiers logiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4.3 Les entiers arithmétiques . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.4.4 Codage des nombres réels (norme IEEE 754) . . . . . . . . . . . . . . . . 23
2.4.5 Codage des caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.4.6 Lien avec les types du langage C . . . . . . . . . . . . . . . . . . . . . . 26
3
4 TABLE DES MATIÈRES
6 Exercices 63
6.1 Valeur décimale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.2 Conversion entier base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.3 Conversion entiers négatifs base . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.4 Addition binaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.5 Conversion réels notation IEEE 754 . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.6 Décodage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.7 Codage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.8 Opérations bit à bit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
6.9 Un code C existant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
6.10 Créez un code C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
6.11 Décalage en C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
TABLE DES MATIÈRES 5
Objectifs
1. Comprendre quel type d’information est traitée dans un système à processeur ;
2. Comprendre l’architecture d’un système à processeur ;
3. Comprendre les mécanismes d’interruption (part logicielle/part matérielle) ;
4. Être capable d’écrire un programme en langage de haut niveau pour une cible à micro-
processeur ou à microcontrôleur.
Pré-requis
– II1 : Algorithmie et syntaxe du langage C ;
– ENSL1 : Conception de systèmes logiques.
7
8 TABLE DES MATIÈRES
Chapitre 1
Introduction
9
10 CHAPITRE 1. INTRODUCTION
1947 : Invention du transistor (John Bardeen, William Shockley et Walter Brattain –Bell Té-
léphone)
Énorme progrès scientifique sans lequel l’électronique et l’informatique n’aurait pas leur forme
actuelle aujourd’hui.
Avantages principaux :
– beaucoup plus petit et léger (comparé au tube électronique) : permet la miniaturisation
des composants électroniques ;
– robuste, fiable et efficace : comparé aux tubes à vide (fragile, préchauffage), relais méca-
nique (gestion de l’anti rebonds) ⇒ limitation de la fréquence de commutation ;
– fonctionne avec des tensions faibles : faible consommation et permet le fonctionnement sur
pile (fonctionnement autonome).
années 1950 : Intégration de plusieurs transistors sur une même surface de matériau semi-
conducteur : naissance du circuit intégré.
Plusieurs niveaux d’intégration :
– SSI (Small Scale Integration) petite : inférieur à 12 ;
– MSI : (Medium Scale Integration) moyenne : 12 à 99 ;
– LSI : (Large Scale Integration) grande : 100 à 9999 ;
– VLSI : (Very Large Scale Integration) très grande : 10000 à 99999 ;
– ULSI : (Ultra Large Scale Integration) ultra grande : 100000 et plus.
Rappel : Dès qu’il a été possible d’intégrer suffisament de transistors sur un même circuit
intégré afin de réaliser un processeur, le terme microprocesseur a supplanté celui de proces-
seur.
Avantages : le fait de pouvoir intégrer les transistors le composant sur un même circuit semi-
conducteur, permet des temps de commutation plus court (du fait de la dimension réduite
et de la réduction du nombre de capacités parasites des portes logiques) augmentant ainsi la
fréquence de fonctionnement des microprocesseurs synchrones de quelques dizaines de MHz
à plusieurs GHz.
1971 : Apparition du premier microprocesseur : Intel 4004 ;
1974 : Apparition du premier microprocesseur employé couramment : Intel 8080 ;
1.1. (MICRO) PROCESSEURS 11
1. La Loi de Moore a été exprimée en 1965 dans Electronics Magazine par Gordon Moore,
ingénieur de Fairchild Semiconductor, un des trois fondateurs d’Intel. Constatant que
la complexité des semiconducteurs proposés en entrée de gamme doublait tous les ans
à coût constant depuis 1959, date de leur invention, il postulait la poursuite de cette
croissance (en 1965, le circuit le plus performant comportait 64 transistors). Cette aug-
mentation exponentielle fut rapidement nommée Loi de Moore ou, compte tenu de
l’ajustement ultérieur, Première loi de Moore.
2. En 1975, Moore réévalua sa prédiction en posant que le nombre de transistors des mi-
croprocesseurs (et non plus de simples circuits intégrés moins complexes car formés de
composants indépendants) sur une puce de silicium double tous les deux ans. Bien qu’il
ne s’agisse pas d’une loi physique mais juste d’une extrapolation empirique, cette pré-
diction s’est révélée étonnamment exacte. Entre 1971 et 2001, la densité des transistors
a doublé chaque 1,96 année. En conséquence, les machines électroniques sont devenues
de moins en moins coûteuses et de plus en plus puissantes.
3. Une version commune, variable et sans lien avec les énoncés réels de Moore est : quelque
chose double tous les dix-huit mois, cette chose étant la puissance, la capacité, la vitesse
et bien d’autres variantes mais très rarement la densité des transistors sur une puce. Ces
pseudo lois de Moore sont celles le plus souvent diffusées, car elles fleurissent dans des
publications grand public et sur de nombreux sites Internet. Leur seul point commun
est donc ce nombre de dix-huit mois, qu’on ne trouve pourtant dans aucun des deux
énoncés de Moore.
2005 : Apparition des multi-coeurs (Intel et AMD les deux leaders sur le marché). Plusieurs
coeurs sur un même circuit intégré. L’efficacité de tels systèmes dépend de la façon dont sont
connectés les coeurs (topologie de connexion).
Intérêt principal, avoir du vrai parallélisme. Problème de gestion des tâches pour répartir les
calculs sur chaque coeur.
2008 : Super calculateur, Records
– Mips : Million d’instructions par seconde ;
– Flops : Opération à virgule flottante par seconde ;
– Barre du Petaflop (1015 opérations en virgule flottante par seconde) franchie par un super-
caclulateur militaire d’IBM (Roadrunner). Puis franchie par le supercalculateur Jaguar du
Cray. (En avril 2009 ce sont les deux seuls à avoir franchi cette barre symbolique).
Même si on peut avoir l’impression (réelle) qu’il y a eu de grandes évolutions tant au niveau de la
complexité, la taille, la construction et la forme générale des processeurs au cours des soixantes
dernières années, il faut noter que la conception et les fonctions de base n’ont pas beaucoup
changé. La plupart des architectures actuelles peuvent être décrites comme de machines à
programme enregistré de Von Neumann.
1.2. MICROCONTRÔLEURS 13
1.2 Microcontrôleurs
Un microcontrôleur est un circuit intégré qui rassemble les éléments essentiels d’un ordinateur :
– (micro)processeur ;
– mémoires (morte, vive) ;
– unités périphériques ;
– interfaces d’entrées/sorties.
Les caractéristiques principales d’un microcontrôleur sont :
– haut degré d’intégration ;
– faible consommation électrique : quelques mW en fonctionnement, quelques nW en veille ;
– vitesse de fonctionnement plus faible (dizaine à centaine de MHz) que les microprocesseurs
plus polyvalent qu’on trouve dans nos ordinateurs personnels ;
– coût réduit.
Les microcontrôleurs, ont permis de démocratiser l’usage de l’informatique dans un grand
nombre de produits et de procédés. Ils sont de fait fréquemment utilisés dans les systèmes
embarqués comme les contrôleurs des moteurs automobiles, les télécommandes, les appareils de
bureau, l’électroménager, les jouets, la téléphonie mobile, etc . . ..
Certains constructeurs se sont spécialisés dans des secteurs d’activités précis, par exemple :
– Infinéon : secteur automobile ;
– Philips : électroménager ;
– Texas Instruments : basse consommation, portabilité.
Au préalable à l’étude de l’organisation matérielle d’un système à microprocesseur (par exemple
un microcontrôleur), il est important de comprendre quel type d’information peut traiter un
processeur.
14 CHAPITRE 1. INTRODUCTION
Chapitre 2
Codage de l’information
15
16 CHAPITRE 2. CODAGE DE L’INFORMATION
Exemple 3.
(12101121)3 = 1 × 37 + 2 × 36 + 1 × 35 + 1 × 33 + 1 × 32 + 2 × 31 + 1 × 30
= 2187 + 2 × 729 + 243 + 27 + 9 + 2 × 3 + 1
= (3931)10
Remarque 1. Nous n’abordons pas ici la représentation en général des nombres fractionnaires.
Nous étudierons plutôt la représentation des nombres réels dans les processeurs.
18 CHAPITRE 2. CODAGE DE L’INFORMATION
Exemple 5. Si 1 bit est disponible, on peut représenter les états 0 et 1, soit 2 états.
Si 2 bits sont disponibles, on peut représenter les états :
0 0
0 1
1 0
1 1
soit 4 états.
Si 3 bits sont disponibles, 2 bits représentent les 4 états précédents et on peut rajouter un
troisième bit à 0 ou un troisième bits à 1 pour donner 2 × 4 = 8 états :
0 0 0 1 0 0
0 0 1 1 0 1
0 1 0 1 1 0
0 1 1 1 1 1
Conséquence : à chaque ajout d’un bit, on multiplie par deux le nombre d’états que l’on peut
représenter.
Avec n bits, on va donc pouvoir représenter 2n états.
Exemple 6. Quels sont les entiers logiques que l’on peut représenter avec 4 bits ? avec 8 bits ?
avec n bits ?
x = an−1 2n−1 + · · · + a1 2 + a0
Les bits a0 , a1 , . . ., an−1 composant l’entier logique n’ont pas tous la même importance. Il est
clair que si a0 change de 0 à 1 (ou l’inverse), l’ordre de grandeur de l’entier ne va pas être
modifié. En revanche si an−1 change de 0 à 1 (ou l’inverse), l’ordre de grandeur de l’entier
logique va être grandement modifié.
On parle de poids associés aux bits composant l’écriture des entiers logiques. Ces poids sont les
puissances de 2 associées à chaque bit.
Ainsi, a7 est de poids 27 = 128. C’est à dire que si a7 change de valeur, l’entier logique associé
change de valeur de ±27 = ±128, alors que si a0 change de valeur, l’entier logique associé change
de valeur de ±20 = ±1.
Les poids forts sont donc les plus grandes puissances de 2 et les poids faibles les plus petites
puissance de 2.
Remarque 2. On utilisera souvent le terme MSB (Most Significant Bit), pour parler du bit
significatif de poids le plus élevé d’un entier logique et de LSB (Least Significant Bit), pour
parler du bit de poids le moins élevé d’un entier logique.
Remarque 3. La plupart du temps, les entiers logiques sont représentés avec le bit de poids le
plus fort à gauche et le bit de poids le plus faible à droite.
On parle de représentation « Little Endian » , le plus petit à la fin.
Dans le cas contraire, on parle de représentation « Big Endian », le plus fort à la fin.
2.4. REPRÉSENTATION DES NOMBRES DANS LES PROCESSEURS 21
hexadécimale −→ octale :
(B5)16 = ((1011)2 (0101)2 )16
= ((010)2 (110)2 (101)2 )8
= (265)8 (= 2 × 82 + 6 × 8 + 5)
22 CHAPITRE 2. CODAGE DE L’INFORMATION
Opérations arithmétiques
Elles s’effectuent de la même façon qu’en base 10, dès qu’on atteint ou on dépasse la valeur de
la base b, une retenue se reporte sur le chiffre de poids directement supérieur.
+2n−1 − 1 = (0| 1| . {z
. . 11})2
n−1
2. Entiers négatifs :
L’idée la plus naturelle serait de coder le signe − par un bit de signe à 1 et de coder
la valeur absolue de l’entier négatif en représentation binaire naturelle en utilisant les
n − 1 bits restants. Cette méthode de codage, dîte par signe/amplitude n’est pas du tout
adaptée au calcul arithmétique.
Exemple 11. Coder sur 4 bits l’entier arithmétique +7.
Coder sur 4 bits l’entier arithmétique −7 en représentation signe/amplitude.
Effectuer l’addition binaire de ces deux représentations, que constatez vous ?
2.4. REPRÉSENTATION DES NOMBRES DANS LES PROCESSEURS 23
Pour avoir une représentation des entiers négatifs utilisable pour les opérations arithmé-
tiques, on utilise la méthode du complément à 2 (vue en ENSL1) :
(a) On prend le complément à 1 de l’entier arithmétique dont on veut l’opposé (on
inverse tous les bits de sa représentation, y compris le bit de signe puisque lorsqu’on
prend l’opposé, le signe change).
(b) On ajoute 1
Sur n bits, on peut donc représenter 2n entiers, de −2n−1 à 2n−1 − 1.
Exemple 12. Donner la représentation en complément à 2 des entiers négatifs suivant :
(a) Sur 4 bits, (−7)10
(b) Sur 8 bits, (−7)10
(c) Sur 8 bits, (−128)10
(d) (−1027)10 , de combien de bits avez vous besoin pour stocker ce nombre ?
Remarque 8. Lorsque le nombre de bits sur lequel effectuer le codage n’est pas précisé,
il convient de prendre le nombre de bits minimal nécessaire au codage.
Exemple 13. Opérations, cohérence :
(a) En utilisant la méthode complément à 2, prenez l’opposé de (−7)10 . Que constatez-
vous ?
(b) En utilisant les représentations des entiers arithmétiques sur 8 bits, effectuez les
opérations :
i. (115)10 − (37)10
ii. (7)10 − (98)10
1
3, 25 = 3 +
|{z} 4
partie entière |{z}
partie fractionnaire
= 1 × 21 + 1 × 20 + 0 × 2−1 + 1 × 2−2
= (11, 01)2
qui peut aussi se représenter par +1, 101 × 21 .
Comme il y a de nombreuses façons de représenter un même nombre réel, il a été proposé
plusieurs normalisations, dont la plus utilisée est la norme IEEE 754.
Dans cette norme, un nombre réel non nul s’écrit
s 1,M ×2n
0
|{z} 10000000
| {z } 10100000000000000000000
| {z }
signe positif 127+1 mantisse
Remarque 9. Le réel 0 se note avec 32 bits à 0.
Remarque 10. Attention, pour l’exposant, on code bien 127 + n sur 8 bits, où n est l’exposant.
Les exposants 00000000 correspondant à n = −127 et 11111111 correspondant à n = 128 sont
interdits :
– 00000000 indique que le nombre est dénormalisé ;
– 11111111 indique que l’on n’a pas affaire à un nombre. On note cette configration NaN (Not
a Number). Cela permet de signaler des erreurs de calcul comme une division par zéro.
Conséquence, le plus petit exposant est −126 et le plus grand est 127.
Exemple 14. En utilisant la norme IEEE 754
– Représenter le nombre réel −32.125 selon la norme IEEE 754
– On donne les 32 bits représentant un nombre réel selon la norme IEEE 754 :
11000000111000100000000000000000
On peut augmenter la précision en utilisant une représentation sur 64 bits, mais il faut avoir
conscience que le calcul utilisant les nombres réel est un calcul approché dont la précision
dépend du nombre de bits disponible pour représenter votre information.
Ainsi, si vous voulez travailler sur des nombres réels ayant une écriture décimale finie, nous
vous encourageons à travailler en précision fixée en utilisant des entiers.
Par exemple, 7, 34 peut très bien être vu comme l’entier 734 divisé par 100. Si vous voulez faire
l’opération 7, 342 , vous obtiendrez une valeur approchée du résultat : 53, 875602 alors que si
vous faites l’opération 7342 vous obtiendrez le résultat exact : 538756. Il vous suffit alors de lire
correctement les chiffres du résultat sachant que 7, 342 = (734/100)2 = 7342 /10000 c’est à dire
de décaler la virgule de 4 positions vers la gauche, pour obtenir le résultat exact : 53, 8756.
Conclusion : arrêtez d’utiliser des float en C, à tort et à travers !
Au contraire, prenez le temps de réflechir à quel type d’information vous avez affaire. Si c’est un
indice de tableau, celui-ci est un entier positif ou nul, donc un entier logique. Il conviendra la plu-
part du temps de le déclarer dans votre code C comme un unsigned int ou unsigned char. 1
1. Voir la fin du chapitre.
2.4. REPRÉSENTATION DES NOMBRES DANS LES PROCESSEURS 25
Les caractères ne sont pas rangés n’importe comment, ainsi pour faire du tri par ordre alphabé-
tique, on peut comparer les valeurs des entiers codant les lettres de l’alphabet. La comparaison
’a’<’b’ a un sens, puisque ’a’ est codé par 01100001 c’est-à-dire l’entier 97 et ’b’ est codé
par 01100010 c’est à dire l’entier 98.
Attention, la taille d’un int dépend du système à processeur utilisé (notamment de la taille du
mot machine que peut traiter le processeur) et donc de l’interprétation que donne le compilateur
associé au système lorsqu’il rencontre un int.
A titre d’exemple, on peut donner une table plus précise pour un processeur 32 bits.
Type d’information Type en C
Entier logique (8 bits) unsigned char
Entier logique (16 bits) unsigned short int
Entier logique (32 bits) unsigned long int ou unsigned int
Entier logique (64 bits) unsigned long long int
Entier arithmétique (8 bits) char
Entier arithmétique (16 bits) short int
Entier arithmétique (32 bits) long int ou int
Entier arithmétique (64 bits) long long int
Nombre réel (32 bits) float
Nombre réel (64 bits) double
Caractère char
Chapitre 3
Dans cette partie, nous décrivons l’architecture générale d’un système à microprocesseur et les
principes généraux de fonctionnement.
Précisons ici qu’un (micro)processeur ne peut pas fonctionner en étant isolé ce qui justifie
l’appellation de systèmes à microprocesseur. Il est donc en interaction avec d’autres composants.
L’objectif de ce chapitre est de définir quelles sont ces unités, de préciser leur rôle ainsi que les
interactions entre ces unités et le processeur.
Les deux composants principaux d’un système à microprocesseur sont la mémoire principale et
le processeur avec chacun des rôles bien définis :
27
28 CHAPITRE 3. DESCRIPTION GÉNÉRALE – PRINCIPES DE FONCTIONNEMENT
Par exemple, dans le cas d’une interaction homme-machine, un ordinateur aura l’architecture
générale présentée sur la figure 3.2.
Un processeur est entouré (ne voit que) de cases mémoires. Chaque case est accessible grâce à
une adresse donnée. Pour communiquer avec une case mémoire, le processeur doit donc indiquer
son adresse. Puis, le processeur peut soit lire le contenu de la case, soit écrire dans une case.
Dans les deux cas, une donnée doit transiter entre le processeur et la mémoire.
Il y a trois types différents d’information que s’échangent le processeur et la mémoire :
– Une adresse ;
– Un signal de contrôle (lire/ecrire dans l’exemple) ;
– Une donnée.
Ces types d’information transitent par l’intermédiaire de fils d’interconnexion, chaque fil permet
de transporter un bit d’information. Pour transporter plusieurs bits d’information simultané-
ment, il est nécessaire de grouper les fils, on parle alors de bus de communication qui permettent
aux différents composants d’un système à microprocesseur de communiquer.
On distinguera donc :
– Un bus d’adresse ;
– Un bus de contrôle (ou bus de commande) ;
– Un bus de données.
Les largeurs et les significations précises de ces bus seront vues ultérieurement.
3.1. MODÈLE GÉNÉRAL DE VON NEUMANN 29
Par ailleurs, un circuit CMOS ne consomme significativement du courant que lors des commu-
tations des transistors. Cette propriété a été à l’origine de circuits qui consomment moins de
courant que leur équivalent TTL, qui eux en consomment au repos et lors des commutations.
Néanmoins, au fur et à mesure qu’on diminue leur tension d’alimentation, les courants de fuite
des transistors CMOS deviennent de plus en plus proches des courants de commutation, et par
conséquent la consommation de ces circuits au repos n’est plus aussi négligeable qu’auparavant.
30 CHAPITRE 3. DESCRIPTION GÉNÉRALE – PRINCIPES DE FONCTIONNEMENT
3.4.3 En résumé
Un programme informatique (tel que vous pouvez l’écrire en C) est une suite d’instructions
de haut niveau, qui peuvent être très variées. Il est illusoire de penser qu’un processeur peut
éxecuter tous ces types d’instructions.
Un processeur possède un certain nombre d’instructions de base qui constituent son jeu d’ins-
tructions. Ces instructions de base sont par exemple :
– addition de deux mots machine ;
– lecture/écriture d’une case mémoire ;
– ou logique entre deux mots machine ;
– etc, . . .le jeu d’instruction d’un processeur est en général décrit précisément dans sa docu-
mentation.
À partir de ce jeu d’instructions, le processeur est capable (en séquençant les instructions de
base) de traiter des instructions plus complexes qui peuvent composer un programme.
Les instructions du jeu d’instructions du processeur sont codifiées selon un langage très précis
appelé le langage machine. Le langage machine dépend du processeur.
Pour écrire un programme en langage machine, il faut donc connaître les détails du fonction-
nement du processeur qui va être utilisé.
32 CHAPITRE 3. DESCRIPTION GÉNÉRALE – PRINCIPES DE FONCTIONNEMENT
Remarque 13. Le langage machine est un langage de très bas niveau qui ne travaille qu’avec des
adresses mémoires. Par exemple, le programme écrit en langage machine pour une architecture
80x86 par la séquence
A1 01
|{z} | {z10} 03
| {z06} 01
| {z12} |{z} | {z14} implantée en mémoire additionne le contenu de deux
A3 01
op. lecture adr op. add adr op. écriture adr
cases mémoires et range le résultat dans une troisième.
Il apparait donc difficile d’écrire un programme complexe uniquement en langage machine.
L’intérêt d’un langage de haut niveau (comme le C), permet d’avoir un langage normalisé
indépendant du processeur ciblé. Le problème est qu’un processeur donné ne peut pas interpréter
les instructions écrites en C. Il faut transformer ce langage de haut niveau en langage machine,
c’est le rôle du compilateur. Le compilateur connaît le jeu d’instructions du processeur ciblé et
peut donc transformer les instructions de haut niveau en instructions de base du processeur.
Remarque 14. Pour avoir une représentation plus parlante du langage machine, on utilise
souvent un langage appelé langage symbolique (utilisé dans le langage assembleur) pour indiquer
à quoi correspondent les instructions codées en hexadécimal.
Ainsi, la séquence précédente : |{z}
A1 01 | {z10} 03
| {z06} 01
| {z12} |{z}
A3 01
| {z14}
op. lecture adr op. add adr op. écriture adr
Cette section est consacrée aux circuits utilisés dans la mémoire centrale des ordinateurs, qui
contient les programmes et les données manipulés par les programmes. L’information y est
stockée sous forme de mots de taille fixe, dont la largeur dépend de l’architecture utilisée. Ces
mots mémoire sont ordonnés et possèdent chacun une adresse, sous forme d’un nombre.
Le processeur ne voit que des cases mémoires, à la fois pour “parler” à la mémoire proprement
dîte, c’est à dire l’espace de stockage (RAM, ROM) mais aussi pour parler aux périphériques
du système (chacun étant accessible à une adresse donnée).
L’ensemble des “cases” auxquelles peut “parler/écouter” un processeur est appelé l’espace adres-
sable du processeur. Dans cette partie, on entend par mémoire, la partie adressable qui contient
les données et les programmes. On distinguera dans la suite du cours (chapitre sur les me-
moires), la mémoire vive (données) de la mémoire morte (programmes).
Il est important de noter que seul le processeur peut modifier l’état de la mémoire. Chaque em-
placement mémoire conserve les informations que le processeur écrit jusqu’à ce que le courant
électrique soit coupé (cas des mémoires volatiles par opposition aux mémoires mortes, ou autre
périphériques de stockage externe : disquettes, clés USB, disques durs,. . .).
Une RAM peut être statique ou dynamique. Chaque bit mémoire d’une RAM statique (SRAM)
est constitué d’une bascule, et conserve son état tant qu’elle est alimentée. À l’inverse, chaque
bit d’une RAM dynamique (DRAM) est composé d’une capacité, qui doit être rafraîchie pé-
riodiquement par une électronique séparée. Les RAMs statiques ont un taux d’intégration plus
faible que les RAM dynamiques, puisqu’un bit mémoire nécessite 6 transistors dans un cas,
et une capacité plus un transistor dans l’autre. Une RAM peut être synchrone ou asynchrone,
une RAM synchrone étant en fait une RAM asynchrone à laquelle on a ajouté une machine à
états finis synchrone qui place les commandes de lecture et d’écriture dans un pipeline, afin de
permettre d’accepter une nouvelle commande avant que la précédente n’ait été complétée.
3.7. IMPLANTATION D’UN PROGRAMME (SIMPLIFIÉ) 35
Les barrettes de RAM de nos ordinateurs personnels sont des SDRAM, c’est à dire des RAM
dynamiques synchrones, fonctionnant à des fréquences de 200MHz et plus. Elles sont souvent
de type DDR (double data rate), quand les fronts montants et descendants de l’horloge sont
exploités pour les changements d’état.
Dans beaucoup d’autres appareils (assistants personnels, consoles de jeux, etc.), la RAM est de
type statique asynchrone (SRAM), sous la forme de circuits intégrés.
Les ROMs existent également dans un grand nombre de types différents, principalement selon
la façon dont on peut programmer leur contenu (invariable, par définition). Il y a d’abord les
ROMs programmées par masque à l’usine ; elles sont produites en grand nombre avec un faible
coût à l’unité, mais leur contenu ne peut jamais être mis à jour ultérieurement.
Les PROMs (Programmable Rom) sont programmables par un appareil spécial, qui générale-
ment détruit par un courant fort une liaison interne correspondant à un bit.
Les EPROMs (Erasable PROM) fonctionnent de la même façon, mais possèdent une fenêtre
transparente et peuvent être effacées par une exposition d’une vingtaine de minutes aux rayons
ultraviolets.
Elles sont maintenant souvent remplacées par des EEPROMs (Electrically EPROM), repro-
grammables électriquement.
Les mémoires Flash sont également une forme de mémoires effaçables électriquement, mais on
réserve généralement le terme EEPROM aux mémoires capables d’effacer à l’échelle du mot, et
le terme ’mémoires Flash’ à celles qui effacent à l’échelle de blocs.
Dans les deux cas, le temps d’effacement est long par rapport au temps de lecture, et elles ne
peuvent pas être considérées comme une forme spéciale de RAM.
On trouve de la mémoire EEPROM et flash dans les assistants personnels, dans les sticks mé-
moire sur ports USB, pour le stockage du firmware de nombreux appareils (BIOS d’ordinateurs,
lecteurs de DVD, tuners satellites, etc.)
Un processeur ne voit que des cases mémoires qui lui permettent de stocker de l’informa-
tion binaire et de communiquer avec les périphériques composant le système. Cet ensemble
de cases mémoires constitue l’espace adressable du processeur. Cependant, il faut distinguer
dans l’espace adressable du processeur, la partie dédiée au stockage de l’information (données
et programmes) et la partie correspondant aux périphériques du système. Enfin, il convient de
préciser quelles sont les différents types de mémoires, leurs capacités ainsi que les différentes
technologies permettant de stocker l’information.
Remarque 15. Pour s’adresser aux périphériques du système, le processeur doit connaître
leur adresse. On peut donc voir les périphériques d’un système comme des parties de l’espace
adressable que voit le processeur.
Pour éviter toute confusion par la suite, on emploiera donc le terme d’espace adressable pour
indiquer le nombre de cases que voit le processeur et de mémoire la partie de l’espace adressable
réservée au stockage de l’information.
Mémoire centrale
Cette partie de la mémoire est la mémoire interne ou encore appelée mémoire vive ou encore
mémoire RAM (Random Access Memory). Elle permet de stocker temporairement des données,
notamment lors de l’exécution de programmes. C’est une mémoire volatile au sens où lorsqu’elle
n’est plus alimentée par un courant électrique, elle perd sa capacité de mémorisation.
L’accès à cette mémoire est rapide (quelques dizaines de nanosecondes) ce qui est important
pour ne pas ralentir la cadence à laquelle le processeur peut travailler.
37
38 CHAPITRE 4. ESPACE ADRESSABLE - MÉMOIRES
Remarque 16. La mémoire accessible dans le processeur, (registres voire mémoire cache), a
un temps d’accès encore plus court (quelques nanosecondes).
Mémoire de masse
Cette partie de la mémoire, appelée mémoire physique ou encore ROM (Read Only Memory)
permet de stocker des données sur le plus long terme, même lorsque le courant électrique est
coupé. C’est le cas des CD-ROM, DVD-ROM, mais aussi les disques durs et autres clés USB.
Les temps d’accès à ce type de mémoire sont beaucoup plus lents (quelques millisecondes),
aussi pour travailler sur des données présentes en mémoire de masse, le processeur va d’abord
les récupérer dans la mémoire centrale qui offre des temps d’accès beaucoup plus rapide.
Remarque 17. L’appellation mémoire à lecture seule (ROM) est conservée pour des raisons
historiques, cependant la plupart des périphériques de stockage de masse actuels (tels que les
disques durs, les clés USB utilisant la technologie FLASH) sont accessibles en lecture ET écri-
ture. Cependant les temps d’accès à ces mémoires sont beaucoup plus lent que pour des accès à
la RAM.
une case mémoire pourra contenir un multiple de 8 bits (=1 octet) d’information.
Si une case mémoire peut stocker m bits d’information, on dit que la mémoire a une largeur de
m bits.
Adresse Emplacement
2n − 1 0 1 0 1 1 0 1 0
2n − 2
... ...
2
1
0
7 6 5 4 3 2 1 0
numéros des bits
La définition de la capacité mémoire ou capacité adressable est donnée par le produit des deux
dimensions :
– nombre de cases (2n ) ;
– taille d’une case (m bits, en général m est un multiple d’octets).
Dans le cas le plus courant où la taille d’une case est d’un octet, la capacité mémoire est donnée
sous la forme d’un multiple informatique d’octets (Ki, Mi, Gi) d’où les tailles mémoires associées
Kio, Mio, Gio.
Exemple 15. Un processeur a un bus d’adresse d’une largeur de 16 bits et un bus de données
d’une largeur de 8 bits. Calculez la capacité adressable du processeur.
Cette notion de hiérarchie est importante pour ne pas ralentir le système. En effet, on distingue :
– L’information sur laquelle est en train de travailler le processeur (stockée dans des registres
processeurs, stockage et durée de vie limités mais temps d’accès très rapide (quelques ns)) ;
– L’information sur laquelle le processeur va travailler (stockée dans la mémoire centrale, sto-
ckage et durée de vie plus importants mais temps d’accès plus lent (quelques dizaines de
ns)) ;
– L’information que le processeur est amenée à consulter de temps en temps (stockée dans de
la mémoire de masse (mémoire flash principalement en système embarqué), stockage et durée
de vie beaucoup plus important mais temps d’accès très lents (quelques ms)).
Lorsque le processeur veut exécuter un programme présent dans la mémoire de masse, il le
charge d’abord en mémoire centrale, puis transfert les données à traiter dans ses registres
processeurs afin d’exécuter les instructions plus rapidement en limitant au maximum les accès
mémoire qui prennent du temps et ralentissent l’exécution du programme.
Le temps passé à consulter la mémoire est appelé temps de latence. Ce temps est forcément
présent (la capacité de stockage des registres processeurs n’est pas illimitée et des transferts
entre les registres et les mémoires centrales et de masse sont indispensables), mais doit être le
plus petit possible.
4.5 Technologies
L’objectif de cette partie est de comprendre comment peut être mémorisée l’information binaire
et d’étudier les technologies employées couramment pour mémoriser l’information.
La mémoire est organisée sous forme d’un tableau dont chaque case est accessible par une
ligne et une colonne. Chaque intersection est composée d’un transistor et d’un condensateur.
Lorsque le condensateur est chargé son état logique est assimilé à 1, lorsqu’il est déchargé son
état logique représente un 0. Chaque case de ce tableau représente donc un bit de la mémoire.
Un des inconvénients majeurs de ce système est dû au fait que les condensateurs se déchargent
naturellement, il faut donc régulièrement (de l’ordre de quelques ms) rafraichir leurs états (c’est
à dire venir lire leur valeur et les recharger). Ce temps s’ajoute au temps d’accès à la mémoire
(temps de latence).
Cette technologie est simple à mettre en place ce qui offre l’avantage d’être peu onéreuse et
d’occuper une surface matérielle 4 fois moins importante que les RAM statiques (SRAM).
Pour plus de détails sur les différentes technologies de RAM dynamique, le lecteur curieux
pourra consulter : http://www.commentcamarche.net/contents/pc/ram.php3.
2. http ://www.commentcamarche.net/contents/pc/ram.php3
42 CHAPITRE 4. ESPACE ADRESSABLE - MÉMOIRES
Principe La cellule de base d’une RAM est typiquement constituée par une bascule :
Cette cellule prend place dans deux matrices qui se superposent, l’une destinée à l’écriture,
l’autre à la lecture :
Exemple La matrice de cellules est intégrée dans un ensemble de circuits servant à sélection-
ner correctement les lignes et les colonnes :
Fonctionnement Le bus d’adresse A1A0 pilote un décodeur qui fournit les lignes de sélection
des cellules. La même ligne sert pour l’écriture et la lecture.
L’utilisation d’un même fil pour sélectionner les cellules pour l’écriture d’une part, et pour la
lecture d’autre part, nécessite une ligne pour indiquer quelle est l’opération désirée : R/WR-
est à 0 lors d’une écriture, et à 1 lors d’une lecture. Ceci impose de modifier le schéma de la
cellule de la façon suivante :
Les sorties peuvent être mises en haute impédance. Ceci permet d’éviter un conflit entre la
sortie des bascules et la donnée présentée sur le bus bidirectionnel lors de la phase d’écriture.
La mise en haute impédance peut ètre contrôlée depuis l’extérieur grâce au signal d’entrée OE
(Output Enable). Cela permet de connecter plusieurs circuits de ce type sur un même bus de
données : seul celui qui sera sélectionné par l’intermédiaire de la ligne OE fixera les niveaux du
bus.
Le signal CS (Chip Select) doit être à 1 pour que la mémoire soit opérationnelle. S’il est à 0,
la matrice est sélectionnée en lecture (pas de perte de données par écriture intempestive) et les
sorties sont en haute impédance, quel que soit l’état de OE.
Mémoires statiques
La réalisation de ces mémoires est effectuée à l’aide d’un tableau de bascules (typiquement les
bascules RS vues en ENSL1, voir figure 4.8).
R̄ S̄ Q Q̄
0 0 1 1
0 1 0 1
1 0 1 0
1 1 Q0 Q̄0
44 CHAPITRE 4. ESPACE ADRESSABLE - MÉMOIRES
Fonctionnement L’état de repos des entrées est R̄ = S̄ = 1. Dans cet état, la valeur des
sorties Q Q̄ dépend de l’histoire du système :
– Si R̄ passe à 0 (Reset), la sortie Q passe à 0 et Q̄ passe à 1. Les sorties n’évoluent pas lorsque
R̄ repasse à 1.
– Si S̄ passe à 0 (Set), la sortie Q passe à 1 et Q̄ passe à 0. Les sorties n’évoluent pas lorsque
S̄ repasse à 1.
– Si R̄ et S̄ sont à 0, les deux sorties Q et Q̄ valent 1. L’appellation Q et Q̄ n’est plus appropriée.
Dans la majorité des cas d’utilisation de ce type de bascule on préfère éviter ce cas de
fonctionnement.
La bascule RS possède la fonctionnalité d’une case mémoire. La sortie mémorise un état 0 ou 1,
déterminé par une impulsion négative sur R̄ ou S̄. Cette bascule est le montage le plus simple
(à base de portes logiques) réalisant cette fonction.
Chaque bascule peut mémoriser un bit, il faut donc :
– m bascules, où m est la taille du mot machine ;
– 2n étages de m bascules où n est la largeur du bus d’adresse de la RAM.
Cette réalisation est simple mais nécessite un décodeur interne à 2n sorties, donc une surface
de boitier importante. Son accès est cependant rapide.
Les ROMs
Principe Les mémoires ROMs (Read Only Memory) sont par définition des mémoires en
lecture seule. Leur contenu a été défini une fois pour toute et elles ne sont plus inscriptibles
(voir par exemple Figure 4.9).
Remarque Les liaisons entre les lignes de sélection d’adresse (lignes horizontales de la ma-
trice), et les lignes de données (lignes verticales de la matrice) ne peuvent être de simples
connexions, mais doivent être réalisées à l’aide de diodes. Les diodes servent à éviter un retour
de courant depuis la ligne sélectionnée vers une autre qui ne l’est pas (court-circuit) :
Réalisation pratique Les connexions entre les lignes et les colonnes peuvent par exemple
être réalisées à l’aide de transistors MOS dont on intègre ou non la grille au moment de la
fabrication de la puce :
Exercice 1. Le microcontrôleur C167 d’Infinéon possède un espace adressable de 16Mio qui est
segmenté et paginé.
1. Donner la taille de son bus d’adresse ;
2. La mémoire est organisée en 256 segments de taille identique. Trouver la taille de ces
segments ;
3. Sachant que les pages ont une taille fixe de 16 Kio, trouver le nombre de pages par segment.
4.8 En pratique
Les barrettes mémoires
Il existe de nombreux types de mémoires vives. Celles-ci se présentent toutes sous la forme
de barrettes de mémoire enfichables sur la carte mère. Les premières mémoires se présentaient
sous la forme de puces appelées DIP (Dual Inline Package). Désormais les mémoires se trouvent
généralement sous la forme de barrettes, c’est-à-dire des cartes enfichables dans des connecteurs
prévus à cet effet. On distingue deux types de barrettes de RAM :
– les barrettes au format SIMM (Single Inline Memory Module) : il s’agit de circuits imprimés
dont une des faces possède des puces de mémoire. Il existe deux types de barrettes SIMM,
selon le nombre de connecteurs :
– Les barrettes SIMM à 30 connecteurs (dont les dimensions sont 89x13mm) sont des mémoires
8 bits qui équipaient les premières générations de PC (286, 386).
– Les barrettes SIMM à 72 connecteurs (dont les dimensions sont 108x25mm) sont des mémoires
capables de gérer 32 bits de données simultanés. Ces mémoires équipent des PC allant du
386DX aux premiers pentiums. Sur ces derniers le processeur travaille avec un bus de données
d’une largeur de 64 bits, c’est la raison pour laquelle il faut absolument équiper ces ordinateurs
de deux barrettes SIMM. Il n’est pas possible d’installer des barrettes 30 broches sur des
emplacements à 72 connecteurs dans la mesure où un détrompeur (encoche au centre des
connecteurs) en empêche l’enfichage.
– Les barrettes au format DIMM (Dual Inline Memory Module) sont des mémoires 64 bits, ce
qui explique pourquoi il n’est pas nécessaire de les apparier. Les barrettes DIMM possèdent
des puces de mémoire de part et d’autre du circuit imprimé et ont également 84 connecteurs
de chaque côté, ce qui les dote d’un total de 168 broches. En plus de leurs dimensions plus
grandes que les barrettes SIMM (130x25mm) ces barrettes possèdent un second détrompeur
pour éviter la confusion.
A noter que les connecteurs DIMM ont été améliorés afin de permettre une insertion facile des
barrettes grâce à des leviers situés de part et d’autre du connecteur.
Pour reconnaître une barrette de mémoire, vous devez tout d’abord identifier le type de bar-
rette que vous pouvez mettre dans votre ordinateur. Pour cela, allez jeter un oeil du côté des
emplacements mémoire (les bancs). Si vous avez deux détrompeurs, il s’agit soit de SDRAM
soit de RAMBUS. La RAMBUS à ses deux détrompeurs très rapprochés, alors que la SDRAM
en à deux mais éloignés. La SDRAM-DDR n’a qu’un détrompeur situé presque au milieu des
bancs.
Identifiez aussi la barrette : des informations peuvent être inscrites sur une étiquette collée
dessus. Dans le cas contraire, On peut aussi se fier à la hauteur des chips : les chips sont très peu
épais, environ 1 mm (c’est de la mémoire "récente" : SDRAM, SDRAM-DDR, SDRAM-DDR2,
DR-RAM, etc.), si les chips sont assez épais, plus de 2 mm (c’est de la SIMM, SIMM-EDO,
etc.). On peut aussi compter le nombre de broches : 30 (c’est de la SIMM-30), 72 (c’est de la
SIMM-72 ou SIMM-EDO), 168 (c’est de la SDRAM), 184 (c’est de la SDRAM-DDR, SDRAM-
DR2, DR-SDRAM), 240 (c’est de la SDRAM-DDR2). Enfin, pour savoir si votre barrette est
une DIMM, SO-DIMM et Micro DIMM, il suffit de mesurer la longueur de la barrette. Avec
133 mm, votre barrette sera une DIMM. 67 mm pour une SO-DIMM 144 broches, 39 mm pour
la Micro DIMM 144 broches et 44 mm pour la Micro DIMM 172 broches (note : les mesures
sont arrondies au mm le plus proche).
4.7. CAS PARTICULIERS 49
Les fabricants d’ordinateurs vendent souvent plusieurs gammes de produits, organisées en ser-
veurs et en stations de travail. Les serveurs vont contenir de la mémoire ECC dans leur archi-
tecture. Les fabricants de stations de travail Unix utilisent de la mémoire à parité et maintenant
ECC depuis plusieurs années dans toutes leurs gammes de produits. Cette dernière offre aussi
théoriquement un moyen de détecter des modifications semi-aléatoires causées par certains
rayonnements (rayonnements alpha). Utiliser de la mémoire ECC sur un ordinateur dont le
contrôleur ne le gère pas, est une aberration. Prenez donc une mémoire NON-ECC qui sera
moins chère et tout aussi efficace dans votre cas.
50 CHAPITRE 4. ESPACE ADRESSABLE - MÉMOIRES
Chapitre 5
Dans ce chapitre, nous décrivons précisément l’architecture des processeurs et précisons le rôle
de leurs principaux constituants.
Cette description étant faite en toute généralité, elle ne décrit pas l’architecture d’un processeur
particulier mais les constituants de base de tout processeur. Pour connaître l’architecture précise
d’un processeur particulier, il n’y a pas d’autre solution que de se référer à son manuel.
On rappelle que le rôle d’un processeur est d’exécuter des programmes. Un programme est une
suite d’instructions élémentaires stockées en mémoire. Le processeur exécute donc séquentielle-
ment ces instructions.
51
52 CHAPITRE 5. ARCHITECTURE DES (MICRO)PROCESSEURS
5.1.1 L’horloge
Son rôle est de cadencer le microprocesseur. C’est le métronome du système permettant de
synchroniser les communications avec les autres éléments du système telle que la mémoire.
L’horloge peut être générée à l’aide d’un oscillateur à quartz (cristal à quartz souvent repéré
par son nom anglais XTAL) ou par l’utilisation d’une PLL (Phased Lock Loop) qui produit des
multiples de la fréquence d’oscillation du quartz. Le signal produit est un signal créneau dont
chaque front montant correspond à des « tops » d’horloge.
Plus la vitesse de l’horloge est élevée, plus le µP peut exécuter les instructions de base à
un rythme élevé. La contre-partie est que cela génère des transitions plus fréquemment au
niveau des transitors et donc une consommation de courant plus importante ce qui implique un
échauffement du circuit d’où la nécessité d’avoir une solution de refroidissement du processeur
adaptée.
5.1. SCHÉMATIQUE GÉNÉRALE 53
Pour savoir à quel endroit de la mémoire regarder, le processeur utilise des adresses mémoires
pour repérer les cases contenant les instructions et les données du programme.
Les adresses circulent sur un bus de communication appelé bus d’adresse. Une adresse ne circule
que du processeur vers la mémoire. Le bus d’adresse est donc un bus unidirectionnel.
Une fois l’adresse choisie, une donnée (instruction ou donnée du programme) transite entre le
processeur et la mémoire.
Ces données transitent sur un bus de communication appelé bus de donnée. Une donnée peut
aller du processeur vers la mémoire (écriture) ou de la mémoire vers le processeur (lecture). Le
bus de données est donc bidirectionnel.
Exemple 16. Supposons que l’instruction présente dans le registre (RI) soit décodée en une
instruction d’addition, le rôle de l’unité de contrôle est d’acheminer les deux opérandes dans
les registres adéquats de l’unité arithmétique et logique, puis d’ordonner à celle-ci de réaliser
l’opération d’addition, puis de récupérer le résultat du calcul pour le placer dans un registre
approprié. Et enfin d’indiquer qu’il faut traiter l’instruction suivante (mise à jour du registre
IP).
L’unité de contrôle génère également tous les signaux de synchronisation internes ou externes
(bus de commandes ou bus de contrôle) au microprocesseur.
Ce sont des instructions indiquant un transfert entre la mémoire et un des registres principaux
du processeur.
Lorsque le transfert est effectué de la mémoire vers le CPU, on parle de lecture en mémoire.
Lorsque le transfert est effectué du CPU vers la mémoire, on parle d’écriture en mémoire.
Ce sont des instructions mettant en jeu une donnée et le registre accumulateur de l’UAL. Le
résultat de cette opération est placée dans le registre accumulateur.
Instructions de comparaison
Exemple 18. L’opération ACC −donnee est calculée, le résultat est perdu mais le bit indicateur
d’état N est mis à 1 dans le registre d’état si ACC < donnee.
Instructions de branchement
Dans ce cas, le processeur ne doit plus suivre l’ordre séquentiel des instructions placées en
mémoire mais doit effectuer des sauts (en avant ou en arrière). La prochaine instruction à
exécuter étant repérée en mémoire par le registre IP, c’est ce registre qui est modifié lorsqu’un
saut doit être effectué.
On distingue deux types de branchements :
– branchements inconditionnels : IP ← @instruction ;
– branchements conditionnels : Si une condition est satisfaite, alors branchement, sinon passage
simple à l’instruction suivante.
56 CHAPITRE 5. ARCHITECTURE DES (MICRO)PROCESSEURS
champ champ
code opération code opérande
(1 ou 2 octets) (1 ou 2 octets)
5.3 Pipeline
Plus un processeur peut exécuter d’instructions rapidement plus il est performant. Nous avons
vu que la fréquence d’horloge utilisée était un des facteurs de performance du processeur. Ce
n’est pas le seul.
On rappelle que pour exécuter une instruction, le processeur suit 4 étapes principales :
1. fetch ;
2. decode ;
3. execute ;
4. writeback
Deux politiques sont alors possibles :
– Une instruction démarre uniquement lorsque l’instruction précédente est terminée.
Fetch I1 I2
Decode I1 I2
Execute I1 I2
Writeback I1 I2
−→ time
– Dès qu’une étape d’une instruction est terminée, on effectue la même étape pour l’instruction
suivante :
Fetch I1 I2 I3 I4 I5
Decode I1 I2 I3 I4 I5
Execute I1 I2 I3 I4 I5
Writeback I1 I2 I3 I4 I5
−→ time
Cette seconde approche, appelée technique du pipeline, permet d’effectuer beaucoup plus d’ins-
tructions dans le même temps.
Attention, les instructions sont toujours exécutées séquentiellement mais à un instant donné,
plusieurs instructions sont traitées « en même temps ».
Exemple 19. Par exemple au temps 4, I1 est en phase writeback, I2 en phase execute, I3
en phase decode et I4 en phase fetch. Aucune instruction n’est terminée, elles sont toutes en
cours de traitement (à des stades différents) par le processeur.
Remarque 19. Notez que le pipeline n’est pas toujours possible, en particulier lorsqu’il y a une
dépendance entre deux instructions. Par exemple lorsque une instruction doit attendre le résultat
d’un long calcul (plusieurs cycles d’horloge) pour être exécutée, cela provoque des « trous » dans
le pipeline.
Ce n’est pas le cas le plus grave, lorsqu’il y a une interruption (logicielle ou matérielle, cf TP) il
faut purger le pipeline, c’est à dire sauvegarder le contexte des instructions en cours d’exécution.
Cette sauvegarde se fait en utilisant la pile et un pointeur de contexte pour se situer dans la
pile.
58 CHAPITRE 5. ARCHITECTURE DES (MICRO)PROCESSEURS
5.4 Interruptions
En informatique, une interruption est un arrêt temporaire de l’exécution normale d’un pro-
gramme informatique par le microprocesseur afin d’exécuter un autre programme (appelé rou-
tine d’interruption).
Dans son acception la plus stricte, le terme ne désigne que des interruptions dont l’exécution
est provoquée par des causes externes au programme : avancement d’une horloge, signalisation
de la complétion d’un transfert de données, etc.
Cependant, on l’utilise aussi pour désigner des exceptions, c’est-à-dire des arrêts provoqués par
une condition exceptionnelle dans le programme (instruction erronée, accès à une zone mémoire
inexistante, calcul arithmétique incorrect, appel volontaire au système d’exploitation...).
On parle alors parfois d’interruptions asynchrones pour désigner celles provoquées par un évé-
nement externe, et d’interruptions synchrones pour désigner les exceptions.
5.4.1 Fonctionnement
Lors d’une interruption, le microprocesseur sauve tout ou partie de son état interne, géné-
ralement dans la pile système, et exécute ensuite une routine d’interruption, généralement en
suivant les directives d’une table indiquant pour chaque type d’interruption, le sous programme
à exécuter.
Une fois le traitement de l’interruption terminé, la routine se finit normalement par une instruc-
tion de retour d’interruption, qui restaure l’état sauvé et fait repartir le processeur de l’endroit
où il avait été interrompu.
Dans certains cas, la routine d’interruption modifie les adresses de retour, notamment pour
effectuer des commutations de tâches. Lors du fonctionnement de certaines parties du système
d’exploitation, il peut être nécessaire de ne pas permettre les interruptions, soit parce que celles-
ci perturberaient un compte serré du temps, soit parce que des structures de données sont en
cours de modification (on réalise ainsi une sorte de verrou d’exclusion mutuelle dans un système
mono-processeur).
Aussi, on peut généralement bloquer (on dit souvent masquer) les interruptions. Dans la plupart
des systèmes, les interruptions bloquées sont accumulées, c’est-à-dire qu’elles sont exécutées dès
qu’elles sont démasquées.
Cependant, pour chaque type d’interruption, le compteur d’interruptions en attente se réduit
souvent à un simple drapeau ; si cela peut ne pas être gênant si l’interruption signale des
données en attente sur un périphérique, cela peut cependant occasionner des mauvais comptes
si l’interruption déclenche l’incrémentation d’une horloge, si les interruptions sont bloquées
pour une durée supérieure à la période de l’horloge.
Sur certains systèmes, il existe une interruption non masquable, généralement dédiée au si-
gnalement d’une erreur catastrophique pour le système (par exemple, détection d’une erreur
mémoire par code correcteur d’erreurs).
Les interruptions peuvent par ailleurs être hiérarchisées suivant des priorités. Une interruption
de priorité supérieure est prise en compte lors du traitement d’une autre interruption, mais une
interruption de priorité inférieure est mise en attente.
5.3. PIPELINE 59
5.4.2 Usages
On utilise les interruptions principalement dans deux buts : afin de permettre des communica-
tions non bloquantes avec des périphériques externes ; afin de commuter entre les tâches dans
un ordonnanceur. Un autre usage, celui-là non prévu initialement, est l’introduction de mal-
versations : lors de la restauration du contexte, si le contenu de la zone de sauvegarde a été
altéré depuis l’appel (c’est le cas si l’interruption ou le déroutement provoque en mode maître
une altération du contenu de la zone de sauvegarde ou de la pile), le contexte restauré sera
totalement différent du contexte d’appel, et pourra passer la main à des suites d’instructions
hostiles. Les systèmes comme le matériel des microprocesseurs s’efforcent de plus en plus de
rendre ces tâches difficiles pour les pirates, mais la faille - bien que fortement réduite aujourd’hui
- continue dans une certaine mesure à exister.
Entrées-sorties
Lorsque le microprocesseur interroge un périphérique (disque dur, port de communication...),
il y a en général des délais avant que les données ne puissent être obtenues ou transmises. La
solution la plus simple est simplement d’attendre les données ou la fin de la transmission en
bouclant répétitivement sur un test (attente active, ou polling). Malheureusement, cela bloque
tout programme en cours, ce qui est gênant sur un système multi-tâche. Sur les systèmes
modernes, on préfère donc généralement un fonctionnement par interruption : le périphérique
signale par une interruption qu’il est prêt à émettre, ou que les données ont été transmises ou
reçues, et une routine fait le traitement nécessaire. Pour les périphériques rapides (disque dur,
USB...), on combine généralement ce procédé avec l’accès direct en mémoire (DMA) : des blocs
de données sont lus ou écrits en mémoire par le contrôleur sans intervention du processeur,
qui n’intervient qu’en début et en fin de transfert. L’usage d’interruptions par rapport au
polling permet aussi des économies d’énergie et un moindre échauffement : les microprocesseurs
actuels possèdent généralement une instruction arrêtant le microprocesseur en attente d’une
interruption.
Multi-tâche
On utilise également les interruptions pour commuter les tâches dans les systèmes multi-tâches.
Généralement, une interruption périodique est déclenchée par une horloge (souvent 100 ou 1
000 Hz), et l’ordonnanceur est alors mis en action. Il peut commuter les tâches en modifiant la
tâche de retour de l’interruption.
60 CHAPITRE 5. ARCHITECTURE DES (MICRO)PROCESSEURS
5.4.3 Remarques
Priorité des interruptions De façon tout à fait contre-intuitive, c’étaient dans les premiers
systèmes les périphériques les plus lents qui étaient affectés des priorités d’interruption les plus
hautes. En effet : Ces interruptions étant peu nombreuses à cause de cette lenteur, leur haute
priorité n’avait que peu d’impact sur la charge Ces périphériques pouvaient être synchrones
(interruption liée à une colonne de carte perforée sous le lecteur, par exemple) et exiger un
traitement aussi immédiat que possible. Les priorités étaient attribuées en ordre décroissant
ainsi : pupitre de commande, lecteur de cartes, imprimante, disque. Les interfaces graphiques
n’ont plus permis que le traitement de l’écho d’un caractère soit traité par une routine de haute
priorité (le positionnement de cet écho, en multifenêtrage et avec des polices de taille variable,
nécessite en effet plusieurs dizaines de milliers d’opérations), et rendent paradoxalement ces
interfaces bien moins réactives dans les situations de forte charge machine, en dépit de l’usage
de processeurs considérablement plus puissants.
Interruptions contre polling Les interruptions ont au départ représenté un énorme progrès
par rapport à l’attente active de périphériques : en effet, l’unité centrale n’était pas obligée de
perdre du temps dans des boucles d’attente et n’était sollicitée par les différents périphériques
que lorsque quelque chose était à faire. L’apparition de périphériques très rapides comme les
disques SSD qui demandent des dizaines de milliers d’interventions par seconde a sensiblement
changé la donne : les sollicitations de l’unité centrale deviennent si nombreuses que les sauve-
gardes d’états nécessitées par les interruptions deviennent elles-mêmes une source de contre-
performance ! Le noyau 2.6.32 de Linux permet donc de basculer lorsque nécessaire du mode
interruption au mode attente active (en anglais polling) pour ce type de périphérique.
Description vulgarisée
De nombreux ensembles de circuits électroniques spécialisés placés dans les ordinateurs assurent
chacun une fonction bien précise, par exemple gérer l’affichage à l’écran ou bien l’activité d’un
disque ou d’une interface réseau. Ils sont dits spécialisés car ils sont incapables de réaliser
d’autres fonctions que celles pour lesquelles ils furent conçus, tandis que le processeur principal
(UCT) reste leur chef d’orchestre et carrefour des communications. Les composants de chaque
ensemble se trouvent d’ordinaire rassemblés sur une carte d’extension ou sur une zone de la
carte-mère.
La plupart de ces ensembles spécialisés ne peuvent assurer seuls toutes les fonctions nécessaires
à leurs missions. Donc ils sollicitent parfois l’assistance du processeur principal, ne serait-ce que
pour fournir ou obtenir des informations issues d’autres éléments de la machine. Pour ce faire,
le processeur peut à intervalles réguliers interroger chacun d’eux afin de déterminer s’il a besoin
d’aide, par exemple afin de fournir ou bien d’obtenir des informations.
Ces interrogations répétées et souvent inutiles le distraient de sa mission qui consiste à animer
les programmes de l’utilisateur. De surcroît la fraction des ressources du processeur principal
constamment mobilisée par ces interrogations augmente avec le nombre et la puissance des
ensembles spécialisés.
Divers moyens techniques épargnent au processeur ces interrogations périodiques en fournissant
aux ensembles spécialisés un moyen d’attirer son attention à n’importe quel moment afin qu’il
les assiste, donc en ne le distrayant de l’exécution des programmes de l’utilisateur qu’au besoin.
Pour cela certaines pattes (contacts physiques) du processeur se trouvent reliées à des pistes
électriques le reliant aux ensembles spécialisés. Chacun de ces derniers peut s’y manifester en
modifiant le niveau logique de la ligne afin de requérir de l’aide, donc d’inviter le processeur à
prendre les dispositions nécessaires. Pour répondre à une requête le processeur devra :
– préserver le contexte d’exécution du programme en cours afin de pouvoir, à terme, en re-
prendre l’exécution ;
– lire en mémoire l’emplacement du programme destiné à gérer l’événement particulier (ap-
pelé gestionnaire d’interruption ou routine de gestion d’interruption (interrupt handler en
anglais)), pré-établi lors de la prise en charge, par l’ordinateur, de l’ensemble spécialisé (sou-
vent lors de l’amorçage) ;
– exécuter la routine, court programme grâce auquel le processeur interagira avec l’ensemble
spécialisé qui le sollicite afin de satisfaire ses attentes ;
– restaurer le contexte d’exécution du programme interrompu ; et enfin
– continuer à exécuter ce dernier.
62 CHAPITRE 5. ARCHITECTURE DES (MICRO)PROCESSEURS
Notes :
– cette séquence d’événements peut survenir très fréquemment (plusieurs dizaines de milliers
de fois par seconde) ;
– des composants auxiliaires (en particulier un circuit gestionnaire d’interruptions) assistent le
processeur lors de ces traitements ;
– lorsque plusieurs interruptions surviennent simultanément, le processeur (voire le système
d’exploitation, lorsqu’il fournit la routine de gestion) dispose de moyens de déterminer leurs
priorités respectives donc l’ordre de prise en compte.
Les pistes électriques délivrant ces informations au CPU sont appelées lignes d’interruption ou
lignes d’IRQ. Dans un lointain passé chacune se trouvait associée, à un moment donné, à un
seul ensemble spécialisé mais des astuces permettent à présent de laisser plusieurs ensembles
solliciter le CPU par le biais de la même ligne d’IRQ, même de façon simultanée.
Le sigle IRQ désigne tout à la fois le concept même d’interruption de l’exécution sur requête
tierce ainsi que l’une de ces requêtes.
Chapitre 6
Exercices
63
64 CHAPITRE 6. EXERCICES
• 1100012 • FF16
• 4218 • FACE16
• 7F16 • CAFE16
• 11 • 160
• 23 • 511
• 127 • 1024
• -11 • -160
• -23 • -123
• 23+35 • -35+23
• -23+35 • -103+(-25)
• 121,125 • 1,046975
• -98,625 • 0,1
6.6 Décodage
Indiquez, en la justifiant, la valeur décimale codée par la suite (1101100101110101)2 qui repré-
sente un entier signé en complément à 2 sur 16 bits.
6.7. CODAGE 65
6.7 Codage
Reliez avec des flèches les valeurs de la table 1 à son codage IEEE 754 dans la table 2.
Motivations : booléens
En langage C, il n’y a pas de type booléen (TRUE ou FALSE, VRAI ou FAUX, 1 ou 0). Ainsi
lorsque vous voulez stocker un booléen vous déclarez souvent un int (16 ou 32 bits) ou mieux,
si vous avez conscience du codage de l’information, d’un char (8 bits).
Le problème est que si vous devez travailler sur plusieurs bits isolés (indicateurs d’états, flags,
. . .) cela peut rapidement utiliser une grande partie de la RAM (pour un bit utile, 7 bits inutiles
dans le meilleur cas. . .) ce qui est problématique dans les systèmes à microcontrôleurs où la
RAM est souvent limitée.
Pour limiter ce problème et optimiser l’espace mémoire, on regroupe souvent ces bits isolés dans
un même mot machine (8 ou 16 bits pour les cibles qui nous concernent).
Dans ce mot machine, tous les bits n’ont pas la même signification et il faut pouvoir ex-
traire/modifier/manipuler le bit qui nous intéresse. Or il n’y a aucune instruction C qui per-
mette de lire ou écrire un bit isolé dans un octet.
Pour cela, on dispose d’opérateurs logiques bit à bit qui sont présentés dans le tableau suivant :
Opérateur Fonction
& ET (AND)
| OU (OR)
b OU exclusif (XOR)
∼ Inversion (NOT)
>> Décalage à droite (Right Shift)
<< Décalage à gauche (Left Shift)
66 CHAPITRE 6. EXERCICES
6.11 Décalage en C
1. À quoi correspond un décalage de n crans vers la gauche ? vers la droite ? Vérifiez le à
l’aide d’un morceau de code C.
2. Ecrivez une procédure permettant d’afficher l’écriture binaire d’un octet passé en para-
mètre. Testez son appel dans un programme principal.
6.12. CHIP SELECT 67
1. Quelles doivent être les valeurs de CS1 et CS2 pour que le processeur puisse lire une
donnée dans le Bloc2 . Quel est la conséquence (en terme d’états logiques) pour les bus de
données en sortie du Bloc1 et en sortie du Bloc2 ?
2. Quel souci est ainsi évité ?
3. Quels sont les signaux susceptibles de venir sur le port de contrôle du buffer tristate ?
68 CHAPITRE 6. EXERCICES
1. Sachant que les buffers tristates « connectent » leur bus de données au bus de données
du processeur sur un signal de contrôle de valeur logique 0, donner en fonction de CS, r,
w les expressions des signaux : ieBloc1 , oeBloc1 , ieµP et oeµP .
2. Faites un schéma logique reliant les signaux de contrôle du processeur (r et w) aux ports
de contrôle des buffers tristates du Bloc1 .
Étude de la mémoire
La Figure 6.3 donne le schéma d’une demi-carte mémoire composée de 4 circuits intégrés de
128 mots de 8 bits chacun et de circuits de décodage d’adresse.
Chaque circuit intégré comporte 6 bornes de validation : CS0 , CS1 , CS2 , CS3 , CS4 et CS5 .
Le circuit est sélectionné lorsque les CSi sont à 1 et les CSi sont à 0.
Quelles sont les zones mémoires (plages d’adresses : adresse de début et adresse de fin) permet-
tant d’accéder aux circuits 1,2,3 et 4 de la demi-carte de la Figure 6.3 ?
Même question pour l’autre demi-carte.
70 CHAPITRE 6. EXERCICES
D’après la représentation normalisée des composants IC2, IC3, IC4 et IC5, quels doivent
être les niveaux logiques présents sur /ROM1, /ROM2, /RAM et /PIA pour que :
1. Seul IC2 soit sélectionné :
2. Seul IC3 soit sélectionné :
3. Seul IC4 soit sélectionné :
4. Seul IC5 soit sélectionné :
Déduire de la table de vérité du 74138 et des résultats précédents les niveaux logiques que
devra appliquer le CPU sur A13, A14 et A15 pour sélectionner :
1. Le composant PIA IC5 :
2. Le composant RAM IC4 :
3. Le composant ROM2 IC3 :
4. Le composant ROM1 IC2 :
On remarque que les lignes d’adresses de poids plus faibles (A12, A11. . . A0) ne participent
pas à la sélection des composants. à chaque combinaison (A15 ; A14 ; A13) correspond tout un
ensemble d’adresses.
Compléter le tableau suivant selon l’exemple.
74 CHAPITRE 6. EXERCICES
La taille d’une plage d’adresses de sélection est tout simplement le nombre d’adresses que l’on
peut écrire entre sa première et sa dernière adresse (comprise).
La taille de la plage d’adresses sélectionnée par /ROM1 est ....
La taille de la plage d’adresses sélectionnée par /PIA est également 213 pourtant il n’y a que
24 adresses effectives pour le composant PIA. En effet seuls A0, A1, A2 et A3 sont reliés à ce
composant, les fils A4 à A12 sont donc indifférents. On peut sélectionner chaque adresse du PIA
indifféremment avec les 29 combinaisons de A4 à A12. On dit que ce composant à 29 adresses
images et qu’il s’agit d’un décodage partiel. Pour les autres composants de la carte, tout le bus
d’adresses est utilisé, il s’agit donc d’un décodage complet.
6.17. PLAN MÉMOIRE 75
1. Quelles sont les adresses de début et de fin de la zone de RAM ? La zone RAM comporte
combien d’adresses ?
2. Quelles sont les adresses de début et de fin de la zone de EEPROM ? La zone EEPROM
comporte combien d’adresses ?
3. Quelles sont les adresses de début et de fin de la zone de ROM (En dehors de la zone
INTERRUPT VECTORS) ? La zone ROM comporte combien d’adresses ?
Les exercices suivants sont tirés des sujets de baccalauréat STI électronique session 1998 et
2001 ainsi que du concours général des lycées session 2003.
RAM/C = AC13.AC14.AC15.CC
CS1/C = AC8.AC9.AC10.AC11.AC12.AC13.AC14.AC15.CC
CS2/C = AC8.AC9.AC10.AC11.AC12.AC13.AC14.AC15.CC
CS3/C = AC8.AC9.AC10.AC11.AC12.AC13.AC14.AC15.CC
– RAM/C permet de sélectionner la RAM U3.
– CS1/C permet de sélectionner le décodeur DECX U34.
– CS2/Cpermet de sélectionner le décodeur DECY U19.
– CS3/Cpermet de sélectionner le décodeur DECZ U15.
Les signaux CS1/C, CS2/C, CS3/C, RAM/C sont actifs au niveau logique 0.
CC est une sortie du microcontrôleur U16 : 68HC11, vous considérerez que CC est positionné
en permanence au niveau logique 1.
1. Compléter le tableau mémoire suivant indiquant pour chaque composant l’adresse de
début et de fin en hexadécimale de leur plage d’adresses.
Le signal Z/C0 qui sélectionne le composant U53 : AD7528 (voir schéma structurel AN1)
est généré par le décodeur DECZ U15 : 74HC138 (voir schéma structurel AN2).
2. Compléter le tableau suivant en indiquant le niveau logique à positionner sur chaque
entrée de U15 :74HC138 pour positionner la sortie Z/C0 au niveau logique 0.
3. À partir des tableaux ci-dessus, donner en hexadécimale l’adresse du composant U53 : AD7528.
Justifier votre réponse.
6.19 Baccalauréat STI génie électronique session 2001
6.19.1 Étude de la mémorisation des programmes et des variables
Déterminer les capacités mémoire, en kilo-octets, de IC3 et IC4.
6.23 Synthèse
1. En reprenant les principes des deux types d’associations (série et parallèle), concevoir et
expliquer le schéma logique permettant de réaliser une mémoire de 16Ki mots de 8 bits
en utilisant des mémoires de 8Ki mots de 4 bits et de portes logiques. Cette mémoire
comportera également un Chip Select actif niveau bas ;
2. Expliquer (sans faire le schéma) comment vous feriez pour réaliser une mémoire de 32Ki
mots de 16 bits, de 64Ki mots de 32 bits, etc. . .