Composants internes des µP ARMv7
Le CPU des processeurs ARM implémente une architecture légèrement différente de l’architecture générale composée d’une unité de contrôle (CU), d’une unité arithmétique et logique (ALU) et d’une banque de registres. Son architecture correspond plutôt aux trois phases du traitement de l’information, soit une unité de chargement (Prefetch Unit), une unité de décodage (Decode Unit), une unité d’exécution (Execution Unit). Selon les modèles, le CPU intègre également une unité de calcul à virgule flottante (FPU - Floating Point Unit). Cette conception facilite largement l’implémentation de l’architecture Harvard offrant de meilleures performances que l’architecture von Neumann.
Sur les processeurs ARM, le CPU s’entoure généralement de composants supplémentaires :
- Contrôleur d’interruptions (INTC / Interrupt Controller)
- Mémoire cache de 1er niveau (L1) pour les instructions et les données et éventuellement de 2ème niveau (L2)
- Unité de gestion de la mémoire (MMU / Memory Management Unit) ou de protection de la mémoire (MPU)
- Interface de debug et de traçage (DBGI / Debug Interface)
- Unité d’interface du bus µP (BIU / Bus Interface Unit)
Unité de chargement
L’unité de chargement (Prefetch Unit) lit les nouvelles instructions à exécuter. Elle dispose de son propre bus pour le transfert des instructions. Pour les profils A et R, l’unité est connectée à la mémoire centrale du µP par l’intermédiaire d’une mémoire cache d’instructions de premier niveau (L1 I-Cache). Par contre, les µC du profil M ne disposent pas forcément de cette mémoire cache. Dans ce cas, le bus est connecté directement avec la mémoire centrale.
Unité de décodage
L’unité de décodage (Decode Unit) analyse les instructions pour déterminer les opérandes et le type d’instruction avant de les transférer à l’unité d’exécution.
Unité d’exécution
L’unité d’exécution (Execute Unit) effectue les opérations correspondant aux instructions préalablement décodées. Cette unité intègre généralement la banque de registres, l’ALU équipé avec son barrel shifter ainsi que d’une logique pour le transfert des données entre la mémoire centrale et les registres.
Banque de registres
La banque de registres (Register Bank) compte 13 registres à usage général (R0 à R12), 3 registres à usage dédié (R13 à R15) et 1 registre d’état du programme (APSR). Le jeu d’instructions Thumb (codé sur 16 bits) ne permet l’accès qu’aux huit premiers registres (Low General Purpose Registers). L’accès aux treize premiers registres n’est possible qu’avec les jeux d’instructions Thumb-2 et ARM.
Le registre R13 (SP - Stack Pointer) pointe sur le sommet de la pile
utilisée pour l’appel de fonction. Le registre R14 (LR - Link
Register) contient l’adresse de retour lors d’appel d’une fonction. Le
registre R15 (PC - Program Counter) pointe sur l’instruction à
exécuter. Selon le mode d’opération du processeur (application,
exception, etc.), le registre PSR (Program Status Register) contient
des champs de bits différents. En mode application, mode dans lequel les
applications utilisateur s’exécutent, le registre se nomme APSR
(Application Program Status Register). Il contient principalement
quatre fanions de conditions (flags) résultant des opérations
arithmétiques et logiques.
Le fanion Z (Zero) indique que l’opération a donné un résultat nul. Le fanion C (Carry) indique un dépassement de capacité (report) résultant d’une opération mathématique sur des nombres non signés, tandis que le fanion V (oVerflow) l’indique sur des nombres signés. Le fanion N (Negative) indique que le nombre contenu dans le registre est négatif. Lors de branchements conditionnels, le µP évalue ces fanions afin de décider du branchement à effectuer.
À ces quatre fanions principaux s’ajoutent encore le fanion Q (Sticky Overflow) indiquant un dépassement de capacité lors de calculs arithmétiques saturés et les fanions GE (Greater than Equal). Ces derniers flags ne sont disponibles que si le processeur dispose d’une unité de calcul à virgule flottante.
ALU
L’ALU (Arithmetic and Logical Unit) exécute les opérations arithmétiques et logiques sur deux opérandes. Il place ensuite le résultat de l’opération dans un troisième registre (Rd) et met à jour les fanions dans le registre APSR.
Le premier opérande, contenu dans un registre (Rn) est envoyé directement à l’ALU. Le deuxième opérande, nommé opérande à décalage (Sop - Shifter Operand) passe d’abord à travers un barrel shifter. Elle peut venir soit du contenu d’un registre (Rm) ou d’une valeur immédiate (une constante).
Barrel shifter
Le barrel shifter est un circuit à logique combinatoire. Ce circuit est capable d’effectuer une rotation vers la gauche des bits contenus dans un registre sans logique séquentielle. La figure ci-dessous donne un exemple de barrel shifter pour des mots de 4 bits.
Le décodeur détermine, en fonction du décalage souhaité (le nombre de bits), la ligne à activer. Les portes placées sur la ligne activée se ferment et placent les bits d’entrée (Ex) sur les bits de sortie (Sx) correspondants. Le décalage s’effectue en 1 cycle d’horloge.
Unité de calcul à virgule flottante
La FPU (Floating Point Unit) est une unité optionnelle de calcul à virgule flottante. Elle existe en différentes variantes offrant plus ou moins de fonctionnalité, calcul sur les nombres réels à virgule flottante selon le standard IEEE754, calcul vectoriel avec des opérations avancées SIMD, traitement de signal avec des opérations DSP (Digital Signal Processing).
Contrôleur d’interruptions
Le INTC (Interrupt Controller) est un contrôleur pour le traitement des interruptions. Le CPU ne disposant que de très peu de lignes pour recevoir les requêtes d’interruptions levées par les contrôleurs de périphériques d’entrées/sorties. Alors, l’INTC priorise les requêtes, indique la source d’interruption, c’est-à-dire l’identité du contrôleur ayant levé l’interruption, et signale la requête au CPU.
Mémoire cache
La mémoire cache ou antémémoire est une mémoire très rapide placée entre la mémoire centrale et le CPU. Elle stocke temporairement les données afin d’accélérer leurs accès et d’augmenter ainsi les performances du processeur. Selon les processeurs et leur profil, la mémoire cache s’implémente sur 1, 2 voire 3 niveaux.
Le niveau 1 (L1 - Level 1) est le plus rapide, mais de taille relativement faible, de quelques KiB à quelques dizaines de KiB. Les µP l’utilisent en deux exemplaires. Le premier stocke les instructions (i-cache), tandis que le deuxième stocke les données (d-cache). Deux bus indépendants connectent ces mémoires caches au CPU, le premier avec l’unité de chargement et le deuxième avec l’unité d’exécution.
Si une mémoire cache de niveau 2 (L2 - Level 2) équipe le processeur, elle sert d’interface entre les mémoires caches de 1er niveau et la mémoire centrale. Sa taille varie entre quelques centaines de KiB à quelques MiB. Elle peut également stocker temporairement les données de la FPU si le CPU en dispose d’une. Les processeurs multi-cœurs l’utilisent pour l’échange de données entre les cœurs.
Le niveau 3 (L3 - Level 3) est plus rare et se situe généralement à l’extérieur de la puce du processeur.
Unité de gestion/protection de la mémoire
La MMU (Memory Management Unit) a pour fonction la gestion de la mémoire. Elle équipe tous les processeurs du profil A. Elle offre aux OS une virtualisation de l’espace mémoire, c’est-à-dire elle convertit les adresses virtuelles en adresses physiques. Elle contrôle les accès à la mémoire centrale et aux registres des contrôleurs de périphériques d’entrées/sorties. Elle interagit également avec la mémoire cache afin de l’informer si les données peuvent être placées dans son antémémoire.
La MPU (Memory Protection Unit) a pour fonction la protection des accès à la mémoire. Elle équipe les processeurs des profils R et M.
Interface de debug
Le développement d’applications logicielles exige la mise en œuvre d’outils pour déboguer, tester et valider le bon fonctionnement du programme. Les processeurs ARM offrent deux interfaces à cet effet , le debug interface et le trace interface.
L’interface de debug (SWJ-DP - Serial Wire JTAG Debug Port) propose
deux interfaces à choix, le JTAG (Joint Test Action Group) et le SWD
(Serial Wire Debug). Via les unités Run Control
, Breakpoint
et
Memory Acces
, ces deux interfaces offrent la fonctionnalité suivante:
- Démarrer et arrêter le programme
- Déboguer pas à pas (Single Step)
- Placer des points d’arrêt (Breakpoint) à la volée
- Lire/écrire le contenu de mémoire et des registres des contrôleurs de périphériques à la volée
- Programmer la mémoire Flash (interne et externe)
L’interface de traçage (ETM - Embedded Trace Macrocell) fournit une interface à haut débit pour le traçage des instructions. Cette interface offre la fonctionnalité suivante:
- Déboguer des historiques de séquences d’événements
- Profiler le logiciel et optimiser les algorithmes (Profiling)
- Analyser la couverture du code (Code Coverage)
Les nouvelles générations de processeurs du profil A implémentent également une unité pour monitorer les performances des applications (PMU - Performance Monitoring Unit). Cette unité dispose d’une série de compteurs capables de collecter différents événements du processeur, tels que le nombre de cycles d’horloge, d’instructions exécutées, d’accès à la mémoire cache, etc. Grâce à ces compteurs, il devient possible d’analyser le comportement d’applications complexes afin de trouver par exemple les goulots d’étranglement (bottleneck).
Unité d’interface du bus µP
L’unité d’interface du bus µP (BIU) connecte le CPU et ses composants avec la mémoire centrale et les contrôleurs de périphériques d’entrées/sorties. L’implémentation de cette unité dépend du processeur et de son profil.
Profil M
Le processeur ARM Cortex-M4F basé sur le profil M, est un µC. Equipé d’une mémoire SRAM et d’une mémoire NOR-Flash, ce µC ne nécessite aucune mémoire supplémentaire pour stocker et exécuter les applications. Afin de réduire la taille du code, ce µC ne propose que les jeux d’instructions Thumb et Thumb-2.
Le NVIC (Nested Vectored Interrupt Controller), conçu pour un traitement des interruptions directement en C, peut connecter jusqu’à 240 sources d’interruptions différentes. Ce contrôleur peut également réveiller le µC, si celui-ci se trouve en mode veille à très faible consommation.
La BIU servant d’interface entre le CPU, la mémoire centrale et les contrôleurs de périphériques d’entrées/sorties implémente trois interfaces AHB (Advanced High-performance Bus), soit I-Bus, D-Bus et S-Bus, ainsi qu’une interface APB (Advanced Peripheral Bus), soit PP-Bus. Le CPU charge le code via le I-Bus (Instruction Bus), le transfert des données passe par le D-Bus (Data Bus), tandis que les données contenues dans les registres des contrôleurs de périphériques d’entrées/sorties transitent par le S-Bus (System Bus). Le PP-Bus (Private Peripheral Bus) sert quant à lui à accéder les registres de ses contrôleurs internes (internes au CPU).
Une matrice interconnecte l’unité centrale de traitement (CPU) et les DMA (Direct Memory Access) avec les périphériques (Flash, RAM, I/O). Cette matrice offre un transfert non bloquant, c’est-à-dire si le CPU charge une instruction de la Flash et un écrit une donnée dans la RAM et qu’un DMA transfère des données avec des périphériques, toutes ces opérations peuvent s’effectuer simultanément.