Introduction au microcontrôleur
Pr.EL HMIDI
Introduction Aux Systèmes Microprogrammés
Les différents systèmes programmables
Systèmes
Programmables
Les systèmes Les systèmes en logique
Les circuits spécialisés programmée
micro-programmés
Microprocesseur
Définition
- Un microprocesseur ou processeur ou encore CPU (Central
Processing Unit) est l'unité intelligente de traitement des
informations
Microprocesseur
Définition
-C'est un circuit intégré complexe (un circuit intégré à très
grande échelle d’intégration-VLSI) chargé d’organiser les tâches
précisées par le programme, de les décoder et d’assurer leur
exécution
- Premier Microprocesseur : Intel 4004 (en 1971)
Microprocesseur
Architecture interne d’un Microprocesseur
Microprocesseur
Architecture interne d’un Microprocesseur
Microprocesseur
Unité de traitement : Elle exécute les instructions
- L’Unité Arithmétique et Logique (UAL) :
Est un circuit complexe qui assure les fonctions
logiques(ET, OU, etc…) ou arithmétique (addition,
soustraction…)
Microprocesseur
Unité de traitement : Elle exécute les instructions
- L’accumulateur :
C’est un registre de travail qui sert à stocker le
résultat des opérations réalisées par L’UAL
Microprocesseur
Unité de traitement : Elle exécute les instructions
- Le registre d'état :
Chacun des bits de ce registre dépend du résultat
de la dernière opération effectuée par l’UAL
Microprocesseur
Unité de commande :Elle permet de séquencer le
déroulement des instructions
- PC « Programme Counter » :
Appelé aussi Compteur Ordinal. Il contient
toujours l’adresse de la prochaine instruction
à exécuter
Microprocesseur
Unité de commande : Elle permet de séquencer le
déroulement des instructions
- Bloc logique de commande (séquenceur) :
Il organise l'exécution des instructions au rythme
de l’horloge
Microprocesseur
Unité de commande :Elle permet de séquencer le
déroulement des instructions
- Le décodeur d'instruction :
Le mot binaire (instruction) est décodé pour
savoir à quelle action correspond l’instruction
Microprocesseur/Architecture
Il existe fondamentalement des types d'architectures informatiques
numériques :
• Architecture de Von Neuman
• Architecture Harvard
• Architecture CISC & RISC
Architecture de Von Neuman
Un seul chemin d'accès à la mémoire :
- Un bus de données (programme et données) ;
- Un bus d’adresse (programme et données)
Goulot d'étranglement pour l'accès à la mémoire
Architecture de HARVARD
Séparation des mémoires programme et données
- Un bus de données pour programme et pour les données
- Un bus d’adresse pour programme et pour les données
Meilleure utilisation du CPU
Chargement du programme et des données en parallèle
Architecture CISC & RISC
- Les processeurs généraux actuels se répartissent en deux
grandes catégories appelées CISC et RISC
- Les processeurs de ces deux catégories se distinguent par la conception
de leurs jeux d'instructions
Jeu d’instructions
Toutes les instructions compréhensibles par les microprocesseur forment ce
que l’on appelle le jeu d’instructions
Architecture CISC & RISC
On distingue 2 types de jeu d’instructions :
- RISC (Reduced Instructions Set Computer) : Il s’agit d’un plan de conception
de CPU basé sur des instructions simples et rapide
- CISC (Complex Instructions Set Computer) : Il s’agit d’un plan de conception
du CPU basé sur des instructions uniques, capables d’exécuter des
opérations en plusieurs étapes.
Architecture CISC & RISC
Instructions Exécution des
RISC Machine Instructions
Instructions Exécution de
CISC Machine
Micro-Instructions
Micro-Instructions
Le traitement des instructions
• (1) Charger une instruction depuis la
mémoire
• (2) Charger les opérandes depuis la
mémoire
• (3) Effectuer les calculs
• (4) Stocker le résultat en mémoire
Microcontrôleur
Définitions
- Le Microcontrôleur est un circuit intégré qui contient un petit
system informatique
Département
Microcontrôleur
Contenu type d’un microcontrôleur
La structure interne d'un microcontrôleur comporte typiquement :
• Une unité de calcul et de commande
• Mémoire ROM & Mémoire RAM
• Un contrôleur d’interruption
• Un compteur / temporisateur (timer)
• Des entrées / sorties parallèles (ports)
• Un UART (port série)
Microcontrôleur
Contenu type d’un microcontrôleur
Il peut aussi posséder :
• Une sortie PWM (modulation d’impulsion)
• Un CAN/CNA (Convertisseur analogique numérique)
• Un Watchdog (surveillance du programme)
Microcontrôleur
Architecture interne d’un Microcontrôleur
Microcontrôleur
Architecture interne d’un Microcontrôleur
Les mémoires (RAM / EEPROM / EPROM FLASH)
Microcontrôleur
Architecture interne d’un Microcontrôleur
A. Les mémoires (rappel)
Une mémoire est un composant électronique à base de semi-
conducteurs permettant de stocker des informations sous
forme binaire
Microcontrôleur
Architecture interne d’un Microcontrôleur
A. Les mémoires (rappel)
Memoire
• Un emplacement qui contient des données.
• Organisé par cellules individuelles.
• Chaque cellule possède:
(la même) taille: en nombre de bits.
une adresse unique: permet de savoir à quel endroit on veut
stocker l’information.
Mémoire=Stockage de bits
On regroupe les bits ensemble
pour former un «mot».
Ici, les mots ont 8 bits (1 octet)
0 1 0 1 1 0 1 1 Chaque case contient un bit (0 ou 1)
1 1 1 0 1 0 0 1
0 1 0 0 1 0 0 1
Une case ne peut jamais être
0 1 0 0 1 1 0 1 «vide»!
Elle contient toujours 0 ou 1.
0 1 1 1 1 0 0 0
⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮
1 1 0 1 0 0 0 1
Pour identifier les mots, on leur associe une adresse, qui correspond au numéro de ligne dans le
tableau.
Mémoire=Stockage de bits
Adresse Donnée (mot de 8 bits)
On utilise un nombre (fini et (sur 8 bits)
Ici, l’exemple utilise 8 bits d’adresse, et
prédéterminé) de bits pour
représenter l’adresse. 0x00 0 1 0 1 1 0 1 1 des mots de 8 bits.
0x01 1 1 1 0 1 0 0 1
0x02 0 1 0 0 1 0 0 1
Différents systèmes
0x03 0 1 0 0 1 1 0 1 peuvent avoir différentes valeurs!
0x04 0 1 1 1 1 0 0 0
⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮
0xFF 1 1 0 1 0 0 0 1
Memoire
• On décrit une mémoire grâce à deux informations (indépendantes):
• le nombre d’adresses possibles
• Dans l’exemple : 28 = 256 adresses
• la taille des mots de la mémoire
• Dans l’exemple : 8 bits (1 octet)
• La taille totale de la mémoire représente la quantité totale de bits
pouvant être stockée dans la mémoire.
• Elle est calculée de cette façon:
taille mémoire = nombre d'adresses ×
taille d'un mot
= 28 × 1 octet = 256 octets
En résume
• C’est le CPU qui initie toute action.
Adresse
• Une lecture s’effectue en deux temps.
Lecture d’une donnée en mémoire
Adresse
CPU RAM Le CPU:
L/E Données
• place l’adresse (ex: 0x40) sur le bus
d’adresses;
Données
• active le bus de contrôle en lecture.
Contrôle (L/E)
En résume
Adresse
La mémoire:
• place la donnée correspondante sur le
Adresse bus de données;
CPU RAM
L/E Données
Le CPU:
Données
• récupère la donnée (ex: 0x12) sur le
Contrôle (L/E)
bus de données (et la place dans un registre).
En résume
écriture d’une donnée en mémoire
Adresse
Le CPU:
Adresse
• place l’adresse (ex: 0x40) sur le bus
d’adresses;
CPU RAM
• la donnée à écrire (ex: 0xAB) sur le
L/E Données
bus de données;
Données • active le bus de contrôle en écriture.
Contrôle (L/E)
La mémoire:
• récupère la donnée (ex: 0xAB) sur le bus de données;
• l’écrit à l’adresse disponible sur le bus d’adresse (ex: 0x40).
Une banque de registres
• ALU ne communique pas directement avec la mémoire pour faire ses
calculs.
• elle est connectée à des registres dont l’accès peut se faire en un seul
cycle d’horloge.
• Deux catégorie des registres
o A usage générale : stockage des infos alimentant les calculs
o A usage spécifiques : dédiées a une fonctionnalités précise
Scrutation Vs interruption
• Scrutation (polling)
Coûteux en temps (multiplier par le nombre de périphérique à interroger)
Implémentation : Appel classique à une fonction dans le programme
• Interruption
Demande à l’initiative du périphérique
Prise en compte rapide de l’évènement
Implémentation : Interruption asynchrone d’un programme puis retour au
même endroit à la fin du traitement
Les interruptions/role de la pile
• La pile est une mémoire LIFO (Last In First Out) dans laquelle on stoke des
variable temporaire (donnée ou adresse). Le haut de la pile est pointé par le
registre SP (Stack Pointer).
Les interruptions/role de la pile
Elle va servir à :
• sauvegarder le contexte l’environnement (adresse du
programme et valeur des registres au moment de
l’interruption).
• restituer le contexte à la fin de l’interruption
Architectures des processeurs ARM
ARM Holding
ARM Holdings:
• développe des architectures de processeur et des jeux d’instructions
• ne construit aucun processeur comme intel La compagnie licencie la technologie à d’autres
qui l’implémentent à leur façon en hardware.
• clients: Apple, Nvidia, Samsung, Texas Instruments, etc…
Processeur ARM
• Supportent 32 et 64 bits
• L’architecture la plus utilisée au monde
• 10 milliards produits en 2013
• 98% de téléphones portables contiennent au moins 1 processeur ARM
ARM7xx
• ARM ne fabrique aucun composant, une société spécialisée au début des années 90 dans la
conception d’architectures de cœur de microcontrôleurs 32 bits et maintenant 64 bits.
• Elle vend ensuite sous licence ses produits à des fondeurs qui fabriquent alors les
microcontrôleurs en ajoutant de la mémoire, des unités périphériques diverses, le tout en
quantité variable pour donner naissance à des familles de produits
• Les cœurs 32 bits d’ARM sont basés sur une architecture dite de type Von nueman. Cela veut
dire qu’elle ne sépare pas physiquement les accès à la “mémoire code” (le stockage du
programme) des accès à la “mémoire données”
Qu’est ce qu’un ARM7TDMI?
Il s’agit en fait d’un « cœur » de processeur initialement conçu par la société britannique ACORN.
Un "cœur" signifie que ce processeur est vendu comme bloc à utiliser dans un circuit qui intègre
d'autre blocs pour constituer un système sur puce "SoC ".
• 3 étages de pipeline : Fetch, Decode, Execute
• Instructions sur 32 Bits
• 2 instructions d'accès à la mémoire LOAD et STORE
• T : support du mode "Thumb" (instructions sur 16 bits)
• D : extensions pour la mise au point
• M : Multiplieur 32x8 et instructions pour résultats sur 64 bits.
• I : émulateur embarqué ("Embedded ICE" )
Architecture des ARM (32 bits)
Dans le cours: ARM7TDMI (architecture 32 bits populaire)
• Registres de 32 bits
• Instructions de 32 bits
• Adresses de 32 bits
Architecture RISC pour laquelle tout passe par des registres.
Accès à combien de mémoire?
232 octets (4GB) de mémoire
Pipeline
• Début des années 1990
• Idée: séparer l’architecture en deux unités séparées, pouvant être exécutées
simultanément
• Comme dans un restaurant:
-“Fetch-decode”: les serveurs vont prendre les commandes des clients
aux tables
- “Execute”: les cuisiniers préparent les repas
Les étages Pipeline
Fetch Decode Execute
Fetch Decode Execute
Fetch Decode Execute
• Fetch : L’instruction est lue dans la mémoire.
• Décode : Décodage de l’instruction
• Execute : Lecture des registres, opérations ALU, décalage, écriture des résultats
vers les registres
La grande majorité des instructions prenant 1 cycle horloge (dans le cas où on ne travaille que
sur les registres).
Pipeline ARM
Adresse Instruction
execution 0x0 ADD R0,R1,R2
décodage 0x4 MOV R0,#0xf4
lecture 0x8 LDR R0,[R0]
Donc, PC contient l’adresse de l’instruction courante (exécutée) + 8!
Big vs Little Endian
comment stocker un mot de 32 bits (4 octets) à l’adresse 0x0? exemple:
0x12345678?
Little Endian
Ou
Big Endian
Les Registres
16 registres de 32 bits sont disponibles:
• R0 à R12: usage général
• R13 à R15: registres “spéciaux”
• Le “Current Program Status Register” (CPSR) est utilisé pour mémoriser les
résultats d’opération
Le registres spéciaux R13 à R15:
• R13: Pointeur de pile (Stack Pointer ou SP)
• R14: Registre de liens (Link Register ou LR)
• R15: Compteur de programme (Program Counter ou PC)
Le registre “Program Counter” R15
Le contenu du PC indique à quel endroit de la mémoire se trouve la prochaine
exécution que le processeur doit lire
• PC identifie des octets tandis que la mémoire est composée de mots de 4 octets
• Il y a 232 octets qui peuvent être adressés donc 232 /4 = 230 mots de 4 octets à
représenter avec le registre PC
C’est dire que les deux bits de poids le moins significatif du registre PC
ne servent pas
• 2 considérations importantes:
après chaque exécution, de combien doit-on incrémenter PC?
• PC = PC + 4
qu’est-ce que contient PC?
• PC = adresse de deux instructions plus loin que l’instruction
exécutée
• PC = adresse de l’instruction exécutée + 8
Piles ‘’stacks’’/Le “Stack Pointer” (R13)
• Structure de données “LIFO”
• Deux opérations principales:
• PUSH: rajoute un élément sur “le dessus” la pile
• POP: enlève un élément du “dessus” de la pile
• Par convention, on définit un bloc de mémoire qu’on nomme “pile” (stack)
• La pile est utilisée pour sauvegarder temporairement des valeurs de travail
• exemples: variables locales, paramètres et valeurs de retour des
fonctions
• Le Stack Pointer contient une adresse de la pile à laquelle on peut écrire ou lire
une valeur
Le Link Register (R14)
• Un appel de fonction à l’aide d’instructions dédiées entraîne un changement de la
valeur du Program Counter
• Un retour de fonction ne peut se faire que si PC reprend sa valeur d’avant l’appel
de la fonction
• Par convention, le Link Register est utilisé pour sauvegarder l’adresse de retour
pendant l’exécution de la fonction
• Mettre la valeur de LR dans PC commande un retour de fonction
• Utiliser LR à d’autres fins ne peut que causer des problèmes si on n’a pas le plein
contrôle du programme
Registre de statut (CPSR)
Un registre de statut décrit l’état du processeur
Unused
Sélection du mode
Dépassement (overflow) Thumb actif
Retenue (carry/borrow ) FIQ inactif
Valeur nulle (zero) IRQ inactif
Nombre négatif (negative )
Les modes du Microprocesseur
Un microprocesseur ARM a 7 modes opératoires de base :
o User : mode sans privilège où la plupart des tâches s’exécutent
o FIQ : on y entre lors d’une interruption de priorité haute (rapide)
o IRQ : on y entre lors d’une interruption de priorité basse (normale)
o Supervisor : on y entre à la réinitialisation et lors d’une interruption
logicielle (SWI “SoftWare Interrupt”)
o Abort : utilisé pour gérer les violations d’accès mémoire
o Undef : utilisé pour gérer les instructions non définies (“undefined”)
o System : mode avec privilège utilisant les mêmes registres que le mode
User
Introduction à l’assembleur ARM
De quoi une instruction est-elle constituée?
• “Opcode” (ou code d’opération): code identifiant quelle instruction est
effectuée (MOV, LDR, etc.)
• Paramètres: un ou plusieurs, dépendent de l’opcode.
L’assembleur nous permet de donner un nom à des adresses mémoires: ce sont les
constantes et les variables!
• constante = ne change pas
• variable = peut changer
Déclaration d’une constante ARM
• Déclarer une constante (réserve de l’espace en ROM)
Nom DCss valeur
o “nom” est le nom de la constante
o “DCss": C=constante, ss indique la taille. Par exemple:
• DC8: constante de 8 bits
• DC32: constante de 32 bits
o “valeur”: la valeur de la constante
o Exemple
a DC32 0xAB
b DC32 0xF2
Déclaration d’une variable ARM
• Déclarer une constante (réserve de l’espace en RAM)
Nom DSss valeur
o “nom” est le nom de la constante
o “DSss": S=variable, ss indique la taille. Par exemple:
• DS8: constante de 8 bits
• DS32: constante de 32 bits
o “valeur”: la valeur de la constante
o Exemple
a DS32 1
Tableaux (constants et variables)
• Déclarer un tableau :
nom DCss el1 el2 el3 ... ; Constante
nom DSss nombreElements ; Variable
o “nom” est le nom de la variable/constante
o “D*ss”: ss indique la taille
o “el1 el2 el3”: la valeur des éléments du tableau s’il s’agit d’une
constante
o “nombreElements”: le nombre d’éléments dans le tableau s’il s’agit
d’une variable
o Exemple
a DS32 3 ; tableau de 3 mots de 32 bits chacun
b DC8 0x01 0x02 0x03 ; tableau de 3 octets
Tableaux (constants et variables)
• Les tableaux peuvent être vus comme des chaînes de variables.
• Une chaîne texte est un exemple de tableau d'octets, chaque caractère est
présenté comme un élément de code ASCII (0 à 255).
• Exemple :
strA DC8 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x00
strB DC8 'Hello', 0
• strA est la copie exacte de strB. Lorsque le compilateur voit une chaîne entourée
par des ' ', il la convertit automatiquement en un ensemble d'octets.
6 types d’instructions en ARM
• Déplacement de données: Transfert de données ou de constante impliquant des registres seulement.
• Accès à la mémoire: l’instruction, un load ou store, lit ou écrit la mémoire. La valeur lue est mise dans un
registre. La valeur écrite provient d’un registre.
• Opération arithmétique: addition, soustraction, multiplication, division et plus. Les calculs s’effectuent
sur des registres et peuvent changer les drapeaux de l’unité d’arithmétique et de logique (ALU).
• Opération logique: ET, OU, NON-OU, OU EXCLUSIF et plus. Les calculs s’effectuent sur des registres et
peuvent changer les drapeaux de l’unité d’arithmétique et de logique (ALU).
• Gestion de la séquence d’instructions: saut et branchements. Peuvent être conditionnels ou
inconditionnels, à des adresses directes ou indirectes. Comprend les appels de fonctions.
• Contrôle du système: Comprend toutes les autres instructions contrôlant le microprocesseur. Permet de
gérer le temps, le format des instructions, l’exécution en pipeline, les interruptions et plus.
Déplacement de Données: MOV
L’instruction
MOV Rn Op1
met l’opérande de type 1 Op1 dans le registre Rn
o Opérande de type 1:
• Constante (valeur immédiate): toujours précédée du symbole #
• Registre
• Registre décalé
• Le décalage est fait avant l’opération. Cinq opérations sont possibles:
LSL, LSR, ASR, ROR et RRX. Ces opérations sont détaillées par la suite.
Exemple :
MOV R0, #1234 ; R0 = 1234
MOV R0, R1 ; R0 = R1
MOV R0, R1, ASR #2 ; R0 = R1 / 4
Accès Mémoire: Load/Store
Les accès à la mémoire se font avec deux instructions:
• LDR (LoaD Register) lit la mémoire et met la valeur lue dans un registre.
• STR (STore Register) met la valeur d’un registre dans la mémoire.
Ces instructions ont le format
LDR Rd, Op2
STR Rs, Op2
• Rd et Rs décrivent le registre de destination ou de source
• Op2 est une opérande de type 2
Load/Store Multiple
• Les instructions LDM (LoaD Multiple) et STM (Store Multiple) permettent de lire
des mots de mémoire contigus et de mettre les valeurs lues dans plusieurs registres.
Une seule instruction LDM peut remplacer plusieurs instructions LDR si les adresses
visées se suivent.
• Les instructions LDM et STM sont utilisées pour lire/écrire des données de
tableaux ou pour sauvegarder/récupérer de l’information sur la pile
• Syntaxe: mm = DB (Decrement Before), ou IA (Increment After)
LDMmm Ra{!}, {Liste de registres}
• Exemple:
STMDB SP!, {R0, R1} ; R0 = Mem[SP-4], R1 = Mem[SP-8], SP = SP-8
LDMIA SP!, {R0, R1} ; R0 = Mem[SP], R1 = Mem[SP+4], SP = SP+8
Tableaux (constants et variables)
• Déclarer un tableau :
nom DCss el1 el2 el3 ... ; Constante
nom DSss nombreElements ; Variable
o “nom” est le nom de la variable/constante
o “D*ss”: ss indique la taille
o “el1 el2 el3”: la valeur des éléments du tableau s’il s’agit d’une
constante
o “nombreElements”: le nombre d’éléments dans le tableau s’il s’agit
d’une variable
o Exemple
a DS32 3 ; tableau de 3 mots de 32 bits chacun
b DC8 0x01 0x02 0x03 ; tableau de 3 octets
Décalage de bits
• LSL, Logical Shift Left, décale les bits vers la gauche et met des zéros à droite.
Décaler un bit vers la gauche équivaut à multiplier par 2. Carry devient égal au bit le
plus significatif.
• LSR, Logical Shift Right, décale les bits vers la droite et met des 0 à gauche. Décaler
un bit vers la droite équivaut à diviser un nombre non-signé par 2. Carry devient égal
au bit le moins significatif.
Carry Valeur sur 8 bits
Initial C b7 b6 b5 b4 b3 b2 b1 b0
Initial*2 b7 b6 b5 b4 b3 b2 b1 b0 0 LSL#1 LSR#1
Initial/2 b0 0 b7 b6 b5 b4 b3 b2 b1
Décalage de bits
• ASR, Arithmetical Shift Right, décale les bits vers la droite et copie le bit le plus
significatif à gauche. Décaler un bit vers la droite en conservant le bit de signe
équivaut à diviser un nombre signé par 2. Carry devient égal au bit le moins
significatif.
• LSR, Logical Shift Right, décale les bits vers la droite et met des 0 à gauche. Décaler
un bit vers la droite équivaut à diviser un nombre non-signé par 2. Carry devient égal
au bit le moins significatif.
Carry Valeur sur 8 bits
Initial C b7 b6 b5 b4 b3 b2 b1 b0
Initial b70 b7 b7 b6 b5 b4 b3 b2 b1 ASR#1 ROR#1 ou
signe /2
RXR
Initial
with c b0 C b7 b6 b5 b4 b3 b2 b1
Instructions arithmétiques et logiques
• Les opérations mathématiques et logiques ont la forme
INSTRUCTION Rd, Rs, Op1
Où
• Rd est le registre de destination
• Rs est un registre source
• Op1 est une opérande de type 1
Le format de l’instruction ADD, par exemple, est:
ADD Rd, Rs, Op1 ; Rd = Rs + Op1
ADD R0, R0, #1 ; R0 = R0 + 1
ADD R0, R0, R1 ; R0 = R0 + R1
ADD R0, R0, R1, LSL #1 ; R0 = R0 + (R1 * 2)
Instructions arithmétiques et logiques
• Soustraction
SUB R0, R0, #1 ; R0 = R0 - 1
SUB R0, R0, R1 ; R0 = R0 - R1
• Décalage
LSL R0, R0, #1 ; R0 = R0 * 2
ASR R0, R0, #2 ; R0 = R0 / 4 (préserve le signe)
• “Et” logique
AND R0, R0, #1 ; R0 = R0 ET 1
AND R0, R0, R1 ; R0 = R0 ET R1
• Prendre le négatif
RSB R0, R0, #0 ; R0 = 0 - R0, donc R0 = -R0
Instructions avec drapeaux
• Les instructions arithmétiques et logiques changent les drapeaux de l’ALU, lorsque l’option “S” est
rajoutée après le nom de l’instruction
INSTRUCTIONS Rd, Rs, Op1 ; exécute l’instruction,
; et met à jour les drapeaux
• Exemple:
SUBS R0, R1, R2 ; R0 = R1 - R2
; et met à jour les drapeaux
Instructions conditionnelles
• L’instruction
MOVcc Rn Op1
met l’opérande de type 1 Op1 dans le registre Rn, si la condition cc est vraie
• Exemple:
MOVEQ R3, R1 ; R3 = R1 seulement si le drapeau Z est 1
ADDNE R2, R2, R1 ; R2 = R2 + R1 seulement si le drapeau Z est 0
Équivalent, en C, à:
if (Z == 1) { R3 = R1; }
if (Z == 0) { R2 = R2 + R1; }
Codes condition
Toutes les instructions sont codées sur 32 bits dont les 4 bits de poids fort définissent les 16
conditions d’exécution possibles :
Valeur Absolue
R0 = abs(R1 - R2) ; valeur absolue
Pour ce faire:
• R0 = R1 - R2 si R1 > R2
• R0 = R2 - R1 sinon
Solution (à 3 instructions):
CMP R1, R2 ; calcule R1 - R2, change les drapeaux
SUBGT R0, R1, R2 ; si R1 > R2, R0 = R1 - R2
SUBLE R0, R2, R1 ; si R1 <= R2, R0 = R2 - R1
Solution (à 2 instructions):
SUBS R0, R1, R2 ; calcule R1 - R2, change les drapeaux
RSBLE R0, R0, #0 ; si R1 <= R2, R0 = -R0 (donc R0 = R2 - R1) Reverse subtract
Séquence d’exécution et branchements/Sauts Absolus
• PC est un registre et peut être modifié comme les autres registres,
avec la plupart des instructions
• Modifier la valeur de PC correspond à effectuer un saut absolu à une
adresse.
Sauts Relatifs
• Dans plusieurs cas, on ne veut pas exécuter l’instruction à l’adresse X,
mais exécuter l’instruction qui se trouve à N octets de l’instruction
courante: on veut « déplacer » PC par rapport à sa valeur actuelle
• L’instruction B (Branch) modifie PC relativement à sa valeur actuelle:
B Offset
Branchements conditionnels: if
• Exemple en C
if (MaVar == 4)
{
// exécute une tâche…
}
// le programme continue…
• En Assembleur
LDR R0, MaVar ; Met la valeur de MaVar dans R0
CMP R0, 4 ; Change les drapeaux comme R0-4
BNE PasEgal
; execute une tâche…
PasEgal
; le programme continue…
Branchements conditionnels : if/else
• Exemple en C
if (MaVar == 4) {
// exécute une tâche…
}
else {
// exécute une autre tâche…
}
// le programme continue…
• En Assembleur
LDR R0, MaVar ; Met la valeur de MaVar dans R0
CMP R0, 4 ; Change les drapeaux comme R0-4
BNE PasEgal
; execute une tâche…
B Continue
PasEgal
; exécute une autre tâche…
Continue ; le programme continue...
Boucles
• En assembleur, le début de toutes les boucles est identifié par une étiquette
qui permet de revenir au début de la boucle
for (int i = 0; i < 5; ++i) {
// tâche à l’intérieur de la boucle
}
// le programme continue…
• En Assembleur
InitDeBoucle
MOV R4,#5
DebutDeBoucle
; tâche à l’intérieur de la boucle
SUBS R4, R4, #1 ; R4 = R4 - 1, change les drapeaux
BNE DebutDeBoucle ; Condition d’arrêt
; le programme continue…
Appel de Fonction et Adresse de Retour
• Appeler une fonction signifie mettre PC au début de la fonction pour exécuter les instructions
constituant la fonction.
• Retourner d’une fonction signifie reprendre l’exécution d’où l’appel s’est fait. Il faut revenir à
l’endroit où nous étions: c’est l’adresse de retour.
• Une fonction est un ensemble d’instructions à une adresse donnée. Cette adresse est identifiée par
une étiquette
• Pour pouvoir revenir à plus d’un endroit, il faut sauvegarder l’adresse de retour avant de faire le
branchement.
• Instruction BL (Branch and Link):
BL Adresse ; met l’adresse de retour dans LR
Appel de Fonction et Adresse de Retour
• Après l’exécution de la fonction, on place PC = LR pour continuer l’exécution après l’endroit où la
fonction a été appelée,
•avec l’instruction BX (Branch and eXchange):
BX Rm ; PC = Rm (Rm peut être n’importe quel registre
La pile
• Le registre SP (Stack Pointer) devrait indiquer le dessus de la pile en tout temps.
• PUSH
PUSH {Rs} ; Place le contenu de Rs sur la pile, SP = SP - 4
PUSH {R0, R1, R2} ; Place le contenu de R0, R1, et R2 sur la pile,
; SP = SP - 12
Permet de mettre une (ou plusieurs) donnée(s) sur la pile.
• POP
POP {Rd} ; Place le contenu sur la pile dans Rd, SP = SP + 4
POP {R0, R1, R2} ; Place le contenu sur la pile dans R2, R1, et R0
; (dans l’ordre), SP = SP + 12
Permet de récupérer une (ou plusieurs) donnée(s) de la pile.
Appel de fonctions — conventions
Paramètres:
• On se sert de R0 à R3 lorsqu’il y en a 4 ou moins
• S’il y en a plus?
• On utilise la pile… et/ou la mémoire
Valeur de retour:
• On se sert de R0 lorsqu’il y en a 1 ou moins
• S’il y en a plus?
• On utilise la pile… et/ou la mémoire
Appel de fonction: 1 paramètre et 1 retour
• On place la valeur du paramètre dans R0 juste avant l’appel
• L’instruction BL commande un branchement
• R0 contient la valeur de retour une fois la fonction exécutée
En C
Retour = FonctionAUnParametre(0x12);
En Assembleur
MOV R0, #0x12 ; R0 contient le paramètre de la fonction
BL FonctionAUnParametre ; Appel de la fonction
MOV R3, R0 ; Récupère le résultat de la fonction
Exemple
En C
int FonctionAUnParametre (int param)
{
return param + 1;
}
En Assembleur
FonctionAUnParametre
ADD R0, R0, #1 ; R0 contient le paramètre de la fonction
BX LR ; R0 contient le résultat de la fonction
Les interruptions
Bref retour sur l’appel de fonctions
• Une interruption interrompt l’exécution des instructions par le
microprocesseur.
• Lors d’une interruption:
• l’exécution du programme principal est suspendue;
• une sous-routine traitant l’interruption est exécutée;
• puis le programme principal est continué.
• Différence entre interruptions et un branchement ou un appel de
fonction?
• les interruptions peuvent survenir n’importe quand pendant
l’exécution.
Les interruptions
Les interruptions
1. Terminer l’instruction en cours
2. Déterminer s’il faut traiter l’interruption.
3. Sauvegarder le contexte
4. Déterminer l’adresse de la routine de traitement de l’interruption
5. Exécuter cette routine
Traitement de l’interruption
1. Restaurer le contexte
2. Reprendre là ou le processeur était rendu
Types d’interruptions
• Système: reset, faute matérielle générale, etc.
• Exception: erreur au cours de l’exécution des instructions, par exemple:
• instruction invalide
• division par 0
• tentative d’accès à de la mémoire protégée
• Matérielles: générées par les périphériques, par exemple:
• le clavier
• l’imprimante etc.
• Logicielles: générées par le programmeur avec une instruction spéciale (présente dans
tous les jeux d’instructions)
Les interruptions ARM
Il y a 7 types d’interruptions dans le microprocesseur ARM:
1. Reset: redémarrage du microprocesseur
2. Interruption logicielle: activée par l’instruction SVC pour utiliser les fonctions
systèmes (par exemple pour communiquer avec les périphériques);
3. Data abort: accès mémoire invalide lors d’un LDR;
4. Prefetch abort: accès mémoire invalide lors de la lecture d’une instruction
(étape « lecture » dans le pipeline)
5. Instruction indéfinie: erreur dans le décodage d’une instruction
6. IRQ: activée par un périphérique (Interrupt ReQuest)
7. FIQ: activée par un périphérique, mais qui peut être traité plus rapidement
qu’une IRQ (Fast Interrupt reQuest)
Priorité
• Les interruptions ont des priorités: une interruption de haute priorité
peut interrompre une interruption ayant un niveau de priorité plus
bas.
• Certaines interruptions peuvent survenir n’importe quand, même
pendant une autre interruption.
• Certaines interruptions, comme «reset», ont une priorité (maximale
pour «reset») qui ne peut pas être changée.
Priorité
Priorité Interruption
Plus haute Reset
« Data abort »
FIQ
IRQ
« Prefetch abort »
Plus basse Interruption logicielle et instruction
indéfinie
Routines de traitement d’interruptions
• Les routines de traitement d’interruptions sont des fonctions « spéciales »
que l’on appelle que pour traiter les interruptions
• Où sont-elles situées?
• en mémoire!
• Comment fait-on pour savoir:
• quelle routine exécuter pour quelle interruption?
• à quelle adresse est cette routine?
• Grâce à la table des vecteurs d’interruption,
Table des vecteurs d’interruption
• Chaque entrée de la table contient une instruction qui « branche » vers la routine
correspondante
Adresse Interruption Signification
0x00 Reset redémarrage
0x04 Instruction indéfinie problème lors du décodage
0x08 Interruption logicielle demandée par le programmeur:
instruction SVC
0x0C « Prefetch abort » « fetch » invalide
0x10 « Data abort » accès mémoire invalide
0x14 Espace réservé ne rien mettre ici
0x18 IRQ « Interrupt ReQuest »:
interruption matérielle générale
0x1C FIQ « Fast Interrupt reQuest »:
interruption matérielle rapide
Registre de statut (CPSR)
registre d’état, le Current Program Status Register (CPSR)
• mémorise les résultats d’opérations arithmétiques
• stocke le « mode d’exécution »
Unused
Sélection du mode
Dépassement (overflow) Thumb actif
Retenue (carry/borrow ) FIQ inactif
Valeur nulle (zero) IRQ inactif
Nombre négatif (negative )