Vous êtes sur la page 1sur 179

Cours

Architecture SoC & Interfaçage


ère
(1 Partie)
4ème Année Ingénieur
Informatique
Option : Ingénierie IoT
Professeur Samir BEN AHMED
Faculté des Sciences de Tunis
Laboratoire LIPSIC-FST
Année universitaire 2020-2021
1
Plan du cours
1. Introduction aux Systèmes Embarqués et Systèmes sur puce
2. Architecture des Processeurs Embarqués : Les Processeurs

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

1. Définition d’un système embarqué


2. Grands domaines d’application
3. Définition – SoC
4. Définition MPSoC
5. Notion d’IP (Intellectual Property)
6. Spécificité des Systèmes Embarqués

4
Introduction aux Systèmes Embarqués et Systèmes sur puce

■ Définition d’un Système Embarqué


Un système embarqué peut être défini comme un
système électronique et informatique autonome ne
possédant pas des entrées/sorties standards comme un
clavier ou un écran d’ordinateur.
Le système matériel et l’application sont intimement
liés et noyés dans le matériel et ne sont pas aussi
facilement discernables comme dans un
environnement de travail classique de type PC.

5
Introduction aux Systèmes Embarqués et Systèmes sur puce

■ Définition : Systèmes Embarqués (suite)


Les systèmes embarqués peuvent être vus comme
des ordinateurs enfouis dans les équipements
électroniques du quotidien (téléphones, voitures,
avions, satellites, engins industriels). Ils sont
souvent développés pour une application
particulière et sont soumis à des contraintes
fortes : faible consommation, capacité mémoire
réduite, temps-réel, communication, etc.

6
Introduction aux Systèmes Embarqués et Systèmes sur puce

■ Grands domaines d’application


 Télécommunications
• Disponibilité, qualité de service
• Dissipation de chaleur, …

 Electronique grand public


• Coût déterminants
• Consommation d’énergie
• Evolution rapide, …
 Transports
• Sécurité, Fiabilité (certification)
• Temps réel
 Médical
 Militaire

7
Introduction aux Systèmes Embarqués et Systèmes sur puce

World Embeded Systems Revenue


25 25

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

■ Evolution vers l’intégration

10
Introduction aux Systèmes Embarqués et Systèmes sur puce

■ Une architecture de SoC

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

■ Réalisation d’un SoC


• Réutiliser les blocs déjà conçus dans la société ;
• Utiliser les générateurs de macro-cellules (Ram,
multiplieurs,…)
• Acheter des blocs conçus hors de l’entreprise.

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

■ Définition d’un MPSoC


The multiprocessor System-on-Chip (MPSoC) is a system-on-
chip (SoC) which uses multiple processors, usually targeted for
embedded applications. It is used by platforms that contain
multiple, usually heterogeneous, processing elements with
specific functionalities reflecting the need of the expected
application domain, a memory hierarchy and I/O components.
All these components are linked to each other by an on-chip
interconnect. These architectures meet the performance
needs of multimedia applications, telecommunication
architectures, network security and other application domains
while limiting the power consumption through the use of
specialized processing elements and architecture
18
Introduction aux Systèmes Embarqués et Systèmes sur puce

■ Notion d’IP (Intellectual Property)


• Blocs fonctionnels complexes réutilisables
– Hard: déjà implanté, dépendant de la technologies,
fortement optimisé
– Soft: dans un langage de haut niveau (VHDL,
Verilog, C++…), paramétrables
• Normalisation des interfaces ( OCP)
• Environnement de développement (co-design,
co-specif, co-verif)
• Performances moyennes (peu optimisé)
19
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

■ Caractéristiques des systèmes embarqués


 Souvent dédiés à des tâches spécifiques
 Généralement soumis à
 Des contraintes temps réel (le système d’exploitation
peut être temps réel)
Des contraintes liées à la consommation d’énergie,
dissipation de chaleur, …
 Les ressources peuvent être plus restreintes que
dans un système fixe (Ex : mémoire)

21
Introduction aux Systèmes Embarqués et Systèmes sur puce

■ Caractéristiques des systèmes embarqués


 Le code est généralement stocké en ROM
 Peuvent être amenés à fonctionner dans des
conditions extrêmes (température, humidité, …)
 Les aspects sécurités, fiabilité, tolérance aux fautes
, … sont souvent cruciaux
 Des méthodes de conception et de validation
spécifiques doivent leur être associées

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

• Le CPU d’un microcontrôleur est généralement moins complexe que celui


d’un système informatique ordinaire (microordinateur), à consommation
électrique plus faible (qq miliwatt en fonctionnement et de l’ordre du
microwatt en veille) et également moins performant : il supporte
également une centaine d’instruction et fonctionne à des fréquences
relativement basse variant de quelques dizaines de MHz à quelques
centaines. Ceci permet de limiter la consommation en énergie du circuit

• Ces circuits à prix réduits à grandes quantités (moins de 1$ pour 10000


pièces) sont d’une grande utilités pour les applications embarquées
24
Introduction aux Processeurs Embarqués
• Même si les c 8 bits se sont imposés longtemps ; l’étendue des domaines
d’application des c, le besoin croissant en capacité de traitement et en
comportement temps réel ont incité les concepteurs à proposé des processeurs
16 bits et particulièrement 32 bits beaucoup plus performants

• Les ventes des c 32 bits ont énormément progressé lors de la dernière


décennie et sont passé de moins de 1% en 2000 à 30% en 2006 pour atteindre
les 38% en 2009 et on prévoit que cette croissance continuera durant les
prochaines années

Figure 1 : Evolution des ventes des c 8, 16 et 32 bits 25


Introduction aux Processeurs Embarqués
• La majorité des fabricants de c optent pour l’intégration de CPU préconçu,
sous forme d’IP « Intellectual Property », dans leurs circuits et lui ajoutent les
mémoires et les entrées/sorties nécessaires pour les applications ciblées
• Parmi les CPU (IP) les plus utilisés dans les c 32 bits, on trouve les cœurs de la
société ARM (Advanced Risc Machine), qui grâce à son cœur Cortex s’est
imposé comme le leaders des fournisseurs de cœurs 32 bits pour les
applications embarqués (75% du marché 32 bits)

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

Extensions Technologiques des coeurs ARM


• Jazelle
• Thumb
• Thumb-2
• Thumb Execution Environnement (ThumbEE)
• Floating-point (VFP)
• Advanced SIMD (NEON)
• TrustZone

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 a pour vision d’atteindre une densité de code proche


de Thumb tout en conservant des performance similaires au jeu
d’instructions ARM en mémoire 32 bits.

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

Thumb Execution Environnement (ThumbEE)


ThumbEE, également appelé Thumb-2EE ou Jazelle RCT pour
(Runtime Compilation Target : cible de compilation à la volée)
apparait pour la première fois dans le processeur Cortex-A8.
ThumbEE est le quatrième état du processeur, ajoutant de petit
changement au jeu d’instruction étendue thumb et thumb-2. Ces
changements rendent le jeu d’instruction particulièrement adapté à
la génération de code au moment de l’exécution, par la compilation
à la volée, dans des environnements d’exécution contrôlés.

ThumbEE est orientée vers les langages de programmation Limbo,


Java, C#, Perl, Python ou Ruby et permet aux compilateurs à la volé
de générer moins de code de sortie sans affecter les performances.
36
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.

VFP fournit des calculs en virgule flottante permettant d’accomplir


un vaste spectre d’applications et de besoins tels que les PDAs, les
smartphones, la compression et décompression de voix, des
graphiques en trois dimensions ou encore de l’audio numérique, des
boitiers multimédias et des applications automobiles.

37
Evolution des architectures ARM
Extensions technologiques des cœurs ARM

Advanced SIMD (NEON)


L’extension advanced SIMD (également appelé NEON ou MPE pour
Media Processing Engine : moteur de calcul de médias) est un SIMD
(Single Instruction Multiple Data), combinant des jeux d’instruction
64 et 128 bits, qui fournissent de l’accélération de calcul standardisé
pour les applications de médias, 2D/3D et de traitement de signal.

NEON peut faire du décodage MP3 sur un processeur fonctionnant à


10 MHz et peut encoder/décoder le codec GSM AMR à 13 MHz et
permet d’accélérer le décodage de formats vidéos tels que h264 ou
Real.

38
Evolution des architectures ARM
Extensions technologiques des cœurs ARM

Security extensions (TrustZone)


Grâce à une combinaison de composants logiciels et de
matériel intégré, la technologie TrustZone fournit la base pour
une architecture de système hautement protégé, avec un
minimum d’impact sur la consommation d'énergie ou la
performance du processeur

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

• Version 6 : cette version amène des amélioration notamment dans le domaine


multimédia par le biais des extensions SIMD. La multiplication des unités
d’exécution.
Cette version est implémentée par la famille ARM11. Ses performances
dépassent les 600MIPS, les fréquences de fonctionnement peuvent atteindre le
1GHz.
44
Evolution des architectures ARM
ARM v7 : La famille Cortex

• Version v7 : La famille Cortex


Contrairement aux architectures précédentes, Cortex intègre entre
autre la gestion des interruptions et des exceptions ce qui permet
une plus grande transparence et souplesse au niveau de la
programmation ainsi qu’un portage de code plus simple.
Les cœurs de Cortex portent la désignation Cortex-XN ou X
désigne le profil auquel appartient le cœur et N son degré de
performance qui varie entre 0 (le moins performant) et 9 (le plus
performant).
On distingue 3 profils propres à l’architecture ARM-v7 ou Cortex :
Cortex-A
Cortex-R
Cortex-M 45
Evolution des architectures ARM
ARM v7 : La famille Cortex

• 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, …

1Dhrystone MIPS : Performance de traitement du processeur en millions d’Instructions par


seconde obtenue par exécution du bechmark Dhrystone
46
Evolution des architectures ARM
ARM v7 : La famille Cortex

• 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.

Les processeurs de ce profil contiennent également une unité


additionnelle pour le calcul en virgule flottante et sont utilisés à
titre d’exemple dans les disques durs, les appareils photo
numériques, le domaine de l’automobile (système de freinage)

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

Performance et domaines d’applications des profils de l’architecture Cortex 49


Evolution des architectures ARM
Performances des architectures ARM

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

Registre d’écriture Registre de lecture Registre instruction

Bus de données D[31..0]

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

 La partie opérative (datapath) est constituée de 2


bus A et B sur lesquels se font les opérations.

 Le flot de calcul est le suivant :


Banc de registres sur A et B => Barrel shifter sur B
=> UAL => Banc de registres

 Les opérations sur ce datapath durent 1 cycle.

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)

 Une opération de décalage aurait pu avoir lieu sur r2


dans le même cycle ADD r0,r1,r2,LSL#2. Ici r2 est
décalé de 2 bits sur la gauche avant d'être
additionné.
(r0) := (r1) + 4 * (r2) 58
Vue simplifiée du cœur
ARM7TDMI
 Le registre d'adresse fournit les adresses à la mémoire.
 Les blocs décompression et décodage des instructions
servent aux 2 premiers cycles du pipeline alors que le
datapath sert au 3ème cycle.

 Les registres de Lecture et d'écriture des données sont


des tampons de données avec la mémoire externe
pour les instructions LOAD/STORE.

 Le bloc de contrôle à droite est l'interface avec tous les


signaux de commande externes : contrôleur mémoire,
coprocesseurs, interruptions...

59
Le Pipeline d’instructions
 La famille ARM7 utilise un pipeline à 3 étages pour augmenter la
vitesse du flot d’instructions dans le microprocesseur.

 Le PC pointe sur l’instruction en cours de lecture (FETCHed) et non


sur l’instruction en cours d’exécution.
 Les instructions sont "pipelinées" en 3 cycles d'horloge : FETCH,
DECODE et EXECUTE.
 Ainsi le concept RISC (1 instruction par cycle) est respecté. 60
Exemple 1 : Pipeline optimal

 Il faut 6 cycles pour exécuter 6 instructions (CPI “Cycles Per


Instruction”=1).
 Toutes les instructions n'opèrent que sur des registres (1 cycle).
61
Exemple 2 : Pipeline avec LDR

 Le pipeline est rompu à cause de l’instruction LDR qui lit une


donnée en mémoire et la charge dans un registre.
 Il faut 6 cycles pour exécuter 4 instructions. CPI = 1,5.
 Remarque : Les instructions LOAD et STORE prennent donc 3
cycles à la place de 1.
62
Codage des instructions

Les instructions ARM sont toutes codées sur 32 bits.

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 S Rn Rd Deuxième opérande

Format général d’une instruction

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

Format des instructions de branchement

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

0x300C 0x… (??)


Incrémenteur 0x3008 0x…(??)
d’adresse
0x3000 0xA (10)
Banque de Registres
R0 R4 Logique de contrôle
CPSR
BUS UAL

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

BUS B 0x2004 0xE5923000


Registre à
0x2000 0xE5901000
décalage

Unité Arithmétique
et logique 32 bits

Registre d’écriture Registre de lecture RI : LDR R1, [R0]

Bus de données D[31..0]


0xE5901000 66
0x2004
Bus d’adresses A[31..0] Mémoire

RA : 0x2004

BUS d’incrémentation
0x300C 0x… (??)
2ème Cycle d’exécution

Incrémenteur 0x3008 0x…(??)


d’adresse
0x3000 0xA (10)
Banque de Registres
R0 R4 Logique de contrôle
CPSR
BUS UAL

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

BUS B 0x2004 0xE5923000


Registre à
0x2000 0xE5901000
décalage

Unité Arithmétique
et logique 32 bits

Registre d’écriture Registre de lecture RI : LDR R3, [R2]

Bus de données D[31..0]


0xE5923000 67
0x2008
Bus d’adresses A[31..0] Mémoire

RA : 0x2008

BUS d’incrémentation
3ème Cycle d’exécution

0x300C 0x… (??)


Incrémenteur 0x3008 0x…(??)
d’adresse
0x3000 0xA (10)
Banque de Registres
R0 0x3000 R4 Logique de contrôle
LDR R1, [R0]
R1 R5 SP
0x3000

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

Registre d’écriture Registre de lecture RI : ADD R5, R3, R1

Bus de données D[31..0]


0xE5923000 68
0x3000
Bus d’adresses A[31..0] Mémoire

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

Registre d’écriture Registre de lecture : 0xA RI : ADD R5, R3, R1

Bus de données D[31..0]


0xA 69
0x3000
Bus d’adresses A[31..0] Mémoire

RA : 0x3000

BUS d’incrémentation
0x300C 0x… (??)
5ème Cycle d’exécution

Incrémenteur 0x3008 0x…(??)


d’adresse
0x3000 0xA (10)
Banque de Registres
R0 0x3000 R4 Logique de contrôle
LDR R1, [R0]
BUS UAL

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

Registre d’écriture Registre de lecture : 0xA RI : ADD R5, R3, R1

Bus de données D[31..0]


70
0x200C
Bus d’adresses A[31..0] Mémoire

RA : 0x200C

BUS d’incrémentation
6ème Cycle d’exécution

0x300C 0x… (??)


Incrémenteur 0x3008 0x…(??)
d’adresse
0x3000 0xA (10)
Banque de Registres
R0 0x3004 R4 Logique de contrôle
LDR R3, [R2]
R1 0xA R5 SP
0x3004

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

Registre d’écriture Registre de lecture RI : STR R5, [R4]

Bus de données D[31..0]


0xE5845000 71
0x3004
Bus d’adresses A[31..0] Mémoire

RA : 0x3004

BUS d’incrémentation
0x300C 0x… (??)
7ème Cycle d’exécution

Incrémenteur 0x3008 0x…(??)


d’adresse
0x3000 0xA (10)
Banque de Registres
R0 0x3004 R4 Logique de contrôle
LDR R3, [R2]
BUS UAL

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’écriture Registre de lecture : 0x2 RI : STR R5, [R4]

Bus de données D[31..0]


0x2 72
Bus d’adresses A[31..0] Mémoire

Registre d’Adresse

BUS d’incrémentation
8ème Cycle d’exécution

0x300C 0x… (??)


Incrémenteur 0x3008 0x…(??)
d’adresse
0x3000 0xA (10)
Banque de Registres
R0 0x3004 R4 Logique de contrôle
LDR R3, [R2]
R1 0xA R5 SP CPSR
0x02

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

Registre d’écriture Registre de lecture : 0x2 RI : STR R5, [R4]

Bus de données D[31..0]


73
0x2010
Bus d’adresses A[31..0] Mémoire

RA : 0x2010

BUS d’incrémentation
0x300C 0x… (??)
9ème Cycle d’exécution

Incrémenteur 0x3008 0x…(??)


d’adresse
0x3000 0xA (10)
Banque de Registres
R0 0x3004 R4 Logique de contrôle
ADD R5, R3, R1
R1 0xA r5: 0xC SP CPSR
0x0C

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

Registre d’écriture Registre de lecture : 0x2 RI : Inst. X

Bus de données D[31..0]


0x…. 74
0x2014
Bus d’adresses A[31..0] Mémoire

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

Registre d’écriture Registre de lecture : 0x2 RI : Inst. Y

Bus de données D[31..0]


0x…. 75
0x300C
Bus d’adresses A[31..0] Mémoire

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

R1 0xA r5: 0xC SP CPSR


R2 0x3004 LR
R3 0x02 PC x2018

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

Registre d’écriture : 0x0C Registre de lecture : 0x2 RI : Inst. Y

Bus de données D[31..0]


0x0C 76
Les modes de l’ARM7TDMI
 Le processeur ARM a plusieurs modes de
fonctionnement différenciés par des ressources et des
privilèges spécifiques : certaines opérations ne sont
autorisées que dans certains modes.

 Ces modes simplifient le portage d'un système


d'exploitation multi-utilisateurs.

 Ils participent à la protection du code et des données


ainsi qu'à la gestion d'erreurs.

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

Les registres accessibles selon les différents modes


Modes d’exception
User System Supervisor Abort Undefined interrupt Fast

de fonctionnement d’un processeur ARM


interrupt
R0 R0 R0 R0 R0 R0 R0
R1 R1 R1 R1 R1 R1 R1
R2 R2 R2 R2 R2 R2 R2
R3 R3 R3 R3 R3 R3 R3
R4 R4 R4 R4 R4 R4 R4
R5 R5 R5 R5 R5 R5 R5
R6 R6 R6 R6 R6 R6 R6
R7 R7 R7 R7 R7 R7 R7
R8 R8 R8 R8 R8 R8 R8_fiq
R9 R9 R9 R9 R9 R9 R9_fiq
R10 R10 R10 R10 R10 R10 R10_fiq
R11 R11 R11 R11 R11 R11 R11_fiq
R12 R12 R12 R12 R12 R12 R12_fiq
R13 R13 R13_svc R13_abt R13_und R13_irq R13_fiq
R14 R14 R14_svc R14_abt R14_und R14_irq R14_fiq
R15 R15 R15 R15 R15 R15 R15

CPSR CPSR CPSR CPSR CPSR CPSR CPSR


SPSR_svc SPSR_abt SPSR_und SPSR_irq SPSR_fiq

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

Code condition Réservé Bits de contrôle

 Bits de code condition


La signification des différents bits de code condition :
• N (Negative) : reflète l’état du bit 31 du résultat de l’instruction
• Z (Zero) : bit à 1 lorsque le résultat de l’instruction est 0
• C (Carry) : représente la retenue à propager
• V (oVerflow) : dépassement de capacité. V est positionné à 1 si un dépassement se
produit à la suite d’une opération d’addition ou de soustraction, les opérandes étant
considérés comme signés en complément à deux
• Q: dépassement de capacité ou saturation dans les opérations de traitement du signal

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.

 A la place, il dispose d’un


«Barrel Shifter » permettant
d’effectuer des décalages et
des rotations au sein d’autres
instructions.

85
Opérations possibles avec le
Barrel Shifter
 Décalage logique à gauche (LSL) multiplication
par une puissance de 2 : C 0

 Décalage logique à droite (LSR) division par


une puissance de 2 : 0 C

 Décalage arithmétique à droite (ASR) division


par puissance de 2 + préservation du signe pour
le complément : C

86
Opérations possibles avec le
Barrel Shifter
 La rotation à droite (ROR) :

 La rotation à droite étendue (RRX) :

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)

 Les exceptions sont détectées par le CPU puis


traitées dans le contexte du programme
courant.
88
Les interruptions
Une demande d'interruption peut être
– déclenchée par un événement associé à un
composant matériel :
• début/fin d'entrée/sortie d'un périphérique
• échéance de temps terminée

– un signal envoyé au processeur de l'extérieur par


l’intermédiaire d’un PIC (Programmable Interrupt
Controler).

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

 Ces adresses sont localisées dans une partie de la


mémoire appelée le vecteur d’exceptions
/interruptions.
90
Vecteur d’exceptions /
interruptions

 Le vecteur d’exceptions / interruptions


contient généralement les adresses des
fonctions permettant de traiter de manière
appropriée les différents évènements.

 Ces fonctions sont appelées gestionnaires


d’exceptions ou d’interruptions.

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

■ Positionnement des indicateurs de code condition


Toutes les instructions peuvent modifier les bits de condition du CPSR ; il suffit
pour cela de faire suivre le mnémonique de l’instruction par la lettre « S » :
– MOV R0, #0  laisse inchangé les bits indicateurs de condition
– MOVS R0, #0  met N,C et V à 0 et Z à 1
92
Jeu d’instructions standard de
l’ARM7
Code extension Signification Bits de condition
0000 EQ EQual : égal Z
0001 NE Not Equal : différent Z
0010 CS/HS Carry Set/unsigned Higher or Same : supérieur ou égal non signé C
0011 CC/LO Carry Clear/ unsigned Lower : inférieur non signé C
0100 MI Minus/negative : négatif N
0101 PL Plus/positive or zero : positif ou nul N
0110 VS oVerflow Set : débordement V
0111 VC oVerflow Clear : pas de débordement V
1000 HI Unsigned Higher : supérieur non signé C.Z
1001 LS Unsigned Lower or Same : inférieur ou égal non signé C.Z
1010 GE Signed Greater than or Equal : supérieur ou égal signé N.V+N.V
1011 LT Signed LessThan : inférieur signé NV
1100 GT Signed Greater Than : supérieur signé Z.N.V + N.V
1101 LE Signed Less than or Equal : inférieur ou égal signé Z+NV
1110 AL Always : exécution inconditionnelle
93
1111
Instructions de branchement
 Branchement classique simple : B (Branch)
B {<condition>} <adresse_cible>
 Appel de sous-programme : BL (Branch with link)
BL {<condition>} <adresse_cible> ; met à jour le registre
R14 ¨link register¨
 Versions basculant en mode Thumb : BX (Branch AND eXchange)
et BLX (Branch with Link AND eXchange)
 Exemple :
BL subroutine
CMP r1, #5
MOVEQ r1, #0 ; si r1=5 alors r1=0

subroutine
….
MOV pc,lr ; retour après appel de procédure
94
Instructions de traitement des données
Pas moins de 11 modes d’adressage sont utilisables lorsque l’opérande
<shifter_operand> sera précisé. Ces 11 modes se scindent en trois catégories:
 Adressage immédiat : ce mode d’adressage permet de préciser une constante à
utiliser comme opérande. Syntaxe : #<immediate>
 Adressage par registre : Ce mode exploite le contenu d’un registre
Syntaxe : <Rm> ; où Rm précise le registre à utiliser
 Adressage par registre avec décalage : ce mode d’adressage permet d’utiliser
la valeur contenue dans un registre décalée logiquement, arithmétiquement ou
circulairement, à gauche ou à droite, de 0 à 31 positions. Le décalage se fait par
insertion de zéro.
• <Rm>, LSL #<shift_imm> / <Rm>, LSR #<shift_imm>
• <Rm>, LSL <Rs> / <Rm>, LSR <Rs>
• <Rm>, ASR #<shift_imm> ; décalage arithmétique
• <Rm>, ASR <Rs>
• <Rm>, ROR #<shift_imm> ; rotation
• <Rm>, ROR <Rs>
95
Instructions de traitement des données
 Les assignations : MOV (MOVe) et MVN (MoVe Not)
Syntaxe : MOV {<condition>} {S} <Rd>, <shifter_operand>

 Les instructions d’addition/soustraction : ADD (ADDition),


SUB (SUBstract)
On distingue six opérations différentes : ADD pour l’addition, ADC pour
l’addition avec retenue, SUB pour la soustraction, RSB pour la soustraction à
opérandes inversés (on soustrait le second opérande source au premier), SBC
pour la soustraction avec retenue et RSC pour la soustraction avec retenue et à
opérandes inversés.
Syntaxe : ADD {<condition>} {S} <Rd>, <Rn>, <shifter_operand>
SUB {<condition>} {S} <Rd>, <Rn>, <shifter_operand>
Avec : <Rd> : registre résultat, <Rn> : registre contenant le premier opérande
<shifter_operand> : spécifie le second opérande selon le mode d’adressage.

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).

Syntaxe : CMP{<condition>} <Rn>, <shifter_operand>


CMN{<condition>} <Rn>, <shifter_operand>
TST{<condition>} <Rn>, <shifter_operand>
TEQ{<condition>} {S} <Rn>, <shifter_operand>

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.

■ Modes d’adressages des instructions de traitement d’accès à la


mémoire
L’accès à la mémoire se fait toujours par le biais d’un registre contenant l’adresse
mémoire à utiliser. Pas moins de neuf mode d’adressage sont utilisables pour ces
opérations. Ces neufs modes peuvent être classés en trois catégories :
 Les accès par déplacement simple
 Les accès par déplacement pré-indexé
 Les déplacement post-indexé
Pour chaque catégorie, on dispose d’un accès immédiat, d’un accès par registre ou
d’un accès par registre décalé 100
Les instructions de
chargement/rangement
 Adressage par déplacement simple
Ce mode permet de préciser un registre à utiliser comme adresse. La valeur du registre peut être
modifiée par un déplacement immédiat sur 12bits (déplacement simple) ou par une valeur dans
un second registre (cette dernière pouvant éventuellement faire l’objet d’une rotation).
Syntaxe : [<Rn>, #+/-<offset_12> ]
[<Rn>, +/- <Rm>]
[<Rn>, +/- <Rm>, {LSL / LSR / ASR / ROR / RRX} #<shift_imm>]

 Adressages avec déplacement pré-indexé


Les modes d’adressages avec déplacement simple peuvent éventuellement être suivis d’un point
d’exclamation (!). Dans ce cas la valeur résultant du calcul et permettant d’adresser la mémoire
sera sauvegardée dans le registre d’adresse Rn.
Exemple : R0 0x1000, [R0, #0x12]! permet d’accéder à l’adresse 0x1012 et R0  0x1012

 Adressage avec déplacement post-indexé


Dans ce cas, le crochet fermant des adressages avec déplacement simple se positionne juste
après le registre d’adresse Rn. Cela indique que c’est la valeur de se registre est utilisée pour
accéder à la mémoire. La valeur résultant du calcul est utilisée pour mettre à jour Rn.
Exemple : R0 0x1000 ; [R0], #0x12 permet d’accéder à l’adresse 0x1000 et R0  0x1012 101
Modes d’adressages des instructions
LDR, STR, LDRB et STRB

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 :

LDR {<cond>} {B} <Rd>, <adressing_mode>


B indique que le transfert concerne un octet. L’octet est transféré dans l’octet
de plus faible poids du registre Rd et les 24 bits de plus fort poids sont à 0

STR {<cond>} {B} <Rd>, <adressing_mode>


B indique que le transfert concerne un octet. L’octet transféré en mémoire est
l’octet du plus faible poids du registre Rd

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.

Elles peuvent être exécutées de manière conditionnelle.


Exemple : LDREQH
Syntaxe : – LDR {cond} H ¦ SH ¦ SB <Rd>, <addressing_mode>
– STR {cond} H ¦ B <Rd>, <addressing_mode>
109
Les instructions de
chargement/rangement
• Modes d’adressages des instructions LDRH,
LDRSH, STRH, LDRSB

110
Les instructions de chargement/rangement

• Transferts de halfwords (16bits) et de bytres signés


– Remarque 1 : lors d’un chargement d’un halfword ou d’un
byte signé de la mémoire, le signe est étendu pour donner
un mot de 32bits de même valeur

111
Les instructions de chargement/rangement

• Remarque 2 : ces instructions ne permettent pas l’utilisation de


décalage

• Remarque 3 : les transferts de bytes ou de halfwords vers les


registres dépendent de la représentation signée ou non de la valeur.
l’extension du signe aux 32 bits du registre marque la différence
112
Les instructions de
chargement/rangement
■ Les instructions de chargement/rangement par bloc :
LDM (LoaD Multiple) , STM (STore Multiple)
Ces instructions permettent de manipuler plusieurs registres simultanément.
Elle s’appuient sur un modes d’adressages spécifiques :
– IA (Increment After) : on procède à l’incrémentation de l’adresse de base après l’opération de
lecture/écriture
– IB (Increment Before) : on procède à l’incrémentation de l’adresse de base avant l’opération
de lecture/écriture
– DA (Decrement After) : on procède à la décrémentation de l’adresse de base après l’opération
de lecture/écriture
– DB (Decrement Before) : on procède à la décrémentation de l’adresse de base avant
l’opération de lecture/écriture
Syntaxe : LDM {<cond>} <addr_mode> <Rn>!, <registers>{^}
STM {<cond>} <addr_mode> <Rn>!, <registers>{^}
{^} utilisé unique en mode privilégié, les registres concernés sont ceux de la banque utilisateur et
non courante
113
Les instructions de chargement/rangement
• Les registres sont déposés en mémoire dans l’ordre croissant
des adresses, de R0 à R15, quel que soit leur ordre dans la
liste de l’instruction.
• Ils sont repris de la mémoire (LDM) dans l’ordre inverse, de
R15 à R0…
• Par habitude, les registres sont écrits dans l’ordre croissant
dans la liste de l’instruction.
• L’adresse pointée par Rn doit être une adresse de mot,
divisible par quatre. Ce pointeur peut être fixe ou mis à jour
après les transferts grâce au symbole « ! ».
STMIA R1, { RO, R3, R4 } ; R1 n’est pas modifié
STMIA R1 ! , { RO, R3, R4 } ; R1 := R1 + 12 (3 registres de 4 bytes)

114
Les instructions de chargement/rangement

Quatre manières de disposer les registres en mémoire :


– Dépôt en mémoire avec une adresse montante ou avec
une adresse descendante.
– Pointeur sur le dernier élément déposé ou la première
place libre.

Pour chaque disposition, il existe un LDM et un STM.

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>

<fields> spécifie quel partie du registre doit être modifiée :


all, ¨c¨ (altère les 8bits poids faible) ,¨x¨ (altère les bits de 8 à
15), ¨s¨ (altère les bits de 16 à 23) et ¨f¨ (les bits de 24 à 31)
119
Instructions diverses
■ Instructions de sémaphores : SWP(SwaP) , SWPB (SwaP Byte)
Deux instructions permettent de gérer les accès concurrents en environnement
multiprocesseurs. Ces instructions permettent de réaliser des opérations de
lecture/écriture mémoire atomique.
– SWP : réalise un échange entre un mot contenu en mémoire et le contenu d’un
registre
SWP{<cond>} <Rd>, <Rm>, [<Rn>] ; Rd: registre de destination,
Rm : registre source, Rn : registre contenant l’adresse mémoire
– SWPB : réalise un échange entre un octet contenu en mémoire et le contenu d’un
registre (avec extension par zéro pour les bits de poids forts)
■ Instruction d’interruption : SWI (SoftWare Interrupt)
l’instruction SWI permet de générer une interruption logicielle. Le seul moyen pour un programme
s’exécutant en mode utilisateur d’invoquer l’exécution de code en mode privilégie.
SWI{<cond>} <immed_24> ; <immed_24> : utilisé par la routine d’interruption
pour déterminer le service demandé au système d’exploitation.
■ Instructions d’utilisation des coprocesseurs
• Instruction d’invocation d’une opération (CDP)
• Instructions de transfert de blocs de registres entre un coprocesseur et la mémoire (LDC, STC)
• Instructions de transfert d’informations entre registres du coprocesseur et du processeur (MRC,
MCR)
120
Instructions diverses
■ Les pseudo instructions ADR (load ADdRess) et LDR (LoaD
Register)

Il s’agit d’ « instructions » comprises par l’assembleur, et remplacées par


celui-ci au moment de la compilation par de « vraies » instructions ARM7.

Elles permettent d’automatiser des traitements fastidieux concernant le calcul


d’adresses, la réservation de valeurs en mémoire , etc.

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).

Performance et densité du code pour différents jeux d’instructions ARM


126
Architecture Cortex-M3
1. Introduction
• A part l’amélioration des performances, une partie importante de
ce nouveau jeu d’instructions Thumb-2 a été spécialement conçue
pour être la cible des compilateurs
• En plus des instructions ont été introduites pour permettre :
– Des divisions matérielles (SDIV et UDIV) qui nécessitent de 2 à 3 cycles
d’horloge
– Des multiplications 32 bits qui se déroulent en un cycle d’horloge

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 ISR Mode Handler/ Niveau «Privileged» Non autorisé

Exécution d’un programme Mode Thread/ Niveau «privileged» Mode Thread/ Niveau «Unprivileged »
autre qu’un ISR

Tableau 1 : Combinaisons possibles « mode Cortex/ niveau du privilège du code »

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

1. Au démarrage du système (après reset), le Control[I]=1


bit control [I] = 0 et par conséquent toutes 4
Control[I]=0
les parties code ont le niveau « Priviliged »
par défaut. Ainsi on est dans le mode 2 2
Thread/ niveau Privileged
2. A la suite d’une interruption, le Cortex-M3 Retour d’Int Retour d’Int Interruption
passe directement en mode Handler/niveau 2
Privileged. A la fin du Handler, il retourne
Interruption 1
au mode Thread avec le niveau de privilège
initial (avant Handler)
Control[I]=1
3. Un programme ayant le niveau Unprivileged
UnPrivileged/ Privileged/
n’a pas le droit d’accéder au registre de
Thread Mode Thread Mode
contrôl et ne peut en aucun cas changer le
Non autorisé 3
niveau de privilège
4. Un programme ayant le niveau Privileged Transition par hardware
peut changer le niveau de privilège des
codes exécutés en mode Thread, en Transition par software
modifiant l’état du bit de control [I]

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 :

Les registres à usage général


─ R0 – R12 : 12 registres de 32 bits à usage général qui peuvent être utilisés pour
l’exécution de n’importe qu’elle opération (arithmétiques, logiques, transfert)
─ R13 : il s’agit du registre de pile (Stack Register). En effet, étant donné que le Cortex-M3
utilise deux piles (Pile principale et pile process), il s’agit de deux registres
matériellement distincts, mais superposés dont l’accès est contrôlé par le mode opératoire:
• MSP (Main Stack Pointer) : registre de pile principal qui est utilisé quand des applications
ayant le niveau «Privileged» sont exécutées
• PSP (Process Stack Pointer) : registre de pile de processus qui est utilisé quand des
applications ayant le niveau «Unprivileged» sont exécutées
─ R14 : il s’agit du registre de lien (LR : Link register) qui permet de stocker l’adresse de
retour quand une fonction ou routine est appelée.
─ R15 : il s’agit du registre compteur programme (ou Program Counter) qui indique
l’adresse de la prochaine instruction à exécuter par le processeur. 136
Architecture Cortex-M3
3. les Registres
Les registres spéciaux :
• PSRs (Program Status Registers) : Registres de statut du programme qui sont
au nombre de 3 :
– ASPR (Application PSR) : registre d’état relatif à l’exécution du programme
– ISPR (Interrupt PSR) : registre d’état relatif à l’interruption en cours
– ESPR ( Execution PSR) : registre d’état qui donne des informations sur l’instruction
en cours (mode thumb ou ARM et si elle est atomique) .
Ces trois registres 32 bits peuvent être accédés séparément ou bien être superposé
pour construire un registre unique de 32 bits : xPSR

137
Architecture Cortex-M3
3. les Registres

Chaque champ de ce registre donne une information selon le tableau suivant :

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

• Registres de masque d’interruption : on distingue 3 registres qui sont :


– PRIMASK : Registre de 1 bit qui permet, s’il est actif, d’interdire toutes les
interruptions sauf l’interruption non masquable (NMI) et les exceptions dues à
une erreur matérielle (Hardware Fault).
– FAULTMASK : Registre de 1 bit qui permet, s’il est actif, d’interdire toutes les
interruptions à l’exception de l’interruption non masquable (NMI)
– BASEPRI : registre de 8 bits dont la valeur indique, si elle est différente de 0, le
niveau de priorité des interruptions permises : uniquement les interruptions
ayant un niveau de priorité strictement supérieur à cette valeur sont autorisées.
Si cette valeur est égale à 0, alors toutes les interruptions sont permises.

• Registre de Contrôle : un registre de 2 bits


qui indique le niveau de privilège du code
en cours d’exécution ainsi que le registre de
pile utilisé

139
Architecture Cortex-M3
3. les Registres

Les Registres du Cortex-M3

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

0xFFFFFFFC 0xFFFFFFFF 0xFFFFFFFE 0xFFFFFFFD 0xFFFFFFFC

Mot 2 0x00000008

Mot 1 0x00000004 0x00000007 0x00000006 0x00000005 0x00000004

mot 0 0x00000000 0x00000003 0x00000002 0x00000001 0x00000000


Fig a Fig b 141
Cortex-M3
4. Organisation de la Mémoire
Bus Matrix du Cortex-M3

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

Firmware : code nécessaire agissant à très bas


niveau (Driver) et permettant aux applications
d’utiliser le Matériel d’une façon transparente
Espace utilisé pour adresser les périphériques
du Cortex-M3 : Contrôleur d’IT, Timer System
….

Espace utilisé pour adresser les périphériques


ajoutés par les constructeurs de microcontrôleur

Espace utilisé pour stocker les données relatives


au code

Espace utilisé pour stocker le code exécutable.


On peut également stocker des données
144
Cortex M3
5. Fonctionnalités intégrés du Bus Matrix : Bit-Banding &Data Alignement

5. Fonctionnalités intégrées du Bus Matrix : Bit-Banding & Data


Alignement
En plus du multiplexage des bus, le Bus Matrix intègre également d’autres fonctionnalités
: Data Alignement, Bit-Banding
 Accès aux données non alignées (Unaligned Data Access)
Etant donné que l’accès à une mémoire ne se fait que par mot (32bits) correspondant à
une case mémoire, les données stockées devraient être alignées, c.a.d qu’une donnée doit
être placée dans une case mémoire 32 bits quelque soit sa taille.

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

Ainsi, cette relation peut être généralisée comme suit :


• Le bit i (0 <= i <= 31) de la case mémoire occupant l’adresse Bit-Band_Offset
(0 <= Bit-Band _Offset <= 0xFFFC) peut être accédé à travers le mot de la zone
Bit-Band alias ayant l’adresse Alias_Offset :
Alias_Offset = Bit-Band_Offset*32 +i*4

• Pour avoir l’adresse absolue du mot, il suffit d’additionner l’adresse de base de la


zone Alias :
Alias_Adresse = Alias_Base + Bit-Band_Offset*32 +i*4

• Les adresses de base étant données par le tableau suivant :

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

Une fois le processeur est mis sous tension (reset), il :


1. Récupère le contenu de l’adresse offset 0 (@Mstack) et le place dans le
registre R13 qui sert de pointeur sur la pile.
2. Récupère le contenu de l’adresse offset 4, qui correspond à l’adresse de
l’ISR1 (@ISR1 = 1024), et la place dans le registre R15=PC (Program
Counter)  PC = 1024
3. Commence à exécuter le Handler placé à l’adresse 1024 (ISR1 = Reset) et
qui correspond à un code de boot (de démarrage) fourni par la société
ARM et qui permet d’initialiser les registres système et de faire à la fin un
saut vers l’adresse @Main.

A ce point, la séquence de démarrage est finie et c’est le programme utilisateur


(Main) qui va prendre la main pour configurer l’horloge, les interruptions,
etc…

154
Architecture Cortex-M3
7. La gestion des interruptions par le NVIC

7. Gestion des interruption par le NVIC


La gestion des interruption pour les processeurs Cortex-M3, est assurée par le contrôleur
d’interruption NVIC (Nested Vector Interrupt Controller). Le NVIC est étroitement
couplé au noyau du processeur et intègre lui-même un Timer Système : Systick.

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

1 Reset -3 (maximum, figé) Déclenchée quand un signal de reset est détecté


2 NMI -2 (figé) Entrée d’interruption non masquable généralement
connectée au WatchDog
3 Hard Fault -1 (figé) Erreur de matériel pour lequel aucune routine n’a été prévue
4 MemManageFault 0 (paramétrable) Déclenchée en cas d’une tentative d’accès à une zone
mémoire non autorisé
5 Bus Fault 1 ( paramétrable) Générée quand l’interface du bus AHB reçoit une erreur
6 Usage Fault 2 (paramétrable) Déclenchée par une erreur au niveau d’un programme
(exemple : division par 0)
7-10 Réservé Pas utilisée
11 SVCall 3 (paramétrable) Dans le cas d’un appel à un service système
12 DebugMonitor 4 (paramétrable) Déclenchée quand un point de break (ou watch) est atteint
ou bien quand le débogage est activé
13 Réservé Pas utilisée
14 PendSV 5 (paramétrable) Requête de service d’exception
15 SYSTICK 6 (paramétrable) Relative au Timer interne SYSTICK
16 … Interrupt # 0 7 (paramétrable) Il s’agit d’événements déclenchés par les autres
… ………. périphériques externes ajoutés par le fabricant du
157
256 Interrupt # 240 microcontroleur
Architecture Cortex-M3
7. La gestion des interruptions par le NVIC
• Quand une exception autorisée est déclenchée, le CPU commence par
récupérer l’adresse de la routine à exécuter à partir d’un emplacement
mémoire spécifique connu d’avance.
L’ensemble des adresses des routines Adresse Vecteur
relatives aux différents sources 0x00 Adresse de début de la pile principale
d’interruptions forme la table de 0x04 Reset
vecteurs d’interruptions. 0x08 NMI
0x0C Hard fault
• Dans le cas du Cortex-M3, la table
0x10 MemManageFault
de vecteurs d’interruptions commence 0x18 Usage Fault
à partir de l’adresse 0 de la zone code : 0x1C – 0x2B
0x2C SVCall
0x30 Debug Monitor
0x34 Réservé
0x38 PendSV
0x3C STSTICK
0x40 IRQ0
….. ……… 158
Cortex-M3
7. La gestion des interruptions par le NVIC

Parmi les spécificités du NVIC, on cite :


• Une réponse rapide grâce à l’architecture matérielle du NVIC d’une
part et l’utilisation du jeu d’instruction thumb-2 qui permet
d’interrompre l’exécution des instructions multi cycles (load et
store)
• Un temps de réponse (latence) déterministe grâce à l’utilisation de
plusieurs niveaux de priorité. Ceci permet de supporter les
applications temps réel.
• Il est conçu pour être programmé entièrement en langage C sans
être obligé de passer par des instructions ou fonctions écrites en
assembleur.

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

• Il est à noter que si au cours du traitement d’une interruption, une autre


interruption de priorité supérieure est déclenchée, alors les mêmes
étapes sont refaites. Cet enchaînement d’interruptions peut avoir lieu
plusieurs fois, d’où l’appellation nested (en cascade)

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.

00110 001 00001010

Opcode Opérande 1&2 Opérande 3 ADD R1, R1, #10


ADD Registre R1 Valeur R1  R1 + 10

Exemple d’instruction thumb 16 bits


Même si ce format présente un avantage quant à la taille, il ne permet d’utiliser que
8 registres du processeur, et uniquement deux opérandes : puisque le registre R1
joue le rôle de source et destination.

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

COND 00 1 0100 S 0011 1000 110010000

Major Minor Opérande 1 Registre Opérande 2


Opcode Opcode destination
R3 R8 Valeur
ADD
Dans ce cas, le format est un peu plus complexe :
– Le code opératoire est divisé sur deux champs : Major Opcode qui détermine le type de
manipulations à exécuter (transfert, opérations arithmétiques, opérations logiques, …) et
Minor Opcode qui détermine l’opération même (ADD  Major code 00 et Minor code 
0100)
– 2 opérandes : un registre jusqu’à 16 et une valeur immédiate sur 12 bits
– Un registre destination (jusqu’à 16 possibles)
169
Architecture Cortex-M3
8. Instructions Cortex-M3
Pour les autres champs :
– COND : permet de spécifier une condition (qui porte sur les indicateurs d’états fournis dans
le registre xPSR) qui, si elle est vérifiée, autorise le processeur à effectuer l’addition (pour
l’exemple traité précédemment). Sinon le processeur va passer à l’instruction suivante sans
exécuter d’addition.
– S (Set Flag Status) : C’est un bit qui indique si l’instruction doit mettre à jour ou non le
registre d’états. Au niveau de la syntaxe il faut ajouter un S à l’instruction :
• ADDS : le processeur effectue une addition et ensuite met à jour le registre d’états.
• ADD : Le processeur effectue l’opération d’addition sans modifier le contenu du registre d’état.

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:

• Exemple : ADD R1, R1, #10 ; ADD R8, R3, #200


• C’est le compilateur qui doit ensuite décider : si l’instruction peut être codée sur
16 bits alors il va choisir le format 16 bits, sinon il va devoir utiliser un format
32 bits.
• Mais il est possible d’imposer au compilateur de choisir un format précis en
utilisant les suffixes W (Wide : 32 bits) et N (Narrow : 16 bits). Dans ce cas le
compilateur va essayer de coder l’instruction au format choisi. En cas
d’impossibilité, il génère une erreur.
ADD .W (coder l’addition dur 32 bits)
ADD .N (coder l’addition sur 16 bits)
171
Architecture Cortex-M3
8. Instructions Cortex-M3
Le processeur Cortex ayant une architecture RISC, toutes les opérations de
traitements portent sur des registres ou des valeurs immédiates. Uniquement
les opérations de transfert peuvent accéder à la mémoire.
 Instructions de transfert
Instructions Description
MOV Rd, #valeur Rd  valeur
MOV Rd, Rn Rd  Rn
LDRB Rd, [Rn, #offset] Lire un byte de la case mémoire d’adresse Rn + offset
LDRH Rd, [Rn, #offset] Lire 16 bits (Half Word) de la case mémoire d’adresse Rn + offset
LDR Rd, [Rn, #offset] Lire un mot de 32 bits de la case mémoire d’adresse Rn + offset
STRB Rd, [Rn, #offset] Ecrire le byte de poids faible de Rd dans la case mémoire d’adresse Rn + offset
LDRH Rd, [Rn, #offset] Ecrire 16 bits poids faible de Rd dans la case mémoire d’adresse Rn + offset
LDR Rd, [Rn, #offset] Ecrire le contenu de Rd dans la case mémoire d’adresse Rn + offset
Push Rs Transférer le contenu de Rs vers la case mémoire de la pile (@R13-4)
Pop rd Transférer le contenu de la case mémoire de la pile (@R13) vers Rd
172
Architecture Cortex-M3
8. Instructions Cortex-M3
 Instructions Arithmétiques
Instructions Description Exemples
ADD Rd, Rn, Rm Rd  Rn + Rm
ADD Addition
ADD Rd, Rd, Rn Rd  Rd + Rn
ADD Rd, Rd, #valeur Rd  Rd + valeur
Addition with ADC Rd, Rn, Rm Rd  Rn + Rm + Carry
ADC Carry
ADC Rd, Rd, #valeur Rd  Rd + valeur + carry
SUB Rd, Rn, Rm Rd  Rn - Rm
SUB Soustraction
SUB Rd, Rn, #valeur Rd  Rn - valeur
MUL Multiplication 16 MUL Rd, Rd, Rn Rd  Rd*Rn
bits (résultat sur
32bits) MUL Rd, Rn, Rm Rd  Rn*Rm

UMULL Multiplication UMULL Rd1, Rd2, Rn, {rd1, Rd2}  Rn*Rm


32bits non signé Rm
(résultat 64 bits)
SMULL Même chose que MULL, mais pour une multiplication signée (S : signed)

173
Architecture Cortex-M3
8. Instructions Cortex-M3

 Instructions Logiques

Instruction Description Exemples

AND Rd, Rd, Rm Rd  Rd ET Rm


AND ET logique bit à bit
AND Rd, Rd, #valeur Rd  Rd ET valeur

AND Rd, Rn, Rm Rd  Rn ET Rm

ORR OU logique bit à bit Même exemples

EOR XOR bit à bit Mêmes exemples

BIC Rd, Rd, Rn Rd  Rd ET (⌐Rm)


BIC Bits Clear : Mise à zéro
de bits BIC Rd, Rn, #valeur Rd  Rn ET (⌐ valeur)
⌐ étant l’inverse bit à bit

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é NV
GT Signed Greater Than : supérieur signé Z.N.V + N.V
LE Signed Less than or Equal : inférieur ou égal signé Z+NV
AL Always : exécution inconditionnelle
176
Architecture Cortex-M3
8. Instructions Cortex-M3

• Exemple d’utilisation des instructions conditionnelles

Code ‘C’ Code Assembleur

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

• Le programme suivant montre l’utilisation des instructions de saut. Le


programme permet de faire appel à une fonction (10 fois). Un code ‘C’ est
également donné :

Code ‘C’ Code Assembleur

i = 10; MOV R1, #10 ; // Initialiser R1 avec le nombre d’appels (10)


While (i !=0 ) Boucle: CBZ R1, Bouclefin ; // Saut vers Bouclefin (fin itération) si R1 = 0
BL func1 ; // Faire appel à la fonction func1
{ SUB R1, #1 ; // R1  R1 - 1
func1 ( ); B Boucle // Faire un saut vers le label Boucle

} Bouclefin : ……..

179