Académique Documents
Professionnel Documents
Culture Documents
1ère Partie
ARM et Cortex
• Processeurs embarqués
• Evolution des Processeurs ARM
• ARM7TDMI : Architecture et langage d’assembleur
• Le Cœur Cortex M3
3. Les Microcontrôleurs
• Introduction aux Microcontrôleurs
• Concepts généraux
• Les Microcontrôleurs STM32
- La famille STM32
2ème Partie
- Entrées Sorties GPIO du STM32
- ST Firmware Library : Présentation et application à la programmation
du GPIO
- Gestion des interruptions par le NVIC
- Le Convertisseur Analogique-Numérique
- Le DMA : Direct Memory Access
- Les Timers
- L’USART
2
Références bibliographiques
• David Patterson et John Hennessy « Computer Architecture, A Quantitative Approach »
4ème édition – Morgan Kaufman
• William Stallings « Computer Organization and Architecture » - 5ème édition – Prentice-Hall
• Cours : Introduction aux architectures des microprocesseurs (ELEC223) - TELECOM – Paris-Tech
• Cours : Architecture des Ordinateurs (INF559) - Olivier TEMAN - Ecole Polytechnique –ParisTech
2012
• Jacques Jorda « Processeurs ARM : Architecture et langage d’assemblage »
Edition : DUNOD
• Joseph Yiu « The Definitive Guide to the ARM CORTEX – M3 »
Amazone.fr
• Daniel W. Lewis « Fundamentals of Embedded Software with the ARM Cortex-M3 »
Amazon.fr
• Michael Keating & Pierre Bricaud « Reuse Methodology Manual for System-On-a-Chips Designs »
Kluwer academic publishers
3
Chapitre 1: Introduction aux systèmes
embarqués et systèmes sur puce
4
Introduction aux Systèmes Embarqués et Systèmes sur puce
5
Introduction aux Systèmes Embarqués et Systèmes sur puce
6
Introduction aux Systèmes Embarqués et Systèmes sur puce
7
Introduction aux Systèmes Embarqués et Systèmes sur puce
20 20
AAGR%
15 15
$ Billions
10 10
5
5
0 0
Industrial/Milit.
Medical/Office
automotive
Telecomm
Consumer
2004
2009
AAGR%
AAGR = taux de croissance annuel moyen 8
Introduction aux Systèmes Embarqués et Systèmes sur puce
■ Définition – SoC
Un System on Chip, abrégé en SoC (« système sur
puce » ou « système mono-puce » en français), est
un système complet embarqué sur une puce,
pouvant comprendre de la mémoire, un ou plusieurs
microprocesseurs, des périphériques d'interface, ou
tout autre composant nécessaire à la réalisation de la
fonction attendue.
9
Introduction aux Systèmes Embarqués et Systèmes sur puce
10
Introduction aux Systèmes Embarqués et Systèmes sur puce
11
Introduction aux Systèmes Embarqués et Systèmes sur puce
OMAP 1510
12
Introduction aux Systèmes Embarqués et Systèmes sur puce
Omap
13
Introduction aux Systèmes Embarqués et Systèmes sur puce
■ Conception de SoC
14
Introduction aux Systèmes Embarqués et Systèmes sur puce
15
Introduction aux Systèmes Embarqués et Systèmes sur puce
■ Principes de conception
• 70-80 : full-custom
– Schéma
– Dessin des masques
– Simulation electronique
• 80-90 : Précaractérisé FPGA
– Réutilisation de briques élémentaires
– Modélisation, simulation
• 00-xx : SoC
– Réutlisation du matériel et logiciel
– Co-design, vérification
16
Introduction aux Systèmes Embarqués et Systèmes sur puce
■ Principes de conception
• Une architecture matérielle
– Blocs standards (CPU, mem)
– Blocs spécifiques
– Bus de communication
• Des ressources logicielles
• SoC = cohabitation de ces ressources sur un même
chip, prise en compte globale pour la réalisation
hard/soft
17
Introduction aux Systèmes Embarqués et Systèmes sur puce
■ Utilisation d’IP
• Bloc réutilisable (IP)
– connaître les fonctionnalités
– estimer les performances dans un système
– être sûr du bon fonctionnement de l’IP
– intégrer cet IP dans le système
– valider le système
20
Introduction aux Systèmes Embarqués et Systèmes sur puce
21
Introduction aux Systèmes Embarqués et Systèmes sur puce
22
Chapitre 3 : Architecture
des Processeurs ARM et Cortex
1. Introduction aux Processeurs embarqués
2. Evolution des architectures des cœurs
ARM
3. Processeur ARM7TDMI : Architecture et
langage assembleur
4. Architecture Cortex-M3
23
Introduction aux Processeurs Embarqués
• Un microcontrôleur ou MCU (Microcontroller Circuit Unit) est un système
informatique entier : (CPU ou Central Processing Unit, mémoire, bus
contrôleur d’interruption, interfaces parallèles et séries, Timers,
Convertisseurs A/N et N/A) contenu intégralement dans un circuit intégré
unique
26
Chapitre 2 : Architecture
des Processeurs ARM et Cortex
1. Introduction aux Processeurs embarqués
2. Evolution des architectures des cœurs ARM
Extensions technologiques des cœurs ARM : Jazelle,
Thumb, Thumb2, ThumbEE, VFP, NEON, TrustZone
Versions et implémentation des Cœurs ARM
Performances des cœurs ARMFamille Cortex
3. Processeur ARM7TDMI : Architecture et
langage assembleur
4. Architecture Cortex-M3
27
Evolution des architectures ARM
• La société ARM a été créée en 1990 par association de Apple
Computer, Acorn Computer Group et VLSI Technology.
Contrairement aux autres sociétés travaillant dans le domaine
des semi-conducteurs, ARM ne fabrique pas de processeurs et
les vend directement, mais elle les conçoit et vend directement
leur licence sous forme d’IP à des partenaires qui les intègrent
dans leur microcontrôleurs et processeurs
• Aujourd’hui, les partenaires d’ARM vendent annuellement plus
que 2 billions de circuits à base de cœurs ARM dont
l’architecture et le jeu d’instructions ont évolué depuis la
première version ARM-v1 jusqu’à la version ARM-v7, appelée
également Cortex
28
Evolution des architectures ARM
29
Evolution des architectures ARM
30
Evolution des architectures ARM
31
Evolution des architectures ARM
32
Evolution des architectures ARM
Extensions technologiques des cœurs ARM
Jazelle
Jazelle DBX (Direct Bytecode eXecution) est une
technique permettant d’exécuter directement du
Bytecode Java dans les architectures ARM comme un
troisième état d’exécution (et jeu d’exécution), en
parallèle à l’ARM existant et au mode Thumb. Le
support de cet état est signalé par le « J » de
l’architecture ARMv5TEJ
33
Evolution des architectures ARM
Extensions technologiques des cœurs ARM
Thumb
Thumb est un jeu d’instruction 16 bits qui fournit un sous-
ensemble des instructions ARM 32 bits classique et permet un
gain de mémoire important.
Dans le mode Thumb, les instructions 16 bits offrent moins de
possibilités. Seuls les branchements peuvent, par exemple, être
conditionnels et plusieurs instructions sont limitées à l’accès
d’une partie réduite des registre généraux. Ces possibilités
réduites améliorent la densité globale d’un programme bien
que certaines opération nécessitent plus d’instructions
réduction du temps de chargement du code en mémoire et
augmente la probabilité de rester dans le cache d’instruction
augmentation des performances
34
Evolution des architectures ARM
Extensions technologiques des cœurs ARM
Thumb-2
La technologie Thumb-2 étend le jeu d’instructions limité 16 bits
de Thumb par des instructions 32 bits additionnelles afin de
donner plus de largesse au jeu d’instruction. Il en résulte un jeu
d’instructions de largeur variable.
Thumb-2 est :
25% plus performant que le Thumb-1
26% plus dense que le code ARM standard 35
Evolution des architectures ARM
Extensions technologiques des cœurs ARM
Floating-point (VFP)
La technologie VFP (Vector Floatting Point : virgule flottante
vectoriel) est une extension de coprocesseur de type FPU dans les
architectures ARM. Il fournit le calcul des formats de virgule flottante
simple et double précision à bas prix et de virgule flottante en
double précision remplissant la norme ANSI/IEEE std 754-1985.
37
Evolution des architectures ARM
Extensions technologiques des cœurs ARM
38
Evolution des architectures ARM
Extensions technologiques des cœurs ARM
39
Evolution des architectures ARM
Caractéristiques fondamentales des cœurs ARM
• Les processeurs de la famille ARM sont tous conçus autour d’un cœur de
processeur standard de type RISC. Ce cœur de processeur a été conçu de
manière à obtenir des implémentation matérielles simples et efficaces,
autorisant ainsi des performances importantes avec de faibles consommations
électriques.
• Les processeurs ARM étant des processeurs RISC, ils sont donc caractérisés
par :
– Une taille fixe des instructions (32 bits)
– Une banque de registres (32 bits) à usages généraux,
– Un décodage des instructions câblé
– Une exécution pipelinée (trois étages pour les ARM7, cinq pour les ARM9, six pour les
ARM10 et huit pour les ARM11)
– Un objectif d’exécution d’un cycle par instruction (CPI = 1)
• Le standard ne définissant que la structure et le jeu d’instructions du cœur de
processeur, chaque industriel est susceptible de compléter son processeur
avec des modules matériels spécifiques, fonctions de la destination finale du
processeur. 40
Evolution des architectures ARM
Versions et implémentation des cœurs ARM
• A chaque version du cœur de processeur correspond une ou plusieurs
implémentations physiques. On dénombre aujourd’hui huit versions
différentes du cœur.
• Version 1 : cette version du cœur correspond au processeur ARM1
• Version 2 : la version 2 du cœur a été implémentée par le processeur ARM2.
l’ARM2 possède 27 registres (dont 16 accessibles simultanément) et quatre
modes de fonctionnement différents :
– USR (USeR mode) : mode utilisateur. Certaines ressources sont inaccessibles (il
s’agit du seul mode de fonctionnement non privilégié)
– IRQ (Interrupt ReQuest mode) : mode interruption. Il devient actif à l’activation
de l’entrée IRQ du processeur
– FIQ (Fast Interrupt reQuest mode) : mode interruption rapide. Ce mode est actif
lors de la réception d’un signal FIQ du processeur.
– SVC (Supervisor mode) : mode superviseur. C’est un mode protégé, utilisé pour
l’exécution du système d’exploitation.
Dans cette version, les 6 bits de fort poids du PC sont utilisés pour stocker
l’état du processeur; en conséquence, l’adressage est limité à 26 bits.
41
Evolution des architectures ARM
Versions et implémentation des cœurs ARM
• Version 3 : Dans cette version, la limitation de l’espace d’adressage à 64 Mo
est supprimée avec un véritable adressage sur 32 bits et un nouvel ensemble
de registres est ajouté pour maintenir les informations concernant l’état du
processeur :
– CSPR Current Processor Status Register
– SPSR : Stacked Processor Statut Register
Par ailleurs, deux nouveau modes de fonctionnement sont ajoutés :
– Abort : signalé par le gestionnaire de mémoire, utilisé pour implémenter des
mécanismes de mémoire virtuelle et/ou de protection mémoire.
– Undefined : utilisé pour l’émulation logicielle de coprocesseur.
Cette version du cœur a été mise en œuvre dans les processeurs ARM6,
ARM7 et Amulet1.
l’ARM7 est fonctionnellement identique à l’ARM6, mais fonctionne à des
fréquences plus élevées (>40 MHz), et dispose de quelques améliorations :
cache de 8Ko modifié pour diminuer la consommation, gestion mémoire plus
performant; 42
Evolution des architectures ARM
Versions et implémentation des cœurs ARM
• Version 4 : Cette version reprend les caractéristiques de la version 3 en y
incluant des instructions de lecture/écriture sur 16 bits. Par ailleurs, certaines
instructions optionnelles sur le cœurs de la version 3 (opérations de
multiplication étendues, spécialisées pour le traitement de signal) sont intégrés à
l’architecture. Le pipeline d’exécution comprend cinq étages. Enfin, un nouveau
mode de fonctionnement fait son apparition : le mode system, identique au mode
supervision sans utilisation de copies privées des registres.
Ce cœur a été implémenté dans les processeurs ARM8, ARM9 et Strong ARM.
– L’ARM8 reprend les caractéristiques de l’ARM7, hormis la longueur du pipeline
d’exécution, la présence d’une unité d’exécution spéculative, la mise en place d’une
politique d’écriture retardée pour le cache et l’implémentation d’une instruction de
multiplication sur 64bits. Ce processeur peut délivrer une performance de 80 MIPS à
80 MHz.
– Le StrongARM est une version à cache Havard (caches instructions et données
séparés alimentés par des bus séparés). Performance : fréquence comprise entre 100
et 200 MHz pouvant atteindre 230MIPS
– L’ARM9 est une version évolué de l’ARM8 à architecture Havard. 43
Evolution des architectures ARM
Versions et implémentation des cœurs ARM
• Version 5 : Cette version reprend les caractéristiques de la version 4 en ajoutant
plusieurs instructions (comptage de zéro, point d’arrêt logiciel, …). Il intègre de
surcroit des unités d’exécutions multiples, et l’unité de lecture/ écriture devient
parallèle. Le pipeline comprend six étages (sept dans la version intelXScale).
Elle est implémentée par la génération ARM10 et intel Xscale.
– Les processeurs ARM10 intègrent jusqu’à 2x32 Ko de cache, et le gestionnaire de
mémoire est totalement compatible avec les systèmes d’exploitations embarqués les
plus répandus (Windows CE, Linux). Il peut atteindre la performance de 400 MIPS à
la fréquence 325MHz
– Les processeurs Intel Xscale intègrent des extensions telles que la gestion des
communications sans fils, des périphériques divers. Performances : 624 MHz
• Cortex-A
Destiné pour faire tourner des applications complexes telles que les
systèmes d’exploitation embarqués (symbian, Linux, Windows CE)
nécessitant une puissance de traitement élevée et un système de
gestion de mémoire virtuelle (MMU).
Les processeurs appartenant à ce profil peuvent fonctionner avec des
fréquences de 2GHz et avec une performance de 2,5DMIPS/MHz1 et
contiennent des architectures SIMD ainsi que des technologie Jazelle.
On les trouve dans des produits tels que les télévisions numériques
haute définition, les terminaux mobiles, …
• Cortex-R
Destiné principalement aux applications temps réel à contraintes
très sévères et exigeant une haute fiabilité et un temps de réponse
faible.
47
Evolution des architectures ARM
ARM v7 : La famille Cortex
• Cortex-M
Optimisé pour les applications nécessitant une basse consommation
d’énergie, un coût réduit et un comportement déterministe pour le
traitement des interruptions.
C’est le profil qui est destiné à être intégré dans les
microcontrôleurs.
Principalement le cœur Cortex-M3, lancé en 2004, et qui grâce à son
coût et sa performance a connu un grand succès et a fait converger la
majorité des constructeurs de microcontrôleurs, pour la première
fois, vers une architecture commune.
Déjà 28 sociétés (dont 6 font partie du top 10) ont opté pour ce cœur
(Texas Instruments, ST-Microelectronics, NXP, Atmel, Zilog,
samsung, etc…)
48
Evolution des architectures ARM
ARM v7 : La famille Cortex
50
Evolution des architectures ARM
Performances des architectures ARM
51
Evolution des architectures ARM
Divers Processeur ARM
52
Chapitre 2 : Architecture
des Processeurs ARM et Cortex
1. Evolution des Processeurs embarqués
2. Evolution des architectures des cœurs ARM
3. Processeur ARM7TDMI : Architecture et langage
assembleur
Architecture interne du processeur ARM7TDMI
Codage et exécution d’instructions
Les modes opératoires de l’ARM7TDMI
Organisation de la mémoire et des entrées/sorties
Les registres
Les exceptions et les interruptions
Le jeu d’instructions standards de l’ARM7TDMI
4. Architecture Cortex-M3
53
Vue d’une puce utilisant un
ARM7
54
Bus d’adresses A[31..0]
Architecture interne : cœur processeur ARM7
BUS d’incrémentation
Registre d’adresse
Incrémenteur
d’adresse
Logique de contrôle BIGEND
CPSR MCLK
Banque de Registres nWAIT
R0 R4 nRW
N Z C V Q … I F T M4M3M2M1M0
BUS UAL
R1 R5 SP MAS[1:0]
Datapath
R2 LR
ISYNC
R3 PC nIRQ
nFIQ
nRESET
ABORT
Multiplieur nTRANS
32x8 Décodage d’instruction
BUS A
nMREQ
BUS B
SEQ
Barrel LOCK
nM[4:0]
shifter
nOPC
Unité Arithmétique nCPI
CPA
et logique 32 bits CPB
55
Vue simplifiée du cœur
ARM7TDMI
L'architecture de l'ARM7TDMI est de type Von
Neuman donc il n'y a qu'un bus pour véhiculer
les instructions et les données.
L'ARM dispose de 16 registres visibles sur
lesquels les opérations sont effectuées.
Les instructions LOAD/STORE servent
respectivement à charger/enregistrer les
données de/vers la mémoire.
56
Vue simplifiée du cœur
ARM7TDMI
57
Vue simplifiée du cœur
ARM7TDMI
Exemple
L'exécution de l'instruction ADD r0,r1,r2 consiste à
mettre r1 et r2 sur A et B, effectuer l'addition dans
l'UAL et écrire le résultat dans r0.
(r0) := (r1) + (r2)
59
Le Pipeline d’instructions
La famille ARM7 utilise un pipeline à 3 étages pour augmenter la
vitesse du flot d’instructions dans le microprocesseur.
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Code condition Code opération Décalage par rapport à l’adresse courante, codé sur 24 bits
63
Exécution d’instructions
■ Exemple de programme simple
Considérons le programme suivant qui réalise une addition de
deux valeurs situées en mémoire. Le mot mémoire situé à
l’adresse contenue dans R0 est additionné au mot mémoire
situé à l’adresse contenue dans R2, et le résultat est rangé en
mémoire à l’adresse contenue dans R4.
LDR R1, [R0] @ récupération du premier mot
LDR R3, [R2] @ et du second mot
ADD R5, R3, R1 @ addition des valeurs
STR R5, [R4] @ et rangement du résultat
64
Exemple d’exécution d’un programme
■ Codage du programme
Le code hexadécimal correspondant à ces instructions est le suivant :
LDR R1, [R0] → E5901000
LDR R3, [R2] → E5923000
ADD R5, R3, R1 → E0835001
STR R5, [R4] → E5845000
■ Exécution du programme
Considérons que le programme est implanté en mémoire à l’adresse 0x2000,
et que le PC est chargé avec cette adresse. Supposons aussi que :
– R0 contient 0x3000, R2 contient 0x3004 et R4 contient 0x300C
– Le mot mémoire à l’adresse 0x3000 est 10, et le mot mémoire à l’adresse
0x3004 est 2
65
0x2000
Bus d’adresses A[31..0] Mémoire
RA. : 0x2000
BUS d’incrémentation
1er Cycle d’exécution
R1 R5 SP
R2 LR
R3 PC 0x2004
0x2018 0x…(inst. Z)
0x2014 0x…(Inst. Y)
Multiplieur 0x2010 0x…(Inst.x)
Décodage d’instruction
32x8 0x200C 0xE5845000
0x2008 0xE0835001
BUS A
Unité Arithmétique
et logique 32 bits
RA : 0x2004
BUS d’incrémentation
0x300C 0x… (??)
2ème Cycle d’exécution
R1 R5 SP
R2 LR
R3 PC 0x2008
0x2018 0x…(inst. Z)
0x2014 0x…(Inst. Y)
Multiplieur 0x2010 0x…(Inst.x)
Décodage d’instruction
32x8 0x200C 0xE5845000
LDR R1,[R0]
0x2008 0xE0835001
BUS A
Unité Arithmétique
et logique 32 bits
RA : 0x2008
BUS d’incrémentation
3ème Cycle d’exécution
CPSR
R2 LR
R3 PC x200C
0x2018 0x…(inst. Z)
0x2014 0x…(Inst. Y)
Multiplieur 0x2010 0x…(Inst.x)
Décodage d’instruction
#0
0
32x8 0x200C 0xE5845000
LDR R3,[R2]
0x3000
0x2008 0xE0835001
0x2004 0xE5923000
Registre à
0x2000 0xE5901000
décalage
Unité Arithmétique
et logique 32 bits
RA : 0x3000
BUS d’incrémentation
0x300C 0x… (??)
Incrémenteur 0x3008 0x…(??)
4ème Cycle d’exécution
d’adresse
0x3000 0xA (10)
Banque de Registres
R0 0x3000 R4 Logique de contrôle
LDR R1, [R0]
BUS UAL
R1 R5 SP CPSR
R2 LR
R3 PC x200C
0x2018 0x…(inst. Z)
0x2014 0x…(Inst. Y)
Multiplieur 0x2010 0x…(Inst.x)
Décodage d’instruction
#0
32x8 0x200C 0xE5845000
LDR R3,[R2]
0x2008 0xE0835001
BUS A
0x2004 0xE5923000
Registre à
0x2000 0xE5901000
BUS B
décalage
Unité Arithmétique
et logique 32 bits
RA : 0x3000
BUS d’incrémentation
0x300C 0x… (??)
5ème Cycle d’exécution
R1 0xA R5 SP CPSR
R2 LR
R3 PC x200C
0x2018 0x…(inst. Z)
0x2014 0x…(Inst. Y)
Multiplieur 0x2010 0x…(Inst.x)
Décodage d’instruction
#0
32x8 0x200C 0xE5845000
LDR R3,[R2]
0x2008 0xE0835001
BUS A
0x2004 0xE5923000
Registre à
0x2000 0xE5901000
0xA
décalage
Unité Arithmétique
et logique 32 bits
RA : 0x200C
BUS d’incrémentation
6ème Cycle d’exécution
CPSR
R2 0x3004 LR
R3 PC x2010
0x2018 0x…(inst. Z)
0x2014 0x…(Inst. Y)
Multiplieur 0x2010 0x…(Inst.x)
Décodage d’instruction
#0
#0
32x8 0x200C 0xE5845000
ADD R5, R3, R1
0x3004
0x2008 0xE0835001
0x2004 0xE5923000
Registre à
0x2000 0xE5901000
décalage
Unité Arithmétique
et logique 32 bits
RA : 0x3004
BUS d’incrémentation
0x300C 0x… (??)
7ème Cycle d’exécution
R1 0xA R5 SP CPSR
R2 0x3004 LR
R3 PC x2010
0x2018 0x…(inst. Z)
0x2014 0x…(Inst. Y)
0x2010 0x…(Inst.x)
BUS
Multiplieur
Décodage d’instruction
#0 B
32x8 0x200C 0xE5845000
ADD R5, R3, R1
0x2008 0xE0835001
BUS A
0x2004 0xE5923000
Registre à
0x2000 0xE5901000
décalage
Unité Arithmétique
et logique 32 bits
Registre d’Adresse
BUS d’incrémentation
8ème Cycle d’exécution
R2 0x3004 LR
R3 0x2 PC x2010
0x2018 0x…(inst. Z)
0x2014 0x…(Inst. Y)
0x2010 0x…(Inst.x)
BUS
Multiplieur
Décodage d’instruction
#0 B
32x8 0x200C 0xE5845000
ADD R5, R3, R1
0x2008 0xE0835001
BUS A
0x2004 0xE5923000
Registre à
0x2000 0xE5901000
décalage
Unité Arithmétique
et logique 32 bits
RA : 0x2010
BUS d’incrémentation
0x300C 0x… (??)
9ème Cycle d’exécution
R2 0x3004 LR
R3 0x02 PC x2014
0x2018 0x…(inst. Z)
0x2014 0x…(Inst. Y)
Multiplieur 0x2010 0x…(Inst.x)
0xA
Décodage d’instruction
#0
32x8 0x200C 0xE5845000
STR R5, [R4]
0x2008 0xE0835001
0x02
0x2004 0xE5923000
Registre à
0x2000 0xE5901000
décalage
Unité Arithmétique
et logique 32 bits
RA : 0x2014
BUS d’incrémentation
0x300C 0x… (??)
Incrémenteur 0x3008 0x…(??)
10ème Cycle d’exécution
d’adresse
0x3000 0xA (10)
Banque de Registres
R0 0x3004 0x300C R4 Logique de contrôle
STR R5, [R4]
R1 0xA r5: 0xC SP
0x300C
CPSR
R2 0x3004 LR
R3 0x02 PC x2018
0x2018 0x…(inst. Z)
0x2014 0x…(Inst. Y)
Multiplieur 0x2010 0x…(Inst.x)
Décodage d’instruction
#0
#0
32x8 0x200C 0xE5845000
Inst. X
0x300C
0x2008 0xE0835001
0x2004 0xE5923000
Registre à
0x2000 0xE5901000
décalage
Unité Arithmétique
et logique 32 bits
RA : 0x300C
BUS d’incrémentation
11ème Cycle d’exécution
0x300C 0xC
Incrémenteur 0x3008 0x…(??)
d’adresse
0x3004 0x2
0x3000 0xA (10)
Banque de Registres
R0 0x3004 0x300C R4 Logique de contrôle
STR R5, [R4]
BUS UAL
0x2018 0x…(inst. Z)
0x2014 0x…(Inst. Y)
0x0C
Multiplieur
Décodage d’instruction
#0
32x8 0x2010 0x…(Inst. X)
Inst. X
0x200C 0xE5845000
BUS A
0x2008 0xE0835001
Registre à
0x2004 0xE5923000
décalage
0x2000 0xE5901000
Unité Arithmétique
et logique 32 bits
77
Les modes de l’ARM7TDMI
Un ARM7TDMI a 7 modes opératoires de base :
– User : sans privilège, la plupart des tâches s’exécutent
– FIQ : entrée par une interruption de priorité haute (Fast)
– IRQ : entrée par une interruption de priorité basse
(normale)
– Supervisor : entrée à la réinitialisation et lors d’une
interruption logicielle (SWI “SoftWare Interrupt”)
– Abort : utilisé pour gérer les violations d’accès mémoire
– Undef : utilisé pour gérer les instructions non définies
(“undefined”)
– System : mode avec privilège utilisant les mêmes
registres que le mode User.
78
Organisation de la mémoire et des
entrées/sorties
Organisation de la mémoire
• L’espace mémoire d’un processeur ARM est constitué de 232 octets.
• Le bus d’adresse est utilisé par le processeur pour dialoguer avec la
mémoire. Cela concerne aussi bien l’accès aux instructions que
l’accès aux données en lecture et écriture.
• Le bus de données donne, lui, accès à trois registres : deux pour
l’échange de données, un pour les instructions.
Les entrées/sorties
Le mode de gestion des entrées/sorties sur les processeurs ARM consiste
à utiliser des portions de l’espace d’adressage pour dialoguer avec les
périphériques. On parle de mappage mémoire (memory mapping)
la mise en œuvre de ce système est relativement complexe. Par
exemple, les zones mappées sur les entrées/sorties ne doivent pas être
79
placées en cache
Types de données
Les types de données manipulables par les processeurs ARM sont :
- Word : donnée codée sur 32 bits, soit 4 octets. Il doit impérativement être alignés
sur une adresse divisible par 4. un mot mémoire est donc rangé dans les octets
d’adresses A, A+1, A+2 et A+3 avec A divisible par 4.
- Halfword : est une donnée codée sur 16 bits, soit 2 octets. Il doit être aligné sur
une adresse paire
- Byte : est une donnée codée sur 8 bits. Il peut être rangé n’importe où en
mémoire.
Little-endian ou big-endian
– Big-endian : les bits de plus fort poids du mot sont stockés à l’adresse la plus
basse
– Little-endian : les bits de plus faible poids sont stockés à l’adresse la plus
basse
C’est par le biais d’un signal externe BIGEND que la sélection se fait :
1 big-endian, 0 little-endian.
Les accès non alignés : les accès aux mots doivent être alignés sur des adresses
divisibles par 4, et les accès à des demi-mots doivent être alignés sur des adresses
paires. Lorsque ce n’est pas le cas, on dit que l’accès est non aligné. En règle
générale, le résultat d’un accès mémoire non aligné est non prévisible. 80
Organisation du banc de registres
37 registres organisés en bancs associés aux modes.
17 registres sont visibles :
– 13 registres de données génériques (r0 - r12).
– Le registre spécifique r13 est réservé comme pointeur de pile et il
est propre à chaque mode. Il s'appelle aussi SP.
– Le registre spécifique r14 est aussi le registre de retour de sous
programme LR (Link Register). Il évite l'empilage du PC et est propre
à chaque mode.
– Le registre spécifique r15 est aussi le compteur ordinal PC.
– Le registre de statut CPSR (Current Program Status Register)
contient des informations sur l'état du processeur.
Le registre SPSR est une copie du CPSR avant de changer
de mode. Ce registre évite l'empilage du CPSR et est
propre à chaque mode. 81
Modes privilégiés
82
Registre d’état
31 30 29 28 27 26 25 … 9 8 7 6 5 4 3 2 1 0
N Z C V Q I F T M4 M3 M2 M1 M0
83
Registre d’état
Bits de contrôle
Ces bits peuvent être modifiés de deux manières :
– Lorsqu’une exception se produit
– Par une modification explicite par programme . Ceci n’est possible que
lorsque le processeur est en mode privilégié
La significations de ces différents bits est la suivante :
– I et F : permettent de désactiver les interruptions IRQ et FIQ
respectivement . Il faut, pour cela mettre le bit correspondant à 1
– T : indique le jeu d’instructions utilisé par le processeur. Lorsqu’il est
égal à 0, le jeu d’instruction utilisé est le thumb
– M(Mode) : M[4..0] permettent de déterminer le mode de
fonctionnement du processeur.
84
Le Barrel Shifter
L’ARM7 ne dispose pas,
d’instruction de décalages et
de rotations de bits.
85
Opérations possibles avec le
Barrel Shifter
Décalage logique à gauche (LSL) multiplication
par une puissance de 2 : C 0
86
Opérations possibles avec le
Barrel Shifter
La rotation à droite (ROR) :
87
Les exceptions
Une exception est un évènement provoqué
par une condition exceptionnelle lors de
l'exécution de l'instruction courante :
– Adresse mémoire invalide
– Instruction non autorisée ou invalide
– Division par zéro (faite par un coprocesseur)
89
Traitement des exceptions et des
interruptions
Lorsqu’une exception ou une interruption survient :
– le processeur suspend tout d’abord l'exécution en cours
– sauvegarde ensuite l’état courant (PC, SP, registre d'état)
dans des registres dédiés ou dans une pile
– enfin charge le PC à une adresse mémoire spécifique qui
dépend de l’exception ou de l’interruption
91
Jeu d’instructions standard de
l’ARM7
■ Quatre types d’instructions :
– Les instructions de contrôle de flux (branchement)
– Les instructions de traitement de données (arithmétiques et logiques)
– Les instructions de manipulation de registres
– Les instructions diverses : sémaphore, génération d’exception et les
instructions coprocesseurs
■ Exécution conditionnelle
Toutes les instructions (ou presque) possède des formes d’exécution
conditionnelle. Cela signifie que leur exécution aura lieu si les bits de code
exécution sont positionnés de façon satisfaisante ; dans le cas contraire
exécution d’un NOP
96
Instructions de traitement des données
Les instructions logiques : AND, ORR, EOR (Exclusive
OR) et BIC (Bit Clear)
Ces instructions regroupent les quatre instructions suivantes :
ET, OU, OU Exclusif et la remise à zéro.
Syntaxe :
AND {<condition>} {S} <Rd>, <Rn>, <shifter_operand>
ORR {<condition>} {S} <Rd>, <Rn>, <shifter_operand>
EOR {<condition>} {S} <Rd>, <Rn>, <shifter_operand>
BIC {<condition>} {S} <Rd>, <Rn>, <shifter_operand>
BIC réalise le ET logique bit à bit des opérandes avec négation préalable
du second opérande.
97
Instructions de traitement des données
Les instructions de comparaison : CMP (CoMPare), CMN
(CoMpare Negative), TST (TeST) et TEQ (Test Equivalence)
• Les instructions de comparaison réalisent une mise à jour des bits de
code condition du CPSR par le biais d’opérations arithmétiques
(soustraction pour le CMP et addition pour le CMN).
• Les instructions de test mettent à jour ces mêmes bits par le biais
d’une opération logique (ET logique pour le TST et OU exclusif pour
le TEQ).
98
Instructions de traitement des données
Les instructions de multiplication
Il existe deux catégories de multiplication :
– les multiplications normales (sur 32 bits) et
– les multiplications longues (sur 64bits).
Les instructions de la première catégorie tronquent le résultat pour le contenir
dans un registre. Les instructions de la seconde catégorie utilisent deux
registres.
MUL {<condition>} {S} <Rd>, <Rn>, <Rs>
<Rd> <Rn> *<Rs>
MLA{<condition>} {S} <Rd>, <Rm>, <Rs>, <Rn> ;
<Rd> <Rm> *<Rs> +<Rn>
UMULL {<condition>} {S} <RdLo>, <RdHi>, <Rm>, <Rs>
<RdHi><RdLo> <Rm> *<Rs>; multiplication non signée
Multiplication signée : SMULL (Signed MULtiply Long) 99
Les instructions de
chargement/rangement
Dans le cas d’un chargement, le contenu de la mémoire situé à l’adresse
déterminée grâce à l’opérande source est rangé dans un registre de destination.
Dans le cas d’un rangement, le contenu du premier registre est rangé en mémoire
à l’adresse déterminée grâce à l’opérande spécifié en deuxième position.
102
Les instructions de
chargement/rangement
■ Les instructions de chargement/rangement simples : LDR
(LoaD Register) et STR (STore Register)
Les instruction LDR et STR manipulent les 32 bits de registre Rd.
Syntaxe :
103
Les instructions de chargement/rangement
Exemple 1
104
Les instructions de chargement/rangement
Exemple 2
105
Les instructions de chargement/rangement
Remarque 1 :
Lors du chargement d’un byte non signé dans un registre, les
24 bits de forts poids sont mis à 0
106
Les instructions de chargement/rangement
Remarque 2
Lorsqu’un mot est non aligné (adresse non divisible par quatre), c’est le
mot qui contient cette adresse qui est chargé dans le registre.
Cependant, le mot subit une rotation pour que le byte correspondant à
l’adresse utilisée devienne le byte le plus significatif.
107
Les instructions de chargement/rangement
Remarque 3 : Lorsqu’un mot est stocké en mémoire à une
adresse non divisible par quatre, les deux derniers bits de
l’adresse sont mis à 0 et le mot est stocké avec cette adresse.
108
Les instructions de
chargement/rangement
■ Les instructions de chargement /rangement de demi-mot et de
chargement signées
Le chargement doit préciser s’il s’effectue sur la taille demandée ou si une
extension de signe doit être réalisée (chargement signé).
– LDRH (LoaD Register Halfword)
– STRH (STore Register Halfword)
– LDRSB (LoaD Register Signed Byte)
– LDRSH (LoaD Register Signed Halfword)
Sur les neuf mode d’adressage, seuls six sont accessibles. Les accès par
registre décalé ne sont pas admis. Par ailleurs, les accès par déplacement
immédiat utilisent des valeurs codées sur 8bits signés.
110
Les instructions de chargement/rangement
111
Les instructions de chargement/rangement
114
Les instructions de chargement/rangement
115
Les instructions de chargement/rangement
• Exemple simple : enregistrement du contenu des registres R0,
R3, R4 à l’adresse mémoire pointée par R1. Les registres sont
stockés dans l’ordre croissant des adresses.
116
Les instructions de chargement/rangement
• Exemples
117
Les instructions de chargement/rangement
118
Les instructions de manipulations des
registres d’états
MRS {<cond>} <Rd>, <statut_register> ; transfert du
registre d’état (CPSR ou SPSR) dans un registre général
MSR {<cond>} <statut_register>_<fields>, <Rm> ;
transfert du contenu d’un registre général dans un registre
d’état
MSR {<cond>} <statut_register>_<fields>, #<immediate>
Les deux pseudo instructions les plus répandues sont ADR et LDR :
– ADR charge dans le registre Rd l’adresse correspondant à l’étiquette
etiquette
Syntaxe : ADR {<cond>} <Rd>, <etiquette>
Exemple : ADR R2, myData
…….
myData .int 53 (.int ou DCD) 121
Instructions diverses
– LDR (LoaD Register)
Il ne faut pas confondre cette pseudo-instruction avec l’instruction ARM
éponyme. Elle sera remplacée à la compilation par une instruction ARM.
Elle a pour objectif de charger dans un registre une valeur impossible à
charger par un MOV ou un MVN, ou pour charger dans un registre une
adresse d’une étiquette.
Syntaxe : LDR {<cond>} <Rd>, [<valeur> / <etiquette>]
Remarque : si le LDR est utilisé pour charger une valeur acceptable pour un MOV ou un MVN,
c’est l’instruction correspondante qui est utilisée en remplacement du LDR. Dans le cas
contraire, la valeur est rangée en mémoire et la pseudo instruction LDR est remplacée par une
instruction LDR qui chargera cette valeur depuis la mémoire. De la même manière, si LDR est
utilisée pour charger l’adresse d’une étiquette, cette adresse sera rangée en mémoire et la
pseudo instruction LDR sera remplacée par une instruction LDR chargeant cette valeur dans le
registre destinataire.
Les valeurs rangées en mémoire sont considérées comme des constantes, et elles sont placées
dans une zone mémoire appelée le pool des constantes. Ce pool ne doit pas être éloigné de
plus de 4 Ko de tout appel à LDR. Dans le cas contraire, une erreur de compilation sera signalée.
122
Instructions diverses
■ Directives de compilation
Les directives de compilation indiquent au compilateur comment traiter
efficacement le code assembleur
– ALIGN : cette directive impose au compilateur d’aligner ce qui suit sur une frontière de
mot
– DCB (.byte) : permet d’allouer un ou plusieurs octets en mémoire et de définir leur
valeur initial
– DCW(.hword) : permet d’allouer un ou plusieurs demi-mots de 16 bits en mémoire et de
définir leur valeur initial
– DCD (.int) : permet d’allouer un ou plusieurs mots de 32 bits en mémoire et de définir
leur valeur initial
– EQU (.equ) : la directive EQU (.equ) permet d’associer une expression à un symbole
Syntaxe ARM : <label> EQU <expression>
_ .fill : permet d’effectuer une réservation mémoire avec initialisation éventuelle
Syntaxe : {<label>} .fill <repeat>{, <size>{, <value}}
o <label> représente l’étiquette associée à la définition
o <repeat> est le nombre d’occurrence à réserver en mémoire
o <size> est la taille d’une occurrence. Par défaut, la taille est 1 octet. La taille maximale est de 8 octets
o <value> est la valeur d’initialisation de chaque occurrence
123
Chapitre 2 : Architecture
des Processeurs ARM et Cortex
1. Introduction aux Processeurs embarqués
2. Evolution des architectures des cœurs ARM
3. Processeur ARM7TDMI
4. Architecture Cortex-M3
Introduction
Les modes opératoires
Les registres
Organisation de la mémoire
Fonctionnalités intégrées au Bus Matrix : Bit-Banding & Data Alignement
Organisation d’un programme en mémoire & séquence de démarrage
La gestion des interruptions par le NVIC
Instructions Cortex-M3
124
Architecture Cortex-M3
1. Introduction
Introduction
• Processeur 32 bits
• Il se base sur un pipeline à 3 étages (Fetch, decode, et Execute)
• Possède une architecture Harvard
• Espace d’adressage du Cortex-M3 est unique et peut atteindre la taille
de 4 GO
• Il intègre un nombre de composant interne de débogage qui permettent
de fixer des points d’arrêt (breakpoints) et d’observation (watchpoints)
et ainsi que le suivi des instructions (instruction trace)
• L’une des particularité du Cortex-M3 est son jeu d’instruction Thumb-2.
Pour le Cortex-M3, le jeu d’instruction thumb 16 bits a été gardé, mais
le jeu d’instruction ARM 32 bits a été complètement abandonné au
profit d’un nouveau jeu d’instructions Thumb 32 bits. L’ensemble ainsi
obtenu des instructions 16 et 32 bits est appelé Thumb-2 125
Architecture Cortex-M3
1. Introduction
• D’après ARM, il permet d’optimiser l’utilisation de l’espace mémoire sans
dégrader les performances puisqu’on n’est pas obligé de basculer entre modes
de fonctionnement (cas du thumb-1). Des benchmarks réalisés donnent une
performance de 1,2 DMPIS/MHz, c’est-à-dire le Cortex-M3 exécute, en
moyenne, une instruction en moins d’un cycle d’horloge (1/1.2 = 0,833 cycle).
127
128
129
Architecture Cortex-M3
1. Introduction
130
Architecture Cortex-M3
1. Introduction
En plus du noyau, le Cortex-M3 comporte quelques périphériques :
– Un contrôleur d’interruption NVIC (Nested Vector Interrupt Controller)
supportant une entrée non masquable (NMI : Non Masquable Interrupt), 14
source d’interruptions internes gérées par le noyau et les périphériques du
Cortex-M3 et jusqu’à 240 sources d’interruptions externes (le nombre est
personnalisé pour chaque constructeur)
– Un système de débogage qui permet de placer des points d’arrêt « Breakpoints »
et d’observation « Watchpoints » matériels, ainsi que le traçage des instructions
– Une unité de protection mémoires (MPU : Memory Protection Unit) qui
permet de déterminer des droits d’accès des applications à des zones mémoires
définies. Cette unité est optionnelle et n’est pas disponible dans tous les
processeurs Cortex-M3.
– Un Bus de matrice (AHP BusMatrix : Advanced High Performance Bus)
permettant de multiplexer les bus code et données vers 3 bus de sorties (I-Code,
D-Code et System). Il permet aussi d’assurer l’alignement des données ainsi
que le « Bit-Banding ».
131
Architecture Cortex-M3
2. Les modes opératoires
2. Les modes opératoires
Une application embarquée déployée sur un microcontrôleur (ou tout système
embarquée) est constituée d’un ensemble de bouts de codes. Ces bouts de codes
peuvent être :
– Exécutés suite au déclenchement d’une interruption. Dans ce cas on parle de gestionnaire
d’interruption (Interrupt Handler) ou de Routine d’Interruption (ISR: Interrupt Service Routine)
– Exécutés en fonction de l’évolution de l’état du système (code de démarrage dans main(),
tâches utilisateur en arrière plan, etc, …)
Ainsi et en fonction du type de code exécuté, le Cortex-M3 se trouve dans l’un
des deux modes de fonctionnement :
– Mode « Handler » : utilisé quand le processeur exécute des Handlers d’interruptions
– Mode « Thread » ou user : quand le processeur exécute des programmes, autres que des
Handlers (programme principal, tâche utilisateur). C’est le mode par défaut après un reset.
Mode
Handler
Mode
Thread
Démarrage Interruption Fin Handler Interruption Fin Handler 132
Architecture Cortex-M3
2. Les modes opératoires
Le Cortex-M3 peut attribué aux applications, en fonction de l’état du bit I du
registre de contrôle (control [I]) deux niveaux de privilège :
– Niveau « Privileged » si control [I] = 0 : dans ce mode le programme en cours peut
utiliser toutes les instructions et peut accéder à toutes les ressources du
processeur. C’est le niveau par défaut après un reset.
– Niveau « Unprivileged » si control [I] = 1 : une application ayant ce niveau a un
certain nombre de limites : elle ne peut accéder le Timer System (SysTick), au
contrôleur d’interruptions (NVIC) ni aux registres de contrôle du système. Elle ne
peut utiliser qu’un certain nombre d’instructions (MSR, MRS et CPS). En plus si le
Cortex-M3 intègre un MPU, l’accès à certaines zones mémoires peut être interdit
à ces applications
Ces niveaux de privilège offrent plus de sécurité et de robustesse. En effet, quand un
programme « UnPrivileged » se trompe, il sera dans l’impossibilité de modifier les
registres et les zones mémoires protégés. Ceci est utilisé par les OS embarqués pour
protéger les données OS des applications utilisateur, et éviter une corruption des
données ou même un crash du système.
133
Architecture Cortex-M3
2. Les modes opératoires
• Quand le Cortex-M3 est en mode Handler, les codes exécutés ont toujours le niveau
«Privileged» , indépendamment de la valeur du bit I du registre de contrôle.
• Quand le Cortex-M3 est en mode Thread, les codes exécutés peuvent avoir le niveau
«Privileged» ou «Unprivileged», en fonction de la valeur du bit I du registre de
contrôle.
• Le tableau suivant récapitule les combinaisons mode Cortex / niveau de privilège
possibles :
Control [I] = 0 Control [I] = 1
Exécution d’un programme Mode Thread/ Niveau «privileged» Mode Thread/ Niveau «Unprivileged »
autre qu’un ISR
134
Architecture Cortex-M3
2. Les modes opératoires
Pour les transitions entre ces combinaisons,
ils doivent respecter les règles suivantes : Privileged/Handler Mode
135
Architecture Cortex-M3
3. les Registres
3. Les registres
Le noyau du Cortex-M3 contient un ensemble de registres divisés en deux groupes :
137
Architecture Cortex-M3
3. les Registres
Champ description
N Negative : un 1 indique que le résultat de la dernière instruction est négatif
Z Zero : un 1 indique que le résultat de la dernière instruction est nul
C Carry : un 1 indique que le résultat de la dernière instruction a généré une retenue
(carry)
V Overflow : un 1 indique que le résultat de la dernière instruction a dépassé la taille
prévue
ICI/IT Interrupt-Continuable Instruction : l’instruction en cours ne peut être interrompue
T Toujours à 1 : exécution des instructions en mode Thumb
Exception Indique le numéro de l’interruption que le processeur est entrain de servir
numbrer
138
Architecture Cortex-M3
3. les Registres
139
Architecture Cortex-M3
3. les Registres
140
Architecture Cortex-M3
4. Organisation de la Mémoire
• Le noyau Cortex-M3 ayant une architecture Harvard, il possède deux bus : un bus
code pour récupérer les instructions et un bus data pour récupérer les données.
• Les bus possèdent chacun 32 lignes d’adresses, par conséquent le noyau Cortex-M3
est capable d’accéder à un espace d’adressage total de 232 octets = 4 GO
• Les 32 lignes d’adresse (ainsi que les registres) permettent d’accéder à une mémoire
avec des mots (taille d’une case de la mémoire) de 32 bits, soit 4 octets.
• Puisque l’unité d’adressage est toujours l’octet, chaque mot de la mémoire (32 bits
= 4 octets) occupe 4 adresses : le 1er mot de la mémoire (mot0) occupe l’adresse 0,
le 2ème mot (mot1) occupe l’adresse 4, etc, … (fig a)
• Même si physiquement l’accès à une mémoire ne se fait que par mot (32bits), on
peut identifier chaque octet (fig b)
31 …… 0 Adresse 31 ……… 24 23 ……… 9 15 ……. 8 7 ……. 0
Mot 2 0x00000008
142
Cortex-M3
4. Organisation de la Mémoire
• En ce qui concerne l’interconnexion entre mémoire/périphérique et bus code et data, le
Cortex-M3 intègre une matrice d’interconnexion (AHB Bus Matrix) qui permet de
multiplexer les bus code et data et de déterminer les zones mémoires pouvant être
accédées par le code (le bus data peut accéder à la totalité des zones mémoires);
• La matrice en plus permet de multiplexer les bus du noyau :
– Les bus I-code et D-code sont respectivement la continuité des bus Code et Data du noyau.
Ces bus ne peuvent accéder qu’à la zone inférieure (0x00000000 à 0x20000000 = 0,5 GO) qui
est destinée à contenir du code exécutable du programme ainsi que les données (variables
déclarées du programme). Généralement, les constructeurs placent une mémoire Flash dans cette
zone.
– System bus peut véhiculer, selon les bits de sélection, le bus Code ou Data.
Ce bus peut accéder pratiquement à la totalité de la zone mémoire supérieure (0x20000000 à
0xFFFFFFFF = 3,5 G0) qui est subdivisée en plusieurs espaces :
• Mémoire RAM interne
• Zone des périphériques ajoutés par le constructeur du microcontrôleur (CA/N, Timer, port Ethernet, …)
• Mémoire RAM externe
• Zone de périphériques externes
• Enfin, une zone dédiée au constructeur pour placer son propre Firmware
– Internal Peripheral Bus : c’est un bus interne au processeur Cortex-M3 et permet au noyau
d’accéder aux registres des périphériques internes (NVIC, Systick, Debug, etc …). Ces
registres occupent une zone mémoire de 1 MO (0xE0000000 à 0xE0100000). 143
Plan de la mémoire du cortex-M3
bit 31 ...... 24 23 … 16 15 …… 8 7 …… 0
Unit16_t u; u
Espace
Unit32_t a; a perdu
Unit8_t x,y,z; X
Y
z
145
Caractéristiques du Cortex M3
5. Fonctionnalités intégrés du Bus Matrix : Bitbanding &Data Alignement
• On voit bien, qu’une partie de la mémoire est perdue. Ce gaspillage n’est pas permis dans
des systèmes embarqués ou la taille disponible de la mémoire est limitée.
• C’est pourquoi le Cortex-M3 est équipé d’un Bus Matrix qui est capable de gérer l’accès
aux données de manière non alignées.
bit 31 ...... 24 23 …... 16 15 ….…. 8 7 ……..… 0
Unit16_t u; u a
Unit32_t a; a X Y
Espace
Unit8_t x,y,z; Z gagné
• On voit bien que les données sont mises l’une après l’autre sans se préoccuper de les
placer au début d’une case mémoire.
• L’accès est transparent pour le programmeur (ainsi qu’au noyau CM3), c’est le Bus
Matrix qui s’occupe de lire la case (ou les cases) et d’extraire la donnée ou l’instruction
demandée.
146
Caractéristiques du Cortex M3
5. Fonctionnalités intégrés du Bus Matrix : Bitbanding &Data Alignement
The Bit-Banding
• Il s’agit d’une technique permettant de lire l’état d’un bit ou de modifier sa valeur
en une seule instruction.
• En effet, la façon conventionnelle pour modifier la valeur d’un bit i d’une variable
ou d’une case mémoire x passe par 3 instructions. L’exemple suivant montre
comment mettre à 1 un bit i :
1- Lire x :
x bi … b2 b1 b0 X Reg
1
Reg … bi … b2 b1 b0
OR 2 2- Masquage et modification du bit i
2i 0 … 0 1 … 0 0 0 Reg = Reg OR 2i
3
3- Ecriture dans x :
1 … b2 b1 b0
Reg x
147
Architecture Cortex-M3
5. Fonctionnalités intégrés du Bus Matrix : Bit-Banding &Data Alignement
• Ces lectures et modification de bits sont fréquentes dans les systèmes embarqués et
surtout temps réel ; ou les états des tâches et des sémaphores sont représentés par des
bits.
• Avec cette façon, un problème peut se poser : entre la première instruction et la
deuxième ou bien entre les instructions 2 et 3, un Handler ou une tâche pourrait être
lancé et changer l’état de la variable x. Ceci peut causer la corruption des données et
un dysfonctionnement du système.
• Pour pallier à ce problème et exécuter ces instructions d’une façon atomique (sans
interruption), l’idée était soit d’utiliser un sémaphore pour protéger la partie du code
ou bien la désactivation des interruptions avant l’exécution des instructions. Dans les
deux cas, la solution est pénalisante en terme de performance du système.
• Le Cortex-M3 propose deux zones mémoires de 1MO pouvant être accédées
directement bit par bit : ces zones sont appelées Bit-Band-Region.
• L’accès à un bit ne se fait pas directement, mais se fait par accès à une case mémoire
‘alias’ de 32bits : l’écriture d’une valeur (0 ou 1) dans cette case mémoire provoque
directement l’écriture de la même valeur dans le bit correspondant.
148
Architecture Cortex-M3
5. Fonctionnalités intégrés du Bus Matrix : Bit-Banding &Data Alignement
• L’ensemble des cases mémoires ‘alias ’ correspondant aux bits d’une zone Bit-Band
Region est appelé zone Bit-Band Alias . On trouve ainsi deux zones de 32 MO
chacune (1MO*32)
• Les deux zones Bit-Band Region et Bit-Band Alias du Cortex-M3 sont disponibles
dans les zones RAM et Peripheral.
149
Architecture Cortex-M3
5. Fonctionnalités intégrés du Bus Matrix : Bit-Banding &Data Alignement
• La correspondance entre un bit de la zone Bit-Band Region et le mot correspondant
de la zone Alias se fait comme suit :
– Le bit 0 de la première case mémoire de la zone Bit-Band Region correspond au 1er mot (mot0)
de la zone Alias (adresse offset = 0), le deuxième bit correspond au 2ème mot (adresse offset =
4), le bit 31 correspond au registre 31 (adresse offset = 31*4 = 0x7C)
– Le bit 1 de la deuxième case mémoire de la zone Bit-Band Region correspond au mot 32
(adresse offset = 32*4 = 0x80)
150
Correspondance entre bits de la Bit-Band Region et mots de la zone Alias
Architecture Cortex-M3
5. Fonctionnalités intégrés du Bus Matrix : Bit-Banding &Data Alignement
RAM Peripheral
Bit-Band Base address 0x2000 0000 0x4000 0000
Alias Base Adress 0x2200 0000 0x4200 0000
151
Architecture Cortex-M3
6. Organisation d’un programme en mémoire & séquence de démarrage
• Une fois le programme compilé et chargé dans la mémoire d’un système à
base du Cortex-M3, la mémoire aura la structure suivante :
152
Architecture Cortex-M3
6. Organisation d’un programme en mémoire & séquence de démarrage
• Le premier mot placé à l’offset 0 est occupé par l’adresse de la pile (Main
Stack). Le reste des premiers 1024 octets sont occupés par les adresses des
ISRs : Table des vecteurs d’interruptions.
• L’espace suivant la table des vecteurs d’interruptions est utilisé par les codes
des ISRs : le code de l’ISR1 (déclenché par un reset) est placé directement à
l’adresse 1024.
• Ensuite vient les programme tournant en arrière plan tel que le Main
• Enfin, est placée la mémoire pile (Main Stack). Contrairement aux codes,
l’adresse de début d’une pile correspond à son adresse supérieure. La taille
de la pile étant fixée par le programmeur avant la compilation.
• Etant donné que lors de la compilation, les tailles des codes et de la pile sont
connues, le compilateur va initialiser le mot 0 avec l’adresse de la pile
@Mstack et la table avec les adresses correspondantes des ISRs.
153
Architecture Cortex-M3
6. Organisation d’un programme en mémoire & séquence de démarrage
154
Architecture Cortex-M3
7. La gestion des interruptions par le NVIC
155
Architecture Cortex-M3
7. La gestion des interruptions par le NVIC
• Le fait d’intégrer le NVIC au noyau MC3 permet, d’une part d’améliorer les
performances du traitement des interruptions en accélérant la
communication entre le contrôleur et le noyau. D’autre part, les codes
développés ainsi que les systèmes d’exploitation temps réel peuvent être
facilement portés entre micro-contrôleurs à base du processeur Cortex-M3,
puisque la structure des registres du NVIC (et du Systick) ainsi que leurs
adresses sont les mêmes pour tous.
• Le NVIC peut avoir jusqu’à 255 entrées pour les requêtes d’interruptions :
– Une entrée NMI (Non Maskable Interrupt) : Cette interruption, contrairement aux
autres, ne peut être masquée par soft. Pour la majorité des processeurs cette
entrée est relié au chien de garde (watchdog).
– Jusqu’à 14 entrées pour les exceptions (interruptions synchrone) générées par les
composants internes du processeur Cortex-M3 (exemples : UAL suite à Overflow,
Bus suite à un accès erroné, Systick, etc…)
– Jusqu’à 240 entrées pour des interruptions externes générées par les
périphériques du microcontrôleur (série, Ehernet, ADC, etc …)
156
Architecture Cortex-M3
7. La gestion des interruptions par le NVIC
Numéro Type d’exception Niveau de priorité Description
159
Architecture Cortex-M3
7. La gestion des interruptions par le NVIC
Déroulement des interruptions
• Quand une interruption autorisée est déclenchée par un périphérique, le
NVIC force le processeur à le servir. Il commence par sauvegarder un
certain nombre de registres dans la pile, et parallèlement, il récupère
l’adresse de la routine relative à l’interruption. Une fois l’exécution de la
routine est terminée, les contenus des registres sauvegardés sont
récupérés à partir de la pile ainsi que l’adresse suivante du programme
principal
160
Architecture Cortex-M3
7. La gestion des interruptions par le NVIC
161
Cortex-M3
7. La gestion des interruptions par le NVIC
• Tail Chaining
Contrairement à d’autres processeurs qui retournent au programme principal après le
traitement d’une interruption avant de traiter l’interruption de priorité inférieure ; ce qui
fait perdre énormément de temps. Cortex utilise une méthode appelée : Tail Chaining
qui permet un temps de réponse plus court : à la fin du traitement d’une interruption, il
teste si entre temps une (des) interruption(s) de priorité inférieure s’est (se sont)
produites. Si c’est le cas, il commence directement par récupérer l’adresse de la routine
relative à l’interruption sans retourner au programme principal ; ceci dure juste 6 cycles.
À la fin du traitement IRQj, Cortex teste s’il y’a d’autres interruptions en attente. Si oui, il récupère
l’adresse de la routine relative avant de retourner au programme principal : Tail Chaining 162
163
Architecture Cortex-M3
7. La gestion des interruptions par le NVIC
• La prise en compte d’une interruption de priorité inférieure peut avoir lieu
non seulement au cours du traitement de l’interruption en cours, mais
également lors de la restauration des valeurs des registres depuis la pile
(POP). Dans ce cas, Cortex arrête immédiatement l’opération POP et
récupère l’adresse de la routine à exécuter
164
165
Architecture Cortex-M3
7. La gestion des interruptions par le NVIC
• Late Arrival
Cortex utilise une autre technique appelée Late Arrival qui permet de servir plus
rapidement les interruptions de plus haute priorité. Au moment du déclenchement
d’une interruption i, Cortex commence l’opération d’empilement (PUSH) et puis et avant
de traiter la routine relative à l’interruption i, il teste si d’autres interruptions de priorité
supérieure ont eu lieu. Si c’est le cas, il commence par traiter la routine de l’interruption
de plus haute priorité. Ainsi une priorité de haute priorité peut être servie en premier
même si elle arrive avec un certain retard (jusqu’à 12 cycles) après une autre.
166
167
Architecture Cortex-M3
8. Instructions Cortex-M3
8. Instructions Cortex-M3
8.1 Thumb-2 Instruction Set Architecture
L’architecture d’un jeu d’instruction (ISA Instruction Set Architecture) d’un
processeur définit la taille (ou les tailles) des instructions ainsi que les formats
possibles (la division de l’instruction en champs) et les valeurs binaires que peut
prendre chaque champ et leurs significations.
168
Architecture Cortex-M3
8. Instructions Cortex-M3
Pour contourner ces limites, des instructions 32 bits ont été introduites. L’instruction :
ADD R8, R3, #200 ; (R8 R3 + 200)
Permet d’utiliser tous les registres, deux registres différents comme source et destination
et enfin une valeur immédiate sur 12 bit. Le format de l’instruction est comme suit :
31 … 28 27 26 25 24 … 21 20 19 … 16 15 … 12 11 … 0
Le fait d’utiliser des instructions 16 et 32 bits conjointement n’est pas nouveau pour les
processeurs ARM. Mais, pour les anciennes architectures (v4, v5) il était indispensable
de basculer d’un mode 16 bits à un mode 32 bits et vice-versa par soft (une instruction de
commutation). Ceci cause une baisse des performances du processeur.
Pour l’architecture V7 (Cortex), les instructions ARM 32 bits ont été délaissées, de
nouvelles instructions Thumb 32 bits ont été introduites. Ces instructions ont été choisis
de telle sorte que le processeur, en analysant les 16 premiers bits, reconnaisse
automatiquement s’il s’agit d’une instruction 16 ou 32 bits. Ainsi, le processeur n’est
plus obligé de basculer d’un mode à un autre.
L’ensemble des instructions 16 bits Thumb et 32 bits Thumb forment : le jeu
d’instruction Thumb-2. 170
Architecture Cortex-M3
8. Instructions Cortex-M3
8.2 Instructions Assembleur Cortex-M
• Les instructions ARM possèdent la syntaxe suivante:
173
Architecture Cortex-M3
8. Instructions Cortex-M3
Instructions Logiques
174
Architecture Cortex-M3
8. Instructions Cortex-M3
Instructions conditionnelles & registre d’état
Une grande partie des instructions présentées peuvent être exécutées d’une façon
conditionnelles. Dans ce cas, la syntaxe de l’instruction devient :
Operation [COND] operand1 , operand2, [operand3] // [optional]
l’opération n’est exécutée que si la condition COND est vérifiée. La condition COND est relative au
résultat de l’instruction précédente (si elle positionne les indicateurs d’états).
31 30 29 28 27 26 26:25 24 23:20 19:16 15:10 9 8 7 6 5 4:0 Bits du registre
N Z C V d’état
Ces bits sont mis à jour après l’exécution de chaque instruction en fonction du résultat obtenu
instruction Résultats Bits du registre d ’état modifié
=0 Z=1
ADDS*,
Dépasse 32 bits C=1
SUBS* ,
MULS* <0 N=1
>0 N=0 * Les instructions 32 bits Thumb-2 ne mettent
pas à jour automatiquement les bits du registre
A< B N=1 d’état. Il faut obligatoirement ajouter le suffixe S
CMP A, B (State), sinon les bits ne seront pas mis à jour
A>B N=0
175
Architecture Cortex-M3
8. Instructions Cortex-M3
Les conditions COND 16 sont disponibles :
COND Signification Bits d’état
EQ EQual : égal Z
NE Not Equal : différent Z
CS/HS Carry Set/unsigned Higher or Same : supérieur ou égal non signé C
CC/LO Carry Clear/ unsigned Lower : inférieur non signé C
MI Minus/negative : négatif N
PL Plus/positive or zero : positif ou nul N
VS oVerflow Set : débordement V
VC oVerflow Clear : pas de débordement V
HI Unsigned Higher : supérieur non signé C.Z
LS Unsigned Lower or Same : inférieur ou égal non signé C.Z
GE Signed Greater than or Equal : supérieur ou égal signé N.V+N.V
LT Signed LessThan : inférieur signé NV
GT Signed Greater Than : supérieur signé Z.N.V + N.V
LE Signed Less than or Equal : inférieur ou égal signé Z+NV
AL Always : exécution inconditionnelle
176
Architecture Cortex-M3
8. Instructions Cortex-M3
If (x == 0) CMP R0, #0
{
x = y +1 ADDEQ R0, R1, #1
}
else
{
y=x+1 ADDNE R1, R0, #1
}
En supposant que R0 contient x et R1 y
177
Architecture Cortex-M3
8. Instructions Cortex-M3
Instructions de saut
• Ces instructions permettent de faire un saut vers une adresse, ou bien vers une
fonction. Le saut peut être inconditionnel ou bien conditionnel.
Instruction Description
B Branch : faire un saut vers une adresse (un label ou étiquette dans un programme
BL Branch with Link : faire un saut et sauvegarder l’adresse de retour dans le registre
LR (R14). Cette instruction est utilisée pour faire appel à une fonction
B[COND] Branch si COND vraie.
• Tumb-2 offre également une instruction qui combine le saut et la comparaison pour
gagner en nombre d’instructions et en vitesse d’exécution :
Instruction Description
CBZ Compare & Branch if Zero : faire une comparaison et faire un saut si égale à 0
CBNZ Compare & Branch if Not Zero : faire une comparaison et faire un saut si différent
de 0
178
Architecture Cortex-M3
8. Instructions Cortex-M3
} Bouclefin : ……..
179