Architecture des prcesseurs ARM

SE203

Tarik Graba

2023-2024

Introduction

ARM

Modèle Économique

Plusieurs types de licences existent en fonction des besoins des clients:

Familles

Les cœurs historiques ne sont plus supposés être utilisés dans de nouveaux produits, mais on peut encore les rencontrer dans des équipements industriels.

Historiquement ARM ne concevait que des processeurs 32 bits. En 2011, avec l’architecture Armv8-A, ARM propose des cœurs 64 bits applicatifs. Vu les objectifs de ce cours, nous nous limiterons aux cœurs 32 bits.

Produits

Plusieurs fabricants:

En utilisant l’architecture ARM, ces fabricants de composant profitent d’un environnement logiciel commun et mature. Ils évitent ainsi de devoir développer et maintenir un cœur de processeur et des outils logiciels associés.

Leurs produits se différencient par les par les périphériques spécifiques ajoutés autour des cœurs et l’architecture des systèmes.

Microprocesseur/Microcontrôleur

Un processeur

Un processeur

Microcontroleur (MCU:Microcontroller Unit)

Regroupe dans le même circuit:

Un microcontrôleur

Architecture des processeurs ARM (32 bits)

Architecture Load/Store 32 bits

Processeur RISC 32 bits

16 registres

Architecture Load/Store

Architecture Load/Store

Comme les autres processeurs RISC, les processeurs ARM ont une architecture Load/Store. Les données sur lesquelles les calculs sont effectués doivent d’abord être copiées de la mémoire vers les registres internes.

Les instructions de calcul ne peuvent opérer que sur des sonnées déjà présentes dans les registres. Le résultat est aussi stocké dans un registre interne. Seul le contenu d’un registre peut être réécrit en mémoire.

Granularité mémoire et endianess

Endianess

La majorité des processeurs ARM “communs” sont little-endian.

Notez aussi qu’il y a une contrainte d’alignement et que les adresses des mots de 32 bits sont multiples de 4.

Pour certains cœurs (historiques, Cortex-M ou R), il est possible d’avoir des modèles bigendian (pratique pour certaines applications réseau).

Pour certains cœurs (les Cortex-A), il existe des mécanismes pour intervertir l’ordre des octets durant les accès mémoire.

Modèle historique ARM7TDMI

l’ARM7 a été produit entre 1993 et 2001 (source wikipedia).

Premier processeur ARM utilisé dans des téléphones portables

Très proche des processus ARM modernes

Ce processeur a une architecture moderne, tout en étant suffisamment simple et documentée pour présenter le fonctionnement des processeurs ARM.

Aussi, elle permettra de mieux saisir la notion d’Architecture telle qu’utilisée par ARM.

Micro-architecture

Architecture simplifiée d’un ARM7

Le banc de registres est composé de 16 registres (r0 à r15). Le registre pointant vers l’instruction à récupérer en mémoire est le registre r15. Il est appelé PC pour Program Counter.

Le banc de registres possède une entrée et deux sorties. Ceci implique qu’à un moment donné, on peut:

Les sorties du banc de registres vont vers l’ALU (Arithmetic and Logic Unit). Une des entrées passe par un Barrel Shifter ce qui permet d’appliquer des décalages et rotations sur une des entrées de l’ALU.

La mémoire est connectée au processeur par un bus avec:

Comme le bus est partagé pour les instructions et les données, en interne, il est relié au:

De plus, ce cœur de processeur inclue une interface de debug standard (Embeded ICE) permettant la prise de contrôle du flot d’exécution par un développeur logiciel.

Pipeline (3 étages)

Les instructions sont exécutées en 3 cycles d’horloge.

  1. FETCH
  2. DECODE
  3. EXECUTE
Pipline à 3 étages

Pour permettre d’augmenter la fréquence de fonctionnement, chaque instruction est découpée en 3 étapes.

  1. lire l’instruction en mémoire (FETCH),
  2. décoder l’instruction (DECODE),
  3. exécuter l’instruction (EXECUTE).

Comme les ressources nécessaires à ces 3 étapes sont différentes, on peut les utiliser en parallèle pour des instructions différentes.

Ceci s’appelle le Pipeline et permet, théoriquement, d’exécuter une instruction à chaque cycle.

En régime permanent, nous avons l’exécution d’une instruction par cycle (IPC).

Pipeline (stall)

Pipline à 3 étages

Comme l’ARM7 ne possède qu’une seule interface pour accéder aux données et aux instructions, en cas de lecture ou d’écriture, on ne peut pas lire une nouvelle instruction.

Le nombre d’instructions par cycle IPC va donc baisser.

D’autres instructions peuvent produire des ruptures de pipeline, par exemple les sauts dans les programmes qui nécessitent d’abandonner les instructions en cours puisque qu’on va reprendre l’exécution ailleurs dans le code.

Pipeline (exemple)

Cycle 1

Pour cet exemple, on suppose que le programme (la suite d’instructions) commence à l’adresse 0x20000000.

La première étape consiste donc à récupérer cette instruction. On présente donc l’adresse de la première instruction (ici ldr) Cette adresse est contenue dans un registre interne du processeur le compteur programme ou PC.

L’instruction ldr r0,[r8,0x10] demande à lire ce qui se trouve à l’adresse r8+16 dans le registre r0.

Notez qu’en même temps le compteur programme est incrémenté pour préparer la suite.

Pour les processeurs ARM, les adresses des instructions doivent être alignées. C’est-à-dire multiples de la taille de l’instruction en octet (ici 4).

Pipeline (exemple)

Cycle 2

Durant ce cycle, l’adresse de la seconde instruction est présentée. La première instruction est en phase de décodage. On identifie que:

Pipeline (exemple)

Cycle 3

L’adresse de la 3 instruction est présentée. En même temps la deuxième instruction est décodée.

L’exécution de la 1e instruction commence. Comme c’est une lecture en mémoire, on doit d’abord calculer l’adresse. Dans un processeur ARM7, ce calcul utilise l’ALU qui.

Ici, l’adresse est calculée à partir de la valeur du registre r8 et de la valeur 16 qui a été récupérée à partir de l’instruction dans la phase précédente (on parle de valeur immédiate).

Le pipeline est mis en pause (stall) mettant en attente l’exécution des autres instructions.

Pipeline (exemple)

Cycle 4

L’adresse calculée (ici 0x10000010) est présentée sur le bus pour lire la donnée en mémoire.

La donnée sera récupérée à la fin du cycle.

Pipeline (exemple)

Cycle 5

La donnée est écrite dans le registre r0.

Pipeline (exemple)

Cycle 6

Finalement, l’exécution des instructions suivantes peut reprendre.

Ici, l’instruction add r1,r0,r4, lsl #2 calcul la somme entre le contenu de r0 et r4 décalé à gauche de 2 positions.

 

Pipeline (Cliquez pour la version animée)

 

Mode Thumb

Le T du ARM7TDMI veut dire qu’il supporte le mode Thumb.

La réduction de la taille du programme est possible car les instructions les plus communes (celles qu’on rencontre souvent dans un programme) sont favorisées et ont un encodage 16 bits dédié.

Pour les autres, elles doivent être décomposées en une série d’instructions 16 bits.

Mode Thumb2

Pour les architectures modernes, le mode Thumb-2 a été développé.

ARM vs Thumb vs Thumb-2

La figure est tirée de White Paper: An Introduction to the ARM Cortex-M3 Processor. Elle représente les performances et tailles relatives pour le programme de test Dhrystone sur un Cortex-M3. Le document date d’octobre 2006.

Dans les documentations récentes d’ARM ainsi que les outils associés (compilateurs, assembleur…) seul le terme Thumb est utilisé bien que l’encodage puisse être différent en fonction du processeur cible.

Évolutions (ARM9)

Plus sur les détails de l’architecture de l’ARM9TDMI sur le site de référence d’ARM.

Compatibilité logicielle et notion d’Architecture

ARM7TDMI vs ARM9TDMI

Architectures

Architectures des familles de processeurs ARM

Learn the architecture - Introducing the Arm architecture (sur le site d’ARM).

Notez aussi l’existences de:

et les Cortex-A?

Exemple: le Cortex A9

Micro-architecture du Cortex-A9

Cortex-M

Microcontroleurs

Les Cortex-M

Le document suivant donne, de façon synthétique, une description des Cortex-M:

Notez qu’il existe une nouvelle famille de Cortex-M (ARMv8-M) avec des fonctions supplémentaires liées à la sécurité.

Familles

ISA Cortex-M

Exemple Cortex-M4

Cortex-M4

Système sur puce

Structure/Bus/protocole/Carte mémoire

Des périphériques autour du cœur du processeur.

Un Système sur puce (SOC pour System On Chip)

Map mémoire d’un Cortex-M4

Pour les Cortex-M, les plages d’adresses attribuées aux périphériques sont standardisées. Par exemple, le code qui sera exécuté au démarrage est toujours à l’adresse 0.

Aussi, certains éléments du cœur (le contrôleur d’interruption par exemple), sont mappés en mémoire et ont une adresse standard (PPB pour Private Peripheral Bus).

Pour la construction de ces systèmes, ARM a imposé des protocoles de bus. Les cœurs utilisent le protocole AMBA (Advanced Microcontroller Bus Architecture) et sur les microcontrôleurs, on retrouve souvent des modules utilisant les protocoles:

Plus d’informations sur le protocole AMBA sur le site de référence.

Exemple le STM32-L475

Le STM32-L475 est un microcontrôleur avec:

C’est le microcontrôleur que nous utiliseront en TD.

Architecture du STM32L475

Ressources supplémentaires

Retour au sommaire du cours