Vous êtes sur la page 1sur 339

Programmation des systmes

Enseignant: Pierre Leone


Assistant: Kasun Samarasinghe
Moniteur: Laura Juan Galmes

Contacts:

x@unige.ch

1
Plan du cours
Systmes informatiques et programmation
en assembleur
lments des systmes informatiques
Etude du jeu dinstruction dun
microcontrleur (ARM7TDMI)
Programmation dune gameboy advance

2
Evaluation
Un examen oral la fin de lanne
Ou
Deux contrles continus au cours de lanne, si le premier contrle
continu est rendu, la moyenne des deux compte comme la note de
lexamen oral

Les travaux pratiques sont nots

La note finale est la moyenne pondre de lexamen (oral ou cc) et de


la note obtenu aux exercices

Les notions abordes aux exercices font partie du champ pour


lexamen oral ou les contrles continu.
3
1re partie
Programmation assembleur
Systmes informatiques:

Les composants principaux dun ordinateur (systme informatique) sont

1. Le processeur
2. La mmoire
3. Les priphriques

Ces lments constituent un systme, ils interagissent pour raliser


une fonction. Gnralement ils utilisent un ou plusieurs bus pour
changer des informations. On distingue
1. Le/les bus de donnes
2. Le/les bus dadresses
3. Le/les bus de contrle
4
Les bus
Physiquement: des pistes lectriques
Sur chaque piste un signal peut-tre prsent ou non. Un signal prsent
est interprt comme un 1 (logique) et un signal absent comme un 0
(logique).
Gnrateur de tension

U [V] Selon la position de linterrupteur


On mesure 0 [V] Volts
Ou
On mesure U [V]

5
Les bus

U [V] On mesure 0 Volt,


Un 0 logique

U [V] On mesure U Volt,


Un 1 logique

6
Les bus
Les interrupteurs sont raliss avec des transistors. Un exemple de
sortie est (dpend de la technologie, CMOS, bipolaire, ) :

U[V]

Logique
de
contrle

U[V] le transistor conduit et la sortie est a U[V] (=1 logique)


Sinon le transistor ne conduit pas et la sortie est a 0[V] (=0 logique)
7
Les bus

0
Processeur 1
Bus . Suite de
Priphrique . Bits
mmoire 1
1 (binary digits)

8
Les bus
Linformation transfre par les bus est de type binaire, cest--dire une
suite de bits. Tous les traitements internes sont bass sur le traitement
de ces suites de bits.
Les suites de bits codent linformation
Linformation est traite (fonctions) avec des circuits logiques, portes
et, ou, nand,

Les interrupteurs sont raliss par des transistors


Il existe diffrentes technologies pour raliser ces transistors, on choisit
selon certains critres:
Vitesse de commutation (performance)
Consommation
Taux dintgration (nombre de transistor par mm^2)

9
Les bus
On peut rsumer les diffrentes fonctionnalits des bus

Bus dadresse: permet de spcifier llment concern par le transfert,


un priphrique particulier (un registre dun priphrique particulier),
une position de la mmoire externe, Chaque lment
constituant le systme informatique est dsign par une
adresse ou une plage dadresses

Bus de donnes: assure le transfert des informations (donnes) entre


le processeur et les priphriques

Bus de contrle: les signaux de ce bus permettent de valider les


signaux qui se trouve sur les autres bus, par exemples ladresse qui
se trouve sur le bus dadresse maintenant est valide, on dsire
raliser un cycle de lecture/criture

10
schmatiquement

processeur mmoire

Bus de donnes
Bus dadresse
Bus de contrle

Priphrique #1
11
Les bus
Il existe beaucoup de standard diffrents qui dfinissent des bus.

Le bus PCI Peripheral Component Interconnect, cest le bus utilis par


les processeur de la famille Intel x86
AMBA un bus pour les applications embarques utilis par le
processeur ARM7
Les bus ISA, MCA, EISA, les anciens bus x86
Le bus AGP Accelerated Graphics port est un bus optimis pour les
transferts dimages et de son (signal vido)
Des bus optimiss pour les environnement industriels

12
Processeur
Le processeur est le composant dun ordinateur qui excute les
programmes, cest--dire
Excute des instructions, lensemble des instructions (machine)
excutables constitue le jeu dinstruction du processeur.
Effectue des oprations sur les donnes, par exemple des
oprations arithmtiques (addition,), des oprations sur les
adresses pour retrouver les donnes en mmoire (pour permettre la
gestion des tableaux de donnes, des pointeurs,), des
comparaisons.

abrviation CPU: Central Processing Unit

13
Processeur
Historiquement on distinguait les processeurs et les
microprocesseurs, ce dernier faisant rfrences aux processeurs
implants sur un unique circuit intgr (chip). Actuellement, ces termes
sont utiliss sans distinctions.

On parle de microcontrleur pour dsigner un circuit qui intgre un


processeur ainsi que les priphriques dentres-sorties, de la
mmoire, des timers, de convertisseurs A/D ou D/A, etc. Les
microcontrleur permettent de dvelopper des ordinateurs ddis des
applications particulires (systmes embarqus, tlphonie,
automobile) en rduisant les cots (grce lintgration dlments sur
un mme circuit).

14
Processeurs structure
Les lments principaux dun processeur sont:

Lunit dexcution
Lunit de commande (control unit)
Lunit de gestion des bus (entres-sorties)
Des registres usage gnral

15
Lunit dexcution
Est compose principalement de:
Lunit arithmtique et logique (ALU Arithmetic and logic unit)
Effectue les oprations arithmtique (addition, soustraction,..)
Effectue les test (galit, plus grand,)
Effectue les oprations logique (et, ou, )

Ou encore
Lunit de calcul en virgule flottante (FPU Floating point unit)
Effectue les calculs complexes non pris en charge par lALU.
Cette unit peut-tre externe au processeur

Quelque fois cette unit est considre comme un priphrique

16
Lunit de commande
Un squenceur ou bloc logique de commande synchronise
lexcution des instructions, gre les signaux de commande.

Un dcodeur qui identifie linstruction excuter et informe le


squenceur

Un compteur ordinal (PC program counter) cest un registre ddi


qui pointe gnralement sur ladresse de la prochaine instruction
transfrer de la mmoire vers le processeur (cest gnralement
diffrent sil y a un pipeline)

17
Lunit de gestion des bus
Des registres pour les instructions courantes
Un registre dinstruction qui contient linstruction excuter
Un registre dadresse qui est connect au bus dadresse externe
et qui permet la slection dun priphrique externe (mmoire)
Un registre de donne qui est connect au bus de donnes
externe et permet le transfert de donne entre le processeur et les
circuits externes

Lunit de gestion des bus, ou des entres-sorties soccupe de


gnrer les signaux pour accder aux priphriques tels que la
mmoire externe, UART,
Utilise des registres pour mmoriser linformation dpose sur les bus.

18
Les registres
Les registres constituent une petite zone mmoire (de lordre dune
dizaine de mots). Ils sont internes aux processeurs, gnralement
utiliss par lunit dexcution comme oprande source et destination
des instructions.

Leur accs est trs rapide, beaucoup plus rapide quun accs en
mmoire externe et cest la raison pour laquelle on prfre les utiliser
comme oprande plutt que des mots qui se trouvent en mmoire
externe.

19
Schmatiquement B
u
s
A[31:0], bus adresse externe
d
e
Registre dadresse Dcodeur c
dinstruction o
PC n
Logique t
Registres r
de contrle
Usage gnral
PC (program counter) l
Registre dtat e

e
x
t
e
Registre dinstruction r
ALU n
Lecture/criture des donnes e

D[31:0] bus de donnes externe 20


Microcontrleur
Quelques lments intgrs dans un microcontrleur (en plus du
processeur qui forme le cur du circuit)
Priphriques pour la communication:
UART, Universal Asynchronous Receiver Transmitter
(transmetteur/rcepteur asynchrone universel)
Ports srie
..
Mesure et activateurs:
Des timers (horloges) pour les contraintes temps rel
Des actuateurs pour commander des moteurs lectriques, typiquement
PWM Pulse Width Modulation (modulation de la largeur d'impulsion)
Ressources logiciel adaptes:
Systme dinterruption performant, plusieurs niveaux de priorits
Instructions conditionnelles
Des instructions de manipulation des bits pour accder aux
priphriques
21
Microcontrleur
Convertisseur analogique/digital
Ralisation de systmes de mesure

Jeu dinstruction spcialis pour le traitement des signaux


Fonctions DSP (Digital Signal Processing)

En revanche, les systmes dispose gnralement de


Peu de mmoire
Pas de disque, etc.
Performances modestes (pas toujours!) en MIPS (millions dinstructions
par secondes)

22
Systmes embarqus
Un domaine dapplication important des microcontrleur est le domaine
de systmes embarqus.
Systmes de freinage dans les vhicules
Les tlphones portables
Les assistants personnels
Systmes de mesure
Camras numriques
Connexion Internet sans fils

Ces systmes sont souvent des systmes Temps Rel, cest--dire
des systmes pour lesquels les contraintes temporelles sont
importantes.
1. Les donnes sont traites immdiatement et non en diffr
2. Le temps de rponse du systme une sollicitation doit tre fix
(au moins born) et dterministe

23
Systmes embarqus
On peux caractriser ces systmes par les contraintes quil doit
satisfaire. En gnral, la puissance de calcul nest pas le critre le plus
important dun tel systme. Des critres classiques sont

Lencombrement physique, do un besoin dintgr le plus de fonctions


possible sur un mme circuit
La consommation dnergie
La tolrance aux pannes, dveloppement de systme fiable.

24
La mmoire - notation
La mmoire est un dispositif qui permet denregistrer, de conserver et
de restituer des informations codes en binaire.

La notation binaire permet de coder des nombres en utilisant 2 pour


base. Les nombres sont cods par une suite de bits dont la valeur et
0 ou 1.
Par exemple la suite 1 1 0 0 1 permet de coder le nombre

1*2^4 + 1*2^3 + 0*2^2 + 0*2^1 + 1*2^0


cn ; cn 1 ; : : : ; c1 ; c0
Dun manire gnrale la suite de bits code le
nombre
P
cn 2 + cn 1 2
n n 1 + : : : + c1 2 + c0 = n ci 2i
i= 0
25
La mmoire - notation
On utilise la notation hexadcimal pour condenser lcriture. Par
exemple pour noter une suite de 8 bits (byte) on groupe les bits par 4 et
pour chaque groupe on crit sa valeur en utilisant les symboles 0, 1,
,9, A, B, , F.

0 1 2 3 4 5 6 7 8 9 A B C D E F

0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

1re ligne: notation hexadcimale


2me ligne: notation binaire
3me ligne: notation dcimale
26
La mmoire - notation
Par exemple: 1011001101010010001111110001

1011 0011 0101 0010 0011 1111 0001


B 3 5 2 3 F 1

Que lon crit: 0xB3523F1

27
La mmoire
Les informations sont repres par des adresses

Les informations peuvent tre organise par


Byte, groupe de 8 bits (par ex. un caractre)
halfword, groupe de 16 bits (par ex. un entier)
word, groupe de 32 bits (par ex. un pointeur)
La valeur code sur 8bits
(1byte) stocke
Par Byte: 0x00 0xBC Ladresse 0x00
0x01 0x01
0x02 0xFF

0x03 0xFC

Les adresses 0x04 0x25


0x05 0xD2

0x06 0x10
28
La mmoire
Organise par halfword: Un halfword = 2bytes = 16 bits

0x00 0xBC3A
0x02 0x1A2C
0x04 0x332D
Les adresses 0x4ADD
0x06
Sont toujours paires
0x08 0x0000

0x0A 0x0000

0x0C 0xFFFF

29
La mmoire
Organise par mots de 32 bits (word)

0x00 0xBC3AAA31
0x04 0x1A2CCFFF
0x08 0x332D4321
Les adresses
Sont toujours divisibles 0x0C 0x4ADD3320
Par 4 0x10 0x00000000

0x14 0x0000FFFF

0x18 0xFFFFFFFF

30
La mmoire
Les adresses des halfword doivent tre divisible par 2
Les adresses des mots de 32 bits (word) doivent tre divisible par 4

En gnral lorsquon crit un byte on crit le bit le plus significatif


gauche 1000 = 1*2^3=8

Lorsque lon crit un mot de 32 bits, par exemple 0x4A3B2C1D les


chiffres gauche sont les plus significatifs.

Lorsque les mots de 32 bits sont crits en mmoire on a gnralement


deux possibilits

31
La mmoire
Big-endian (big end first): Les bytes sont ordonns en mmoire tel que les
bytes les plus significatifs possdent les adresses les plus petites

0x0D 0x0E 0x0F

0x0C 4A 3B 2C 1D
0x10

little-endian (little end first): Les bytes sont ordonns en mmoire tel que les
bytes les moins significatifs possdent les adresses les plus petites
0x0D 0x0E 0x0F

0x0C 1D 2C 3B 4A
0x10
32
La mmoire
processeur
Un mot mmoire
c
d a o 1 bit
o d m
n r m
n e a
n
s
d
e s e
s e s
s
e
l
e
Active la mmoire c
t
i
o
n

Lecture/criture Tampon dentre sortie

33
Les diffrents types de mmoire
On peux classer les diffrents types de mmoire par la capacit de
stockage quils permettent. Les mmoires la capacit la plus limit
sont aussi celles qui sont accessibles le plus rapidement.

La mmoire de travail, cest la mmoire qui est accde durant


lexcution dun programme. Elles doivent tre accessible rapidement
pour permettre une excution performante du programme. Il sagit des
registres internes du processeur, de la mmoire cache, de la mmoire
externe, de la mmoire morte. Vitesse daccs, taux dintgration

La mmoire de stockage, permet de conserver dimportante quantit


de donne, ce sont les mmoires de masses comme les disques
magntiques, ou les CD. Capacit

34
Temps daccs ordre de
grandeur
1. Les registres internes, laccs le plus rapide, la capacit la
plus faible
2. La mmoire cache, 6-35 ns pour lire/crire un mot (150-30
MHz)
3. La mmoire centrale, 35-120 ns
4. Disque durs, 10-20 ms

La mmoire cache est gnralement une mmoire qui est plus rapide
que la mmoire centrale (capacit plus faible car plus chre) et est
utilise pour dupliquer les informations souvent accdes (en mmoire
centrale) pour diminuer les temps daccs.

35
Les mmoires vives
Appeles aussi mmoire RAM (Random Access Memory) ce sont les
mmoires que lon peux accder en lecture et en criture.

Elles sont gnralement volatiles, cest--dire que les informations


sont perdues lorsque le circuit nest plus aliment.

Le temps daccs est faible et elles sont utilises comme mmoire


cache ou centrale

36
Les mmoires vives
Statiques, SRAM Static Random Access Memory
6-15 ns, permettent de conserver linformation sans
Alimentation, chre souvent la mmoire cache (faible capacit)
Les mmoires
vives DRAM, Dynamic Random Access Memory
60 70ns
Dynamiques SDRAM, Synchronous DRAM

RDRAM, Rambus DRAM


5-10 ns

VRAM, WRAM, SGRAM


Mmoire usage spcifique,
Par exemple pour la vido

37
Les mmoires mortes
Appeles aussi ROM (Read Only memory), elles ont lavantage de
conserver linformation mme lorsque le circuit nest plus aliment.

Elles sont utilises pour stocker le logiciel de dmarrage du systme


(ordinateur) qui sappelle aussi programme boot.

processeur Mmoire Mmoire Contient le programme


vive morte Dinitialisation du
MOV r0,r0,LSL#1 Systme.
ADD r0,r3
.

Une des fonctions du programme de boot sur un ordinateur est de dmarrer


le systme dexploitation qui se trouve mmoris sur le disque dur 38
Les mmoires mortes
ROM (Read Only Memory) linformation est stocke mme sans
alimentation du circuit, on peut crire une seule fois au moment de
la fabrication. Est limit aux grandes productions.
PROM (Programmable ROM), comme une Rom on peut crire une
seule fois avec une machine spciale, utilis pour les petites sries
ou en laboratoire.
EPROM, (Erasable PROM), une PROM effaable au moyen dun
faisceau ultraviolet, petites sries ou dans la phase de mise au
point les oprations (d-)programmation tant longues.
EEPROM, une EPROM effaable lectriquement, cest--dire par
programme
Flash, EEPROM limit environ 100 000 programmation, prix
encore lev mais pourrait remplacer les disques durs.

39
Les priphriques
Le systme processeur + mmoire est le systme fonctionnel
minimum. Pour pouvoir accder lextrieur on utilise les
priphriques.

On distingue priphriques interne ( lordinateur):


Carte vido
Carte son

Les priphriques externes ( lordinateur):


cran
Clavier
Souris

40
Les priphriques
En gnral les priphriques possdent des registres que lon accde
de la mme manire quon accde la mmoire. En crivant les valeurs
adquates dans ces registres on active/dsactive le priphrique.

Par exemple. Un port parallle simplifi


Les 32 bits accessibles
lextrieur

processeur
Ce registre possde une
0xFFFF0000
adresse, on crit un mot
de 32 bits cette adresse
le contenu du registre
est recopi sur un port
externe
41
Les priphriques
Gnralement les priphriques sont directement pilots par le
processeur (do le nom de driver ou pilote pour le logiciel qui contrle
un priphrique).
Par exemple, pour imprimer un fichier le processeur doit transfrer les
donnes en mmoire centrale puis de la mmoire centrale
limprimante en utilisant les bus externes.
Certains priphriques sont capables de prendre en charge ces
transferts de donnes de la mmoire centrale vers un priphrique qui
va seffectuer en parallle lexcution du programme par le
processeur. Ces priphriques sont identifis sous le nom de DMA,
Direct Access memory.

42
Priphrique
Les units dchanges
Par Units dchanges, on dsigne les priphriques dentre/sortie qui
permettent donc dchanger de linformation entre les composants
internes du systmes informatique et lextrieur.
Bus de contrle
read
write
Bus de donnes 8 bits

signaux de
slection imprimante
slection

des circuits
Mmoire Mmoire unit
S1 ROM S2 RAM S3 dchange

Bus dadresses
A0
A1
A2
.
. 43
.
A10
Espace dadressage
Sur le schma prcdent:
le bus de donne est partag par tous les lments extrieurs
(mmoire et priphrique) pour permettre le transfert de donnes
depuis le processeur vers tous les circuits.

Le bus dadresse est sur 11 bits, A0, A1, , A10.


Pour les circuits mmoires ont utilise les 8 bits A0, , A7, les
mmoires ont donc une capacit de 2^8 mots de 8 bits (byte).

Lunit dchange utilise uniquement les bits A0, A1 et A2 on peut donc


accder au plus 8 byte (registres)

44
Espace dadressage
On utilise trois signaux S1, S2, S3 qui sont gnrs par lunit de
slection pour dsigner le circuit parmi les trois qui doit prendre en
compte le transfert. Cest--dire le circuit qui est destin les donnes
ou qui doit fournir les donnes.

La slection des circuits se fait en utilisant les lignes dadresses A8, A9


et A10. On dcide par exemple dactiver
S1, soit la mmoire ROM si A8=0, A9=0, A10=0
S2, soit la mmoire RAM si A8=1, A9=0, A10=0
S3, soit lunit dchange si A8=0, A9=1, A10=0
IMPORTANT:
Tout ca pour obtenir que depuis le processeur on accde
La mmoire ROM aux adresses de 0x000 0x0FF
La mmoire RAM aux adresses de 0x100 0x1FF
Lunit dchange aux adresses de 0x200 0x207

45
Espace dadressage
On considre par exemple un processeur qui dispose de 16 lignes
dadresses
0x0000
0x0000
0x0001 Priphrique #1

0x000A
Les registres

0x0000

Priphrique #2

0x001F

0xFFFD
0xFFFE
0xFFFF
Lors de la conception du systme
on assigne une adresse aux registres
des priphriques dans lespace adress
Adressable par le processeur 46
par le processeur
Exemple
Memory Map
General Internal Memory
0000:0000-0000:3FFF BIOS - System ROM (16 KBytes)
0000:4000-01FF:FFFF Not used
0200:0000-0203:FFFF WRAM - On-board Work RAM (256 KBytes) 2 Wait
0204:0000-02FF:FFFF Not used
0300:0000-0300:7FFF WRAM - In-chip Work RAM (32 KBytes)
0300:8000-03FF:FFFF Not used
0400:0000-0400:03FE I/O Registers
0400:0400-04FF:FFFF Not used
Internal Display Memory
0500:0000-0500:03FF BG/OBJ Palette RAM (1 Kbyte)
0500:0400-05FF:FFFF Not used
0600:0000-0617:FFFF VRAM - Video RAM (96 KBytes)
0618:0000-06FF:FFFF Not used
0700:0000-0700:03FF OAM - OBJ Attributes (1 Kbyte)
0700:0400-07FF:FFFF Not used

47
Exemple
External Memory (Game Pak)
0800:0000-09FF:FFFF Game Pak ROM/FlashROM (max 32MB) - Wait State 0
0A00:0000-0BFF:FFFF Game Pak ROM/FlashROM (max 32MB) - Wait State 1
0C00:0000-0DFF:FFFF Game Pak ROM/FlashROM (max 32MB) - Wait State 2
0E00:0000-0E00:FFFF Game Pak SRAM (max 64 KBytes) - 8bit Bus width
0E01:0000-0FFF:FFFF Not used
Unused Memory Area
1000:0000-FFFF:FFFF Not used (upper 4bits of address bus unused)

48
Cycle de lecture B
u
Ladresse prsente sur le bus s
est ladresse dune instruction A[31:0], bus adresse externe
d
e
Registre dadresse Dcodeur c
dinstruction o
PC n
Logique t
Registres r
de contrle
Usage gnral
PC (program counter) l
Registre dtat e

e
x
t
e
Registre dinstruction r
ALU Lecture/criture des donnes n
e

D[31:0] bus de donnes externe


Linstruction excuter est fournie au processeur par 49
Le bus de donnes
Cycle de lecture

Dans un Ladresse
registre processeur slection mmoire
0xDD30003F S1 0xDD30003F 0x0000FF04

0xDD30003f Bus de donnes


Bus dadresse 0x0000FF04
Bus de contrle

50
Cycle de lecture
on peux dcomposer un cycle de lecture
1. Le processeur dpose ladresse sur le bus dadresse
2. En utilisant ladresse ou un signal ddi le circuit mmoire est
slectionn, ce qui lui indique quil doit prendre en charge le transfert
(bus de contrle)
3. Le circuit mmoire dpose sur le bus de donne la donne qui se
trouve ladresse
4. Le processeur saisit la donne et libre les bus pour le prochain
transfert

La donne peut tre une information telle que la valeur dune variable,
un pointeur, etc. mais aussi la prochaine instruction excuter.

Un cycle de lecture est un cycle pendant lequel la donne est


transfre depuis le priphriques/la mmoire vers les registres
internes du processeur

51
Cycle dcriture

Dans un Ladresse
registre processeur mmoire
0xDD30003F 0xDD30003F 0x0000FF04

0xDD30003f Bus de donnes


Bus dadresse 0x0000FF04
Bus de contrle

52
Cycle dcriture
on peux dcomposer un cycle dcriture

1. Le processeur dpose ladresse sur le bus dadresse ainsi


que la donne crire
2. En utilisant ladresse ou un signal ddi le circuit mmoire
est slectionn. Un signal ddi spcifie que le transfert est
une criture (bus de contrle)
3. Le circuit mmoire transfert la donne sur le bus de donne
ladresse spcifie par le bus dadresse

Un cycle dcriture est un cycle pendant lequel la donne est transfre


depuis un registre du processeur vers le priphriques/la mmoire.

53
Un priphrique classique
UART (port srie)
UART : Universal Asynchronous Receiver Transmitter
INTR

rception Rception Donnes reues


dcalage
(srie)
Valider
interruptions
bus donnes

Statut ligne Logique


dinterruption
Identification
interruption
Logique
de communication
Diviseur

Contrle DTR (Data Terminal ready)


Modem RTS (Request To Send)

CTS (Clear To Send)


Statut DSR (Data set Ready)
Modem RSLD (receive Line Signal Detector)
RI (Ring Indicator=

Emission
Transmission Donnes transmises
54
dcalage
(srie)
UART
Registre de rception: contient le dernier caractre reu
Le registre de validation des interruptions: permet dindiquer si lon
fonctionne en mode interruption ou pas
Le registre qui indique le statut (ltat) de la ligne : libre, occupe
Le registre didentification de linterruption: contient un numro
dinterruption qui est fourni au processeur pour spcifier
linterruption traiter (la routine excuter)
Le registre diviseur: permet de dfinir la vitesse de transmission
Le registre de contrle du modem
Le registre de statut du modem: positionn par le modem, permet
au processeur de connatre ltat du priphrique
Le registre dmission: contient le prochain caractre mettre

55
Traitement dune interruptions
Le traitement des interruptions dpend du processeur, on prsente ici
un exemple inspir du processeur Motorola 68000. Toujours utilis
dans certaine microcontrleur 68376, 68332

1. LUART active les signaux INTR, en fait 3 signaux qui


correspondent au niveau de priorit de linterruption
2. Si le niveau courant du processeur est infrieur (et pas gal!) au
niveau de linterruption alors on traite linterruption
3. On termine lexcution de linstruction courante
4. On effectue un cycle de lecture pour lire le numro de
linterruption traiter. Le numro est fourni par lUART et est
contenu dans le registre didentification des interruptions
(pralablement dfinit par le processeur)
5. Le processeur excute la routine qui correspond au numro
dinterruption
6. Reprend lexcution du programme interrompu

56
Interruptions
Le signal INTR est activ par lUART pour indiquer au processeur
quune interruption (matriel) doit tre traite. Par exemple, la
rception dun caractre.

INTR
processeur
UART

Bus donnes, adresses, contrle

57
Traitement dune interruption
Excution des instruction

Routine
PC Interruption
Plus prioritaire

Routine dinterruption
Niveau y>x
Programme
Principale
Niveau x

58
Table dinterruption CPU32 (68000)
Numro du vecteur Adresse Description

0 000 Reset (Stack Pointer)

1 004 Reset (PC)

2 008 Erreur bus

3 00C Erreur adresse

4 010 Instruction illgale

5 014 Division par zro

6 018 Instruction CHK

32 080 Instruction TRAP

47 Instruction TRAP

48-63 0C0 0FF Rserv

64 100 Interruption utilisateur

255 3FC Interruption utilisateur 59


Daisy Chain
On utilise le Daisy Chain ou cascading pour cascader plusieurs circuits
qui utilisent le mme niveau dinterruption

#interruption #interruption #interruption


processeur
#1 #2 #3
IN OUT IN OUT IN
INTR
IACK

60
IACK = Interrupt Acknowledge
Daisy Chain
Pour un mme niveau de priorit, les circuits sont ordonns selon leur
position dans la chane. Les circuits qui reoivent le signal IACK du
processeur peuvent dcider

1. de fournir leur numro dinterruption


2. De passer le signal IACK au prochain priphrique qui pourra
fournir son propre numro

61
Interruptions
Les sources des interruptions peuvent tre soit matriels soit
logicielles
Les interruptions matriels sont asynchrones et permettent une
rponse rapide du systme un vnement
Les interruptions logicielles sont synchrones et permettent par
exemple de changer la priorit dexcution du processus. Ce qui est
utile pour excuter certaines oprations en mode superviseur (OS).
Les programme utilisateurs nayant pas la priorit suffisante pour les
excuter
Une alternative au Daisy Chain est la scrutation, le processeur
testant tous les registres dtats des priphriques pour trouver celui
qui initi linterruption
Une alternative au systme dinterruption est la scrutation (polling)
ou le processeur passe son temps tester si un vnement eu
lieu.
Le systme dinterruption du 68000 est vectoris

62
Masquage des interruptions
Dans certaines situations il est important de masquer les interruptions,
cest--dire dempcher leur prise en compte par le processeur.

PC section (de programme) critique


pendant laquelle le programme ne peut pas
tre interrompu. Par exemple parce que
plusieurs variables sont modifies et
quelles sont cohrente seulement lorsque
toutes les valeurs sont jour

Un programme en mmoire
63
Masquage des interruptions
Pour les processeurs du type 68000 on a la possibilit dutiliser les
diffrents niveaux de priorits pour masquer les interruptions. Le
niveau 7 est non masquable. On peut se placer en niveau 7 pour
masquer toutes les interruptions

Certaines processeurs (Intel 80186,) possde un bit particulier


dans le registre dtat qui permet dactiver/dsactiver la prise en
compte des interruptions par programme. Les instructions sont STI
(Set Interrupt Flag) pour masquer les interruptions et CLI (Clear
Interrupt Flag) pour les activer.
PC
STI

Section critique

64
CTI
Un programme dexemple
#include <signal.h>
#include <stdio.h>
#include <unistd.h>

struct two_words { int a, b; } memory;

void handler(int signum) // la routine est appelle priodiquement toutes les secondes
{
printf ("%d,%d\n", memory.a, memory.b);
alarm (1);
}

int main (void)


{
static struct two_words zeros = { 0, 0 }, ones = { 1, 1 };
signal (SIGALRM, handler);
memory = zeros;
alarm (1);
while (1)
{
memory = zeros;
memory = ones;
}
}

65
Les interruptions ARM7TDMI
Les processeurs de la famille ARM nutilisent pas un systme dinterruptions
vectoris. Le systme permet dutiliser 7 interruptions diffrentes.

Interruption/exception Addresse Addresse #2


Reset RESET 0x00000000 0XFFFF0000
Undefined instruction UNDEF 0X00000004 0XFFFF0004
Software Interrupt SWI 0x00000008 0xFFFF0008
Prefetch abort PABT 0x0000000C 0xFFFF000C
Data abort Dabt 0x00000010 0xFFFF0010
Reserved ---- 0x00000014 0xFFFF0014
Interrupt request IRQ 0x00000018 0xFFFF0018
Fast interrupt request FIQ 0x0000001C 0xFFFF001C

66
Les interruptions ARM7TDMI
A ladresse correspondant une interruption se trouve une instruction.
Lorsquune interruption est leve, les processeur suspend lexcution
en cours, charge linstruction qui se trouve ladresse correspondante
et lexcute. Gnralement, la table dinterruption contient une
instruction de branchement qui permet dexcuter une routine.

Reset : contient la premire instruction excute aprs une


initialisation (reset) du processeur, par exemple aprs mise sous
tension.

Undefined Instruction : le processeur ne peut pas dcoder une


instruction

67
Les interruptions ARM7TDMI
Software interrupt : le processeur excut une instruction SWI, par
exemple pour effectuer un appel une routine du systme
dexploitation.

Prefetch abort : le processeur essaye de charger une instruction a


une adresse non permise.

Data abort : idem mais pour une donne

Interrupt resquet (fast) : une interruption est leve par un composant


matriel externe. Ces interruptions peuvent tre masque (voir le
registre cpsr)

68
Le Microcontrolleur
ARM7TDMI

69
Nomenclature des processeur
ARM
ARM{x}{y}{z}{T}{D}{M}{I}{E}{J}{F}{-S}

x: famille 1,2,3,,7,8,9
y: gestionnaire de mmoire/unit de protection
z: cache
T: jeu dinstructions Thumb
D: debbugger hardware JTAG
M: multiplicateur rapide
I: macrocell ICE embarqu (debug)
E: jeu dinstructions avanc
J: jeu dinstruction Jazelle (acclaration byte-code Java)
F: unit virgule flottante
S: version synthetisable
70
Architecture ARM
http://www.arm.com

Une architecture de processeurs 32 bits (ARM)


2 milliard de processeurs vendus
Tlphone portable
lectronique voiture
Consoles de jeux
Assistant personnel

Un processeur de signal (DSP: Digital Signal Processor) inclut pour les
applications audio/vido
Systme performant de gestion des interruptions et des exceptions

71
RISC
Dans un processeur RISCles instructions doivent sexcuter en un
seul cycle dhorloge qui doit tre haute frquence. La complexit
des instructions est donc limite ( par exemple les modes
dadressages). La complexit dun algorithme est donc assure par
lensemble des instructions et les performances du compilateurs sont
dterminantes
Instructions: Reduced Intstructions Set Computer, le compilateur doit
raliser des oprations simples (typ. pas de divisions). Le temps
dexcution des instructions est similaire (1 cycle). Pour un processeur
CISC certaines instructions peuvent durer plusieurs cycles dhorloges.
Pipelines: Les instructions ayant toutes le mme format il est possible
de fractionner leur excution en sous-tapes dexcution (lire
linstruction, dcodage, excution).
Registres: Grand nombre de registres usage gnral (pas de
registres ddis). Les registres peuvent contenir des donnes ou des
adresses indiffremment.
72
RISC
Registres (suites): les registres sont utiliss par les instructions comme
paramtres dentres/sorties. Dans certains processeurs RISC, certaines
instructions peuvent sexcuter seulement avec certains registres pour
amliorer les performances.
Architecture Load/Store: Les instructions sexcutent uniquement sur des
donnes contenues dans les registres. Les transferts entre mmoire
externe et registres seffectuent par des instructions spcifiques (Load et
Store) . Les processeurs CISC permettent par exemple la multiplication de
donnes en mmoire externes et le placent rsultat en mmoire externe (3
accs mmoire)

Les architectures RISC cherchent optimiser les performances en


implmentant des instructions simples et optimises et laissent le
compilateur responsable dune part des performances. Actuellement,
beaucoup de processeurs CISC utilisent des aspects de conception RISC.
73
ARM: Philosophie de conception
Rduction de la consommation dnergie, les systmes embarqus
sont souvent aliments par batterie (tlphone mobiles, pda,..)
High code density, dsigne la capacit du jeu dinstruction crire
des programmes avec peu dinstructions. Une haute densit permet
de rduire lespace mmoire ncessaire.
Le cur du processeur ARM doit tre aussi petit (intgration) que
possible pour permettre lintgration du plus grand nombre de
priphriques possibles sur le mme chip (prix au mm^2)
Mise disposition doutil de debug directement sur le circuit (mode
pas--pas,etc). Ce qui permet de tester le circuit et les priphriques
utiliss.

74
ARM-RISC ou CISC
Les instructions ne sexcutent pas toutes en un seul cycle
dhorloge. Par exemple, les instructions load/store peuvent
transfrer plusieurs registres des adresses squentielles
(augmentation de la densit de code, accs squentiels sont
gnralement plus rapides)
Un registre dcalage barrel register permet deffectuer un
prcalcul sur un registre avant quil soit utilis par une instruction
(dcalage)
Un jeu dinstruction cod sur 16 bits (augmentation de la densit
dintgration ~30%)
Les instructions peuvent tre conditionnelles, ce qui rduit
lutilisation des instructions de branchement
Certaines instructions sont spcialises, comme les instructions
DSP

75
Exemple darchitecture
Dcodage et paramtrisation des mmoires par programme
ROM
SRAM
FLASHROM
Cur Controlleur
Programmable, mmoire
ARM DRAM
quel priphrique
priorit, Controlleur
Bus externe
Controlleur AHB etxerne
Dinterruption

Arbitre bus AHB ARM Peripheral


Pont Bus
ARM High Bus AHB - APB
Performance
Bus Horloge Ethernet

clavier UART Timers/compteurs

76
Software

Application

Systme dexploitation

Code dinitialisation Pilotes (drivers)


Matriel

77
Software
Code dinitialisation: Le premier programme excut par le systme,
ralise linitialisation du systme (controlleur dadresse, etc) pour
quil soit fonctionnel.
Le systme dexploitation est gnralement rduit pour les systmes
embarqus (pas de mmoire de masse, structures de fichiers, etc.).
Gnralement, se rduit un ordonnanceur de tches qui
fonctionne par interruption ou scrutation (event or pool driven
system).
Les pilotes, lments logiciels qui simplifie lexploitation des
priphriques

Les programmes qui se trouvent en mmoire ROM sappellent firmware

78
Code dinitialisation
(boot code)
On considre trois phases diffrentes
Initialisation du matriel: par exemple les plan dadressages. Par dfaut,
un plan dadressage est dfini pour le processeur mais il peut-tre
modifi
Diagnostique: test les priphriques et ressources
Dmarrage (booting): par exemple charger et passer la main au
systme dexploitation, activer une application, Le programme qui doit
tre excut peut tre sauvegard en mmoire sous forme
compresse, le code doit donc tre dcompress et plac en mmoire
externe.
Systmes dexploitations
RTO (Real Time Operating system) Un systme qui garanti les temps
de rponse aux vnements (<x microsec.)
Platform OS, prend en charge la gestion des priphriques, mmoire
disque dur, sans contraintes temps-rels (Linux, Windows)
79
Flot des donnes
Data bus (donne/programme)
dcodeur dinstruction
extension du signe
write read Rd
rsultat
registres r0-r15
Rn Rm
A B
Acc

r15 registre dcalage multiplier


pc N MAC accumulator
ALU

registre dadresse
incrmenteur
80
Bus dadresse A,B,rsultat : bus internes
ARM
Le schma reprsente une implmentation de Von Neumann de
larchitecture ARM (un seul bus de donnes pour les
instructions/donnes). Il existe des implmentations de Harvard.
Larchitecture est de type load/store (typique des RISC). Cest--dire
que les instructions sexcutent uniquement sur les registres et les
accs externes sont seulement pour transfrer des donnes
vers/depuis les registres.
Les donnes sont sur 32 bits, les entiers peuvent tre signs.
Lorsquune donne sur 8 ou 16 bits est transfres vers les
registres sur 32 bits et en tendant le signe.
Les instruction load/store utilisent lALU pour gnrer une adresse
qui est maintenue dan le registre dadresse et sur le bus dadresse
externe. Rm
Le registre peut tre modifi avec le registre dcalage avant
dtre utilis par lALU
81
Les registres
Les registres accessibles dpendent du mode de fonctionnement du processeur.
Mode Utilisateur (user mode): les registres sont 32 bits, les registres rx sont
r0
usage gnral (general purpose). Les registres r13,r14 et r15
r1 sont gnralement utiliss comme pointeur de pile (sp=stack
r2
pointer), adresse de retour de sous-routine (lr=link register) et
r3
r4
de compteur de programme (pc=program counter) pointe sur
r5 ladresse de la prochaine instruction charger. Les registres
r6 r13 et r14 peuvent tre utiliss comme registres gnraux mais
r7
cet usage peut-tre en conflit avec un ventuel OS. Les
r8
r9
registres r0-r13 sont orthogonaux cest--dire que toutes les
r10 instructions qui sexcutent sur r0 peuvent sexcuter sur les
r11 autres registres. Certaines instructions utilisent r14 et r15
r12
particulirement
r13 sp
r14 lr
r15 pc

cpsr
-
registres dtats (un registre et sa copie) 82
Registre cpsr
Current Program Status Register
31 30 29 28 24 7 6 5 4 0

N Z C V J I F T Mode

N,Z,C,V: drapeau de condition (condition flags) positionn par


lexcution dinstruction selon le rsultat (le rsultat est nul, overflow,
)

I,F: masques dinterruptions

T: Thumb state (voir plus loin)

Mode: mode de fonctionnement du processeur (abort, fast interrupt request,


interrupt request, supervisor, system, undefined et user, les six premiers sont des
modes privilgis)
83
Modes de fonctionnement du
processeur
abort: lorsque le processeur dtecte quil narrive pas accder la
mmoire externe
(fast) interrupt request: correspondent aux deux niveaux de priorits
disponibles pour le traitement des interruptions
supervisor. gnralement le mode dopration du systme
dexploitation, cest le mode aprs le reset (initialisation du proc.)
system: identique au mode user, except quon a accs en lecture-
criture au registre cpsr (en particulier on peut changer de mode)
undefined: tat du processeur lorsquil doit excuter une instruction
quil ne peut pas dcoder (undefined) ou qui nest pas supporte par
limplmentation
user: mode de fonctionnement des applications le seul qui ne peut pas
modifier les bits mode du cpsr.

les diffrents modes correspondent des accs privilgis et


des registres particuliers. 84
user/system
Les registres - Modes
r0
r1
r2
r3
registres cachs selon le mode courant du processeur
r4
r5
r6
fast insterrupt
r7
r8 r8_fiq
r9 r9_fiq
r10 r10_fiq
r11 r11_fiq
interrupt supervisor undefined abort
r12 r12_fiq
r13 sp r13_fiq r13_irq r13_svc r13_undef r13_abt
r14 lr r14_fiq r14_irq r14_svc r14_undef r14_abt
r15 pc

cpsr
- spsr_fiq spsr_irq spsr_svc spsr_undef spsr_abt

85
saved program status register
Les registres - modes
lorsque lon change de mode de fonctionnement les registres affects
par lexcution des instructions peuvent changer.
Par exemple, en mode fast Interrupt request, les instructions qui
modifient les registres r8 - r14 modifient rellement les registres r8_fiq -
r14_fiq.

Lintrt de ce mcanisme est que dans la routine dinterruption, on


peut utiliser (modifier) les registres r8-r14 sans se soucier de prserver
les valeurs de ces registres. Lorsque lon quitte la routine de traitement
de linterruption et que lon change de mode les registres sont
restaurs.

86
Excution des instruction Les registres - modes

PC

mode fast
interrupt request
Mode utilisateur
la routine peut modifier les registres r8-r14
sans se soucier de restaurer
les valeurs a la fin du traitement. Les autres
registres doivent tre sauvegards puis 87
restaurer.
Notion de contexte
Le contexte dexcution dune tche ou dune application est
constitu des registres utiliss par la tche pour raliser sa fonction.
Pour le processeur ARM, il sagit des registre r0-r15 et des registres
dtats.
Pour traiter une interruption, excuter une routine, ou changer
dutilisateur (systme partag ou multitche) il faut commuter (changer)
le contexte, cest--dire

1. sauvegarder les registres en mmoire du processus courant


2. retrouver et restaurer le contexte du nouveau processus (ou
routine) excuter.
3. excuter les instruction du nouveau processus

Si on se restreint utiliser les registres dupliqus lors des changement


de mode cette opration est prise en charge par le processeur (au
niveau matriel) sinon on doit programmer lopration.
88
Exemple interruption matrielle
user/system
r0
r1
r2 la sauvegarde du registre dtat cpsr est effective uniquement
r3
lorsque le changement de mode est d une exception ou
r4
une interruption. le registre nest pas sauv ( faire
r5
r6
manuellement si ncessaire) lorsque le changement est
r7 provoqu par une criture dans les bits Mode[4:0] du cpsr.
r8
r9
r10
r11 interrupt
r12
r13 sp r13_irq ladresse de retour
r14 lr r14_irq
le pointeur de pile en mode Interrupt request
r15 pc

cpsr
- spsr_irq sauvegarde du registre dtat du mode utilisateur
89
Changement de mode
Les sources des changements de modes peuvent tre

logicielles
matrielles

Pour les sources logicielles, tous les modes privilgis (cest--dire


tous les modes sauf utilisateur) sont autoriss modifier les bits Mode
du cpsr. On peut activer une interruption logicielle avec des instructions
ddies. Lexcution du programme peut aboutir un changement de
mode par exemples (data abort) si une instruction accde une zone
mmoire sans les permissions ncessaires, (undefined instruction) si
une instruction nest pas reconnue par le dcodeur, (prefetch abort) le
processeur accde un zone mmoire pour charger une instruction sans
les permissions ncessaires.

90
Modes rsum
Mode Abbrviation Privilgi Mode[4:0]
abort abt oui 10111

fast interrupt request fiq oui 10001

interrupt request irq oui 10010

superviseur svc oui 10011

system sys oui 11111

undefined und oui 11011

utilisateur usr non 10000

91
Etat du processeur et jeu
dinstructions
Le processeur peut se trouver dans trois tats diffrents: ARM,
Thumb, Jazelle. Les changements dtats sont provoqus par
lexcution dinstructions particulires

A chacun des tats correspond un jeu dinstruction particulier

ARM: jeu dinstruction sur 32 bits que lon tudiera

Thumb: jeu dinstructions cod sur 16 bits, permet de programmer un


systme avec des mmoires 16 bits sans doubler les accs en
mmoire externe, augmente la densit du code dun facteur 30%.

Jazelle: jeu dinstruction sur 8 bits destin amliorer les performances


de programmes crits en bytecodes Java (environ 60% du bytecode
est implment en hardware, le reste est software)

92
comparaison
ARM Thumb

taille des instructions 32 bits 16 bits

#instructions 58 30

instructions les instructions de


la plupart
conditionnelles branchement
instructions traitement accde au registre accs spar lALU et
des donnes dcalage et lALU registre dcalage
lecture/criture en mode
CPSR pas daccs direct
privilgi
15 registres gnraux, 8 registres gnraux, 7
utilisation des registres
pc registres hauts, pc

93
Retour sur le cpsr
31 30 29 28 27 24 7 6 5 4 0

N Z C V Q J I F T Mode

F,T: masque dinterruption pour les fast interrupt request et interrupt request

Flags (drapeaux) de conditions NZCV:


ces drapeux sont mis--jour en excutant les instructions de comparaison et
par les rsultats obtenus par lALU.

Par exemple: si le rsultat de lexcution dune instruction SUBS (soustraction)


est nul alors le flag Z est positionn 1
Q: Saturation et/ou overflow
V: Overflow sign
C: Carry (retenu)
Z: Zero
N: Negative 94
Saturation
Pour prvenir un dpassement de capacit (overflow) pendant les
calculs on fixe les valeurs de oprandes dans des limites dtermines,
cest la saturation.
saturation sur 16bits: la valeur de x est contenue dans lintervalle
-0x00008000 <-> +0x00007FFF

saturation sur 32 bits: -0x80000000 <-> +07FFFFFF

Lorsquun calcul provoque un dpassement de capacit, le rsultat est


fix la valeur maximum (QADD, QDADD, QSUB, QDSUB)

95
Saturation
Par exemple:
Arithmtique non sature
0x7fffffff + 1 = 0x 80000000 (rsultat ngatif)

Arithmtique sature
0x7fffffff + 1 = 0x7fffffff

96
Pipeline
Lexcution dune instruction se dcompose en
1. transfrer linstruction de la mmoire dans le registre ddi au
dcodage es instructions
2. dcodage de linstruction
3. excution de linstruction

fetch decode execute

le pipeline de lARM7

97
Pipeline
Exemple: on a trois instruction ADD, SUB, CMP qui se suivent

transfre dcode excute

ADD

SUB ADD
temps

CMP SUB ADD

98
Pipeline
la longueur du pipeline dtermine les caractristiques de
lexcutions
une instruction est excute uniquement aprs quelle ait pass tout les
tages du pipeline. A linitialisation le pipeline doit se remplir avant la
premire excution, a cela correspond un temps de latence. (idem
lorsquil y a rupture de squence avec une instruction de branchement)
Il se peut quil y ait des dpendances entre les donnes lintrieur du
pipeline. Un tage du pipeline est bloqu car il doit connatre le rsultat
dune instruction elle aussi dans le pipeline. Le compilateur est
responsable de limiter de telles dpendances .
Les curs ARM9 et ARM10 utilisent des pipelines de 5 et 6 tages
respectivement

99
Pipeline - pc
Le registre pc contient ladresse de la prochaine instruction transfrer
de la mmoire vers le processeur. Si linstruction en cours dexcution
se trouvait ladresse n, le pc pointe sur ladresse n + 8 ( mode thumb
cest + 4).

Si le pc est modifi, directement en utilisant une instruction ADD par


exemple ou en excutant une instruction de rupture de squence (B),
le pipeline est vid et la prochaine instruction charge depuis la
mmoire. Dans ce cas, 2 cycles supplmentaires seront ncessaires
pour remplir le pipeline (temps de latence).

Si une interruption est leve, le processeur termine lexcution de


linstruction en cours, vide le pipeline et traite linterruption.

100
Exceptions - interruptions
Lorsquune interruption ou une exception est leve le processeur
suspend lexcution du programme courant et excute linstruction
situe ladresse correspondante dans la table des vecteurs
dinterruptions.
Reset: adresse du code dinitialisation aprs mise sous tension du
processeur
Undefined instruction: le processeur est incapable de dcoder une
instruction
Prefetch abort: le processeur nest pas autoris transfrer une
instruction ladresse dsire
Data abort: idem prefetch abort except que laccs mmoire est
pour une donne
Interrupt request: interruption matrielle externe
Fast interrupt request: idem interrupt request mais temps de rponse
plus court

101
Exceptions - interruptions
Exception/interruption mnmonique adresse adresse2

reset RESET 0x00000000 0xffff0000

undefined instruction UNDEF 0X00000004 0Xffff0004

software interrupt SWI 0x00000008 0xffff0008

prefetch abort PABT 0x0000000c 0xffff000c

data abort DABT 0x00000010 0xffff0010

reserved ---- 0x00000014 0xffff0014

interrupt request IRQ 0x00000018 0xffff0018

fast interrupt request FIQ 0x0000001c 0xffff001c


102
Autres lments
mmoire cache
Von Neuman: mme cache pour les donnes et les instructions
Harvard: une mmoire cache donnes une pour les instructions
a cause des mmoires cache les temps daccs
dpendent de lexcution du programme et ne sont pas
connu de manire dterministe. Cest une limitation pour
les systmes temps-rels. Les curs ARM peuvent tre
munis de mmoire TCM (Tightly coupled memory) qui
est une mmoire SRAM accs rapide et permet de
connatre de manire dterministe les temps daccs
(temps de rponse prvisibles).

103
Autres lments
Gestionnaire de mmoire
une unit de protection de la mmoire MPU (memory protection
unit)
dtermine un nombre limit de zone mmoire (parmi les 4Gb
adressables) et des permissions pour les accs
pour les systmes qui ncessitent la mmoire protges mais na
pas de plan dadressage compliqu
une unit de gestion de la mmoire MMU (memory managment
unit)
permet dimplmenter la mmoire virtuelle (table de traduction
dadresses) ainsi que les permissions daccs
pour les applications multitches
il est possible de travailler sans MPU ni MMU pour les systmes
particulirement simples

104
Autres lments
Gnralement une unit de calcul en virgule flottante FPU (Floating
Point Unit) nest pas intgre. Les lments matriels qui sont
utilisables pour acclrer les calculs en virgule flottante sont
FPA Floating Point Accelerator
VFP Vector Floating Point Accelerator

Un coprocesseur est une entit matriel qui tend le jeu


dinstruction du processeur = le coprocesseur ne fait pas
partie du cur du processeur mais pour le programmeur
linterface est transparente.

105
les instructions ARM
Nous ne considrons que le jeu dinstruction ARM cod sur 32 bits. Les
caractristiques gnrales sont:
excution conditionnelle
instructions comprenant deux oprandes sources et une
oprande destination
opration de dcalage sur une oprande source (barrel register)
saut de programme (relatif) de + ou 32 Mbytes

codage des instructions, exemple une instruction ADD

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

cond 0 0 1 0 1 0 0 S Rn Rd dcalage de loprande

106
Exemple ADD
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

cond 0 0 1 0 1 0 0 S Rn Rd dcalage de loprande

cond : il sagit dune instruction conditionnelle, elle est excute


seulement si cette condition est remplie
27-21 : code de lopration (opcode)
20 : si S=1 le rsultat modifie le registre dtat cpsr
19-16 : numro du registre source 1
15-11 : numro du registre de destination
10-0 : source 2, peut-tre une constante, un dcalage par rapport au
contenu dun registre

107
exemple ADD
ADD R1,R1,#1 R1=R1+1
ADDNE R2,R3,R4 si Z=0 R2=R3+R4 sinon NOP

ADD R1,R6,R6,LSL,#5 R1=R6+R6<<5=R6(32+1)


ADDEQS R1,R2,R3 R1=R2+R3 si Z=1 sinon NOP
les indicateurs N,Z,C,V sont positionns
dans le registre cpsr

108
pr-processing des donnes
Data bus (donne/programme)
dcodeur dinstruction
extension du signe
write read Rd
rsultat
registres r0-r15
Rn Rm
A B
Acc

r15 registre dcalage


pre-processing multiplier
pc N MAC accumulator
ALU

registre dadresse
incrmenteur
109
Bus dadresse A,B,rsultat : bus internes
Les conditions
cond drapeau test
mnmonique signification
[31:28] (cpsr)
0000 EQ gal Z=1
0001 NE pas gal Z=0
0010 CS/HS retenue/plus grand ou gal (non sign) C=1
0011 CC/LO pas de retenue/plus petit (strict et non sign) C=0
0100 MI minus/ngatif N=1
0101 PL plus/positif ou nul N=0
0110 VS overflow/ dpassement de capacit V=1
0111 VC no overflow/pas de dpassement de capacit V=0
1000 HI plus grand non sign C=1 et Z=0
1001 LS plus petit ou gal non sign C=0 ou Z=1
1010 GE plus grand ou gal sign N=V
1011 LT plus petit sign N != V
1100 GT plus grand sign Z=0 et (N=V)
1101 LE plus petit ou gal sign Z=1 ou (N!=V)
110
1110 AL pas de condition toujours
Les conditions
EQ = equal GT = greater that
NE = not equal LE = less or equal
CS = carry set (=1) AL = always
CC =carry clear (=0)
MI = minus
PL = plus
VS = V set (=1)
VC = V clear (=0)
HI = higher
LS = lower or same
GE = greater or equal
LT = less than

111
Exemples
ADDNE R1,R2,R3 R1=R2+R3 si Z=0
ADDVS R8,R9,R10 R8=R9+R10 si V=1
ADDAL R4,R5,R6 R4=R5+R6 toujours
ADD R2,R5,R8 R2=R5+R8 toujours par dfaut
Ce mcanisme permet dviter les branchements conditionnels

BNE suite
ADD R1,R2,R3 = ADDNE R1,R2,R3
suite

112
Les drapeaux
les conditions portent sur des drapeaux (V=1, C=0, etc) qui sexprime
sous la forme overflow/dpassement de capacit sign, etc Le code
gnral est:

<SignedOverflow>: le rsultat dune opration arithmtique provoque


un dpassement de capacit sign par exemple: 0x7ffffff + 1 =
0x80000000, la somme des deux nombres positifs est ngative.
typiquement le drapeau V du cpsr indique un tel dpassement

<UnsignedOverflow>: le rsultat dune opration arithmtique


provoque un dpassement de capacit nonsign par exemple: 0xfffffff
+ 1 = 0 le rsultat ne peut pas tre cod sur 32 bits. Typiquement le
drapeau C du cpsr indique un tel dpassement

113
Les drapeaux
<NoUnsignedOverflow>: 1-<UnsignedOverflow>

<Zero>: le rsultat dune opration arithmtique ou logique est nul.


Typiquement le drapeau Z indique un tel rsultat

<Negative>: le rsultat dune opration arithmtique ou logique est


ngatif = le bit 31 du rsultat est positionn un ou encore <Negative>
= bit 31 du rsultat. typiquement, le bit N du cpsr indique un tel rsultat

114
Les instructions de manipulation
des donnes
manipulation des donnes entre registres.
dplacement (MOVE)
instructions arithmtiques
instructions logiques
instructions de comparaison
instruction multiplication
le registre dcalage (barrel shifter) est gnralement disponible
Mise jour du registre cpsr (S=Statut)
Dplacement/MOVE
syntaxe: <instruction>{<cond>}{S} Rd, N

optionnel registre destination

oprande source
115
Exemple
MOV Rd = N

MOVN Rd = ~ N

MOV r7,r5 r7=r5 copie le contenu de r5 dans r7

loprande source est un simple registre

MOV r7,#34 r7=34

une constante, valeur immdiate


116
MOV valeur immdiate
Lorsque loprande source de linstruction MOV est une valeur
immdiate, cette valeur ne peut pas tre quelconque. La valeur
immdiate est une valeur sur 32 bits qui est obtenue en utilisant
une valeur immdiate sur 8 bits imm_8
une valeur immdiate sur 4 bits imm_4, qui permet de calculer le
nombre de dcalage vers la droite (ROR) de imm_8

Plus prcisement,
valeur_immdiate = imm_8 ROR 2*imm_4

par exemple: 0xff, 0x104, 0xe0000005, 0xbc00000


et pas: 0x101, 0x102

117
Mise jour du cpsr
Si linstruction le spcifie (MOVS, par exemple) le registre dtat cpsr
est mis jour en fonction de la valeur du registre de destination
(rsultat).
N = <negative> (bit 31)
Z = <zero>
V nest pas modifi

118
Registre dcalage
Rn Rm

registre dcalage
pre-processing

ALU

le pr-processing des donnes est excut sans augmenter la dure


dexcution des instructions

119
Registre dcalage
constante ou valeur immdiate

nombre de
mnmonique description dcalage rsultat
dcalage

LSL dcalage logique gauche xLSLy x<<y #0-31 ou Rs

(unsigned)x>>
LSR dcalage logique droite xLSRy #1-32 ou Rs
y
dcalage arithmtique
ASR xASRy (signed)x>>y #1-32 ou Rs
droite
((unsigned)x>>
ROR dcalage droite xRORy #1-31 ou Rs
y) | (x<<(32-y))
(c flag << 31) |
RRX dcalage droite tendu xRRX y ((unsigned)x>> ----
1) 120
Registre dcalage
31 0

C 0 LSL

31 0

0 0 LSR

31 0

0 ASR

le bit de signe 121


Registre dcalage
31 0

C ROR

31 0

C RRX

122
2me oprande source
<instruction>{<cond>}{S} Rd, N

N syntaxe
valeur immdiate #valeur
registre Rm
dcalage logique gauche immdiate Rm, LSL #val_imm
dcalage logique gauche registre Rm, LSL Rs
dcalage logique droite immdiate Rm, LSR #val_imm
dcalage logique droite registre Rm, LSR Rs
dcalage arithmtique droite immdiate Rm, ASR #val_imm
dcalage arithmtique droite registre Rm, ASR Rs
rotation droite immdiate Rm, ROR #val_imm
rotation droite registre Rm, ROR Rs
Rotation droite avec extension Rm, RRX 123
Exemple
MOVS r0,r1, LSL #1

r0 0x00000000 r0 0x00000008
r1 0x80000004 r1 0x80000004

124
Instructions arithmtiques
Syntaxe: <instruction>{<cond>}{S} Rd, Rn, N
2me oprande
instruction 1re oprande
excution conditionnelle

mise jour du registre dtat cpsr

registre destination

125
Instructions arithmtiques
ADC adition 2 oprandes* + retenue Rd = Rn + N + C

ADD addition 2 oprandes* Rd = Rn + N

RSB soustraction inverse 2 oprandes* Rd = N - Rn

soustraction inverse 2 oprandes*


RSC Rd = N Rn - !(C)
avec retenue
soustraction 2 oprandes* avec
SBC Rd = Rn N - !(C)
retenue

SUB soustraction 2 oprandes* Rd = Rn N

* oprandes sur 32 bits


126
Exemples
SUB r0, r1, r2
r0 0x00000000 r0 0x00000001
r1 0x00000002 r1 0x00000002
r2 0x00000001 r2 0x00000001

RSB r0, r1, #0

r0 0x00000000 r0 0xffffff89
r1 0x00000077 r1 0x00000077

complment 2
les bits C=<UnsignedOverflow>, V=<SignedOverflow>, N=<Negative> et Z
= <Zero> sont positionns
127
Exemple
Programmation de boucles:

MOV r1, N
loop
; le corps de la boucle r1 = N, N-1, , 1
SUBS r1, r1, #1
BGT loop

met jour les drapeaux Z, N, V du cpsr.


B = branch,
instruction de branchement
instruction conditionnelle, GT test Z=0 et (N=V)

128
Exemple
Programmation de boucles 2:

SUBS r1, N, #1
loop
; le corps de la boucle i = N-1 , N-2, , 0
SUBS r1, r1, #1 #2, #3, pour modifier le pas
BGE loop

met jour le drapeaux Z,N,V du cpsr.


B = branch,
instruction de branchement
instruction conditionnelle, GE test N=V
(V overflow sign)
129
Exemples
1. ADD r1, r2, r3, LSL #3

r1 = r2 + 8 * r3

2. ADD r1, r2, r3, LSR #4

r1 = r2 + r3/16 (non sign)

3. ADD r1, r2, r3, ASR #4

r1 = r2 + r3/16 (sign)

130
Exemples
4. ADD r1,r2,r3, LSL r4

r1 = r2 + 2^r4 * r3

131
Instructions logiques
Les instructions logique effectue des oprations bit--bit (bitwise)

Syntaxe: <instruction>{<cond>}{S } Rd, Rn, N

AND ET logique bit--bit de deux oprandes* Rd = Rn & N

ORR OU logique bit--bit de deux oprandes* Rd = Rn | N

EOR OU Exclusif bit--bit de deux oprandes* Rd = Rn ^ N

BIC Bit Clear (AND NOT) de deux oprandes* Rd = Rn & ~N

* de 32-bits
les bits Z et N du cpsr sont mis--jour
132
Exemples
ORR r0, r1, r2

r0 0x00000000 r0 0x12345678
r1 0x02040608 r1 0x02040608
r2 0x10305070 r2 0x10305070

0x00400000
BIC r0, r0, #1<<22

r0 0xffff0000 r0 0xffbf0000

lopration consiste effacer (= mettre zro) du registre Rn les bits qui


sont positionns des positions correspondant des 1 dans loprande N.
Loprande N agit comme un masque. Une application est
lactivation/dsactivation des interruptions. 133
Instructions de comparaisons
Les instructions de comparaisons permettent de comparer ou tester un
registre avec une valeur sur 32 bits. Le registre cpsr est mis jour et
aucun autre registre est modifi (le suffixe S nest pas ncessaire pour
indiquer la mise jour des drapeaux du cpsr). Pour les tests avec des
valeurs immdiate, utiliser la mme convention que pour MOV
syntaxe: <instruction>{<cond>} Rn, N

positionne les drapeaux de cpsr


CMN comparaison ngative
selon le rsultat de Rn + N

positionne les drapeaux de cpsr


CMP comparaison
selon le rsultat de Rn - N
positionne les drapeaux du cpsr
TEQ test si galit oprandes 32 bits
selon le rsultat de Rn ^ N (ou-ex)
positionne les drapeaux du cpsr
TST test bit--bit 134
selon le rsultat de Rn & N
registre cpsr
CMN: positionne les bits N, Z, C = <unsignedOverflow>, V =
<signedOverflow>

CMP: positionne les bits comme CMN except


C=<NoUnsignedOverflow>
En effet,
x-y = x+~y+1, il y a retenue (C=1) si lopration dpasse la capacit
(non sign), cest--dire si y<=x entraine un <UnsignedOverflow>.
Donc, x-y ne dpasse pas la capacit.
x=0011, y=0010 x+~y+1 = 0011 + 1110 = 0001 + retenue
x=0011, y=0100 x+~y+1 = 0011 + 1100 = 1111 pas de retenue et
rsultat sign faux.

TEQ, TST: positionne les bits Z=<zero> et N=<negative>

135
Instructions de multiplication
On a deux classes, les multiplications et les multiplications longues (le
rsultat est sur 64 bits). Le rsultat est plac dans un registre ou une
pair de registres

Syntaxe: MLA{<cond>}{S} Rd, Rm, Rs, Rn


MUL{<cond>}{S} Rd, Rm, Rs

MLA Multiplication et accumulation Rd = (Rm * Rs) + Rn

MUL Multiplication Rd = Rm * Rs

136
Instructions de multiplication
Multiplications longues
syntaxe: <instruction>{<cond>}{S} RdLo, RdHi, Rm, Rs

multiplication signe longue avec


SMLAL [RdHi, RdLo]=[RdHi, RdLo]+(Rm*Rs)
accumulation

SMULL multiplication signe longue [RdHi, RdLo] = Rm*Rs

multiplication non signe longue [RdHi, RdLo]=[RdHi, RdLo]+(Rm*Rs)


UMLAL
avec accumulation
[RdHi, RdLo] = Rm*Rs
UMULL multiplication non signe longue

137
exemple
MUL r0, r1, r2 r0 = r1 * r2

r0 0x00000000 r0 0x00000004
r1 0x00000002 r1 0x00000002
r2 0x00000002 r2 0x00000002

UMULL r0, r1, r2, r3 [r1, r0] = r2 * r3

r0 0x00000000 r0 0xe0000004
r1 0x00000000 r1 0x00000001
r2 0xf0000002 r2 0xf0000002
r3 0x00000002 r3 0x00000002
138
Remarque sur les multiplications
le temps ncessaire lexcution dune multiplication dpend de
1. limplmentation du processeur = certaine ralisations sont plus
optimum que dautres
2. la valeur du registre Rs, on dtermine
1. M=1 pour -2^11 <= Rs < 2^11
2. M=2 pour -2^23 <= Rs < 2^23
3. M=3 pour les autres valeurs de Rs
le nombre de cycle pour excuter linstruction est M pour les
instructions MUL/MLA, 4 pour MULS/MLAS, 1+M xMULL/xMLAL et
5 pour xMULLS/xMLALS

Attention, aprs lexcution de MUL/MLA et xMULL/XMLAL on doit


attendre 1 cycle supplmentaire avant de pouvoir effectuer une
nouvelle multiplication

139
Remarque sur les multiplications
Pour un processeur 68000 la diffrence de temps dexcution entre
une addition et une multiplication est un facteur 8-9

MLAS, MULS mettent jour N=<Negative, Z = <Zero>, C nest pas


prvisible, V est inchang. En gnral il faut viter de mettre jour le
cpsr car les implmentations peuvent ncessiter des cycles
supplmentaires (utiliser une comparaison).

140
Instructions de branchement
les instructions de branchement permettent de modifier le droulement du
programme (initialement squentiel) pour effectuer des tests ou des appels de
sous-routines.

Syntaxe: B{<cond>} label


BL{<cond>} label
BX{<cond>} Rm
BLX{<cond>} label | Rm

B branch pc = label

pc = label
BL branch + link
lr = adresse de la prochaine instruction aprs BL

BX branch exchange pc = Rm & 0xfffffffe, T= Rm & 1

pc = label, T=1
BLX branch exchange +l ink pc = Rm & 0xfffffffe, T= Rm & 1 141
lr = adresse de la prochaine instruction aprs BLX
Instructions de branchement
Le bit T dsigne le bit T du cpsr qui indique que le processeur est dans
ltat Thumb, les instructions BX et BLX permettent donc de changer
ltat du processeur.

les branchements avec lien (BL et BLX) permettent deffectuer des


appels de sous-routine. Le label ou le registre indique ladresse du
dbut de la sous-routine et le registre lr du cpsr contient ladresse de
retour de la sous-routine, cest--dire ladresse de la prochaine
instruction excuter au retour de la sous-routine.

Lorsque ladresse est indique par un label, le dplacement est relatif


par rapport la valeur courante du pc, se dplacement doit tre au
maximum de +-32MBytes.

142
Instructions de branchement
exemple:

B forward
ADD r1, r2, #4
ADD r0, r6, #2
ADD r3, r7, 34
forward
SUB r1, r2, #4

143
Instructions de branchement
exemple:

backward
ADD r1, r2, #4
SUB r1, r2, #4
ADD r4, r6, r7
B backward boucle infinie

144
instructions de branchements
exemple: appel une sous-routine

BL sousroutine
CMP r1, #5
MOVEQ r1, #0
.
.
.
.
sousroutine
<code de la sous-routine>
MOV pc, lr move le contenu du registre lr dans le pc

145
Instructions load- Store
les instructions Load et Store permettent le transfert de donnes entre
les registres et la mmoire externes (priphriques,).

il y a trois types dinstructions load-store


transfert registre simple
transfert registre multiples
change (swap)

146
transfert registre simple
Single-register transfer

Syntaxe: <LDR | STR>{<cond>}{B} Rd, adressage1


LDR{<cond>}{SB | H | SH} Rd, adressage2
STR{<cond>}H Rd, adressage2

LDR charge un mot vers registre Rd <= mem32[adresse]

STR sauve byte/mot depuis registre Rd => mem32[adresse]

LDRB charge un byte vers registre Rd <= mem8[adresse]

147
STRB sauve un byte depuis un registre Rd => mem8[adresse]
transfert registre simple

LDRH charge un demi-mot vers registre Rd <= mem16[adresse]

STRH sauve un demi-mot depuis registre Rd => mem16[adresse]

Rd <= signe tendu


LDRSB charge un byte sign vers registre
(mem8[adresse])

Rd <= signe tendu


LDRSH charge un demi-mot sign vers regsitre
(mem16[adresse])

148
modes dadressages
Le processeur ARM permet daccder la mmoire selon diffrents
modes (modes dadressages). Chacun de ces modes utilise une des
mthodes suivantes pour lindexage
pr indexe avec mise jour
pr index
post index

mthode donne registre de base exemple

pr index avec
mem[base + offset] base + offset LDR r0, [r1, #4]!
mise jour

pr index mem[base + offset] pas mis jour LDR r0,[r1, #4]

post index mem[base] base + offset 149#4


LDR r0, [r1],
modes dadressages
adressage1 et mthode dindexage:
valeur immdiate sur 12 bits

pr index avec offset immdiat: [Rn, #+-offset_12]

pr index avec registre doffset: [Rn, +-Rm]

pr index avec registre d le registre dadresse de base


offset et registre dcalage: [Rn, +- Rm, shift #shift_imm]

pr index avec offset immdiat LSL,


et mise jour : [Rn, #+-offset_12]!

pr index avec registre doffset


et mise jour: [Rn, +-Rm]!

150
modes dadressages
adressage1 et mthode dindexage (suite):
pr index avec registre d
offset et registre dcalage [Rn, +- Rm, shift #shift_imm]!
et mise jour:

mode immdiat post index: [Rn], #+-offset_12

post index avec registre: [Rn], +-Rm

Post index avec registre


doffset et registre dcalage: [Rn], +-Rm, shift #shift_imm

151
modes dadressages
Les modes dadressages prsents sur les deux derniers transparents
sont disponibles pour des instructions load/store de mot de 32 bits ou
de byte non sign

+- indique que loffset est sign, loffset spcifie le nombre de bytes

le registre dadresse de base pointe sur un byte en mmoire

le mot immdiat (par exemple offset immdiat) indique que les calculs
utilise un offset de 12 bits encod dans linstruction (par daccs
mmoire supplmentaire)

152
modes dadressages
mode dadressage 2:
pr index avec offset immdiat: [Rn, #+-offset_8]

pr index avec registre doffset; [Rn, +-Rm]

pr index avec offset immdiat


et mise jour: [Rn, #+-offset]!

pr index avec registre doffset


et mise jour: [Rn, +-Rm]!

post index immdiat: [Rn], #+-offset_8

post index registre: [Rn], +-Rm


153
exemple
LDR r1, [r2, -r3]! adresse valeur

100014
r1 0x00000000
100010
r2 0x00100014
1000C 0x9876C4A1
r3 0x00000008
10008
10004

0x00100014-0x8 = 0x0010000C
mmoire

r1 0x9876C4A1
r2 0x0010000C
r3 0x00000008

154
exemple
LDR r1, [r2], r3, LSL #3
adresse valeur
100010
r1 0x00000000 10000C
r2 0x00100000 100008
r3 0x00000001 100004
100000 0x9876C4A1
0x1 LSL #3 = 0x8 mmoire

r1 0x9876C4A1
r2 0x00100008
r3 0x00000001
155
exemple
lors dun chargement dun byte non sign les 24 bits de poids fort sont
mis 0
LDRB r1, [r2, #2]

adresse valeur
r1 0xxxxxxxxx 100008
r2 0x00100004 100004 0x9876C4A1
100000

r1 0x000000C4
r2 0x00100004

156
exemple
Mot non-align: lorsque ladresse nest pas multiple de 4, le mot entier
est transfr dans le registre, mais le byte dsign par ladresse
devient le byte de poids fort
LDR r1, [r2, #2]
adresse valeur

100008
r1 0x00000000
100004 0x9876C4A1
r2 0x00100004
100000

mmoire

r1 0xC4A19876
r2 0x00100004

157
exemple
Mot non align: lorsquun mot est stock en mmoire une adresse
non divisible par 4, les deux derniers bits de ladresse sont mis zro
et le mot stock cette adresse
STR r1,[r2,#0]

adresse valeur
r1 0x12345678 100008
r2 0x00100007 100004 0x12345678
100000

158
exemples
pr index avec mise jour
LDR r0, [r1, #0x4]! r0=mem32[r1+0x4] r1 += 0x4

LDR r0, [r1,r2]! r0=mem32[r1+r2] r1 += r2

LDR r0, [r1, r2, LSR#0x4]! r0=mem32[r1+(r2 LSR 0x4) r1 += (r2 LSR 0x4)

pr index
LDR r0,[r1,#0x4] r0=mem32[r1+0x4] r1 pas mis jour
LDR r0,[r1,r2] r0=mem32[r1+r2] r1 pas mis jour
LDR r0,[r1, -r2,LSR #0x4] r0=mem32[r1-(r2 LSR 0x4)] r1 pas mis jour

159
exemples
post index
LDR r0, [r1], #0x4 r0=mem32[r1] r1 += 0x4

LDR r0,[r1],r2 r0=mem32[r1] r1 += r2

LDR r0, [r1], r2, LSL #0x4 r0 = mem32[r1] r1 += r2 LSL 0x4

160
transferts de multiples registres
Une seule instructions peut transfrer le contenu de plusieurs registres
vers/depuis la mmoire. Le transfert dbute depuis une adresse de
base contenue dans un registre Rn.

Une interruption ninterrompt pas lexcution dune instruction de


transfert multiple. Si N est le nombres de registres transfrer et t est
le nombre de cycle ncessaires par accs alors les 2+Nt cycles sont in-
interruptibles.

Certains compilateurs permettent de limiter le nombre maximum de


registres transfrs ce qui permet de diminuer le temps maximum de
latence du systme (par exemple rponse une interruption dans les
systmes temps-rels).

161
transferts de multiples registres
syntaxe: <LDM | STM>{<cond>}<mode adressage> Rn{!}, <registres>{^}

multiple

mode
description adresse dbut adresse fin Rn!
adressage
IA Incrmente aprs Rn Rn+4*n-4 Rn+4*N
IB incrmente avant Rn + 4 Rn+4*N Rn+4*N
DA dcrmente aprs Rn-4*N+4 Rn Rn-4*N
DB dcrmente avant Rn-4*N Rn-4 Rn-4*N

162
exemple
LDMIA r0!, {r1-r3}

r0 est le registre de base

! indique que le registre r0 est mis jour aprs lexcution de


linstruction
adresse valeur

0x80020 0x00000005

r0 0x00080010 0x8001c 0x00000004

r1 0x00000000 0x80018 0x00000003

r2 0x00000000 0x80014 0x00000002

r3 0x00000000 0x80010 0x00000001

163
exemple

r0 0x8001c
r1 0x00000001
r2 0x00000002
r3 0x00000003

0x80020 0x00000005
r0 0x8001c 0x00000004
0x80018 0x00000003
0x80014 0x00000002
0x80010 0x00000001
164
exemple
LDMIB r0!, {r1-r3}

r0 est le registre de base

! indique que le registre r0 est mis jour aprs lexcution de


linstruction
adresse valeur

0x80020 0x00000005

r0 0x00080010 0x8001c 0x00000004

r1 0x00000000 0x80018 0x00000003

r2 0x00000000 0x80014 0x00000002

r3 0x00000000 0x80010 0x00000001

165
exemple

r0 0x8001c
r1 0x00000002
r2 0x00000003
r3 0x00000004

0x80020 0x00000005
r0 0x8001c 0x00000004
0x80018 0x00000003
0x80014 0x00000002
0x80010 0x00000001

166
exemple
les instructions STM<cond> et LDM<cond> doivent tre utiliss par
paires pour lire/crire les mmes registres, par exemple lors dune
sauvegarde sur la pile

STMIA LDMDB
STMIB LDMDA
STMDA LDMIB
STMDB LDMIA

167
exemple
r0 0x00090000
r1 0x00000009
r2 0x00000008 avant
r3 0x00000007

0x0009010
STMIB r0!, {r1,r2,r3}
0x000900c 0x00000007
MOV r1, #1
0x0009008 0x00000008
MOV r2, #2
0x0009004 0x00000009
MOV r3, #3
0x0009000
r0 0x0009000c
r1 0x00000001
r2 0x00000002
aprs
r3 0x00000003
168
exemple
r0 0x0009000c
r1 0x00000001
avant
r2 0x00000002
r3 0x00000003

0x0009010
LDMDA r0!, {r1,r2,r3}
0x000900c 0x00000007
0x0009008 0x00000008
0x0009004 0x00000009
r0 0x00090000 0x0009000
r1 0x00000009
r2 0x00000008
aprs
r3 0x00000007

169
exemple
copie dune zone mmoire vers une autre zone
; le registre r9 pointe sur le dbut de la zone source
; le registre r10 pointe sur le dbut de la zone destination
; le registre r11 pointe sur la fin de la zone source
; les transferts sont effectus par blocs de 32 bytes
loop
; charger un bloc de 32 bytes depuis la mmoire
LDMIA r9!, {r0-r7}
; transfrer le bloc vers la mmoire
STMIA r10!, {r0-r7}

; a-t-on termin?
CMP r9, r11
BNE loop
170
exemple

destination
r10

r11
source
r9

171
la pile
0x1000c
0x10008 3
0x10004 2
pile ascendante A
0x10000 1
0x0fffc
0x0fff8
0x0fff4

0x1000c
0x10008
0x10004
pile descendante D
0x10000 1
0x0fffc 2

0x0fff8 3

0x0fff4 172
la pile
On parle de pile pleine F (full stack) si le pointeur de pile (sp) pointe sur
le dernier lment qui a t empil

On parle de pile vide E (empty stack) si le pointeur de pile (sp) pointe


sur le premier lment non utilis de la pile

les oprations de base sur la piles sont:


push empil un lment sur la pile
pop dpile le dernier lment empil

selon les options choisies pour dfinir la pile (A, D, F, E) les instructions
pop et push sont codes diffremment

173
oprations sur la pile

Mode
description pop =LDM push =STM
adressage

full
FA LDMFA LDMDA STMFA STMIB
Ascending

full
FD LDMFD LDMIA STMFD STMDB
descending

empty
EA LDMEA LDMDB STMEA STMIA
ascending

empty
ED LDMED LDMIB STMED STMDA
descending
174
exemple
r1 = 0x00000002
r4 = 0x00000003
sp = 0x00080014
STMFD sp!, {r1,r4}

0x00080018 0x00000001 0x00080018 0x00000001


sp
0x00080014 0x00000002 0x00080014 0x00000002
0x00080010 empty 0x00080010 0x00000003
sp
0x0008000c empty 0x0008000c 0x00000002

avant aprs

175
exemple
r1=0x00000002
r4=0x00000003
sp=0x00080010
STMED sp!, {r1,r4}

0x00080018 0x00000001 0x00080018 0x00000001


0x00080014 0x00000002 0x00080014 0x00000002
sp
0x00080010 empty 0x00080010 0x00000003
0x0008000c empty 0x0008000c 0x00000002
sp
0x00080008 empty 0x00080008 empty

avant aprs
176
attributs
les attributs respecter pour une pile sont
ladresse de base
le pointeur de pile
ladresse limite de la pile (stack limit)

pour une pile descendante, par exemple, le code suivant vrifie que la
pile reste dans la limite, sinon appel une routine _stack_overflow
SUB sp, sp, #size attention valeur immdiate sur 8 bits
CMP sp, r10 registre r10 stack limit sl
BLLO _stack_overflow

Branch + Link + LO est la condition plus petit strictement non sign

177
exemples - remarques
le signe ^ modifie le comportement des instructions. Le processeur ne
doit pas se trouver en mode utilisateur ou systme (par exemple lors
du traitement dune interruption).

Dans ce cas les registres qui apparaissent dans la liste sont les
registres en mode utilisateur. Si le pc est dans la liste, le spsr est copi
dans le cpsr

LDMFD sp!, {r0-pc}^ retour dune exception et mise a jour du cpsr

178
Instruction swap
Linstruction swap est une instruction du type load/store spcialise.
Elle permute le contenu dune position mmoire avec le contenu dun
registre. Linstruction est atomique, cest--dire que les cycles de
lecture et dcriture seffectuent pendant le mme cycle bus. Aucune
instruction peut modifier le registre ou la position mmoire avant la fin
de linstruction, le systme garde le contrle du bus.

Syntaxe: SWP{B}{<cond>} Rd, Rm, [Rn]

tmp = mem32[Rn]
permute les mots dune position mmoire et
SWP mem32[Rn] = Rm
dun registre
Rd = tmp
tmp = mem8[Rn]
SWPB permutation dun byte mem8[Rn] = Rm
Rd = tmp 179
exemple
mem32[0x9000] = 0x12345678
r0 = 0x00000000
r1 = 0x11112222
r2 = 0x00009000

SWP r0, r1, [r2]

mem32[0x9000] = 0x11112222
r0 = 0x12345678
r1 = 0x11112222
r2 = 0x00009000

180
exemple
Linstruction swap permet dimplmenter un mcanisme de smaphore
pour grer laccs une ressource partage.

algorithme:
ladresse smaphore contient #1 si la ressource est dj utilise et ne peut
pas tre accde.
Si la ressource peut tre accde ladresse smaphore contient une autre
valeur.
Une tche doit donc tester la valeur contenue ladresse smaphore et
rserver laccs la ressource si elle est disponible.
Le test et la modification de la valeur doit seffectuer de manire atomique
cest--dire sans quaucune tche puisse accder la valeur pendant la
lecture et lcriture de la valeur (situation idem celle discute avec les
interruptions)

181
exemple
1er processus 2me processus

lecture de la valeur
valeur = 0x0 ok ressource
accessible commutation de tche

lecture de la valeur
valeur = 0x0 ok ressource
accessible
criture 0x1 ladresse
smaphore pour rserver
la ressource (trop tard)

temps 182
exemple - smaphore
Le code correct pour implmenter un smaphore

spin
MOV r1, smaphore r1 contient ladresse
MOV r2, #1 valeur tester
SWP r3, r2, [r1] place #1 ladresse + r3
CMP r3, #1 est-ce que la ressource est ok
BEQ spin

183
Instruction dInterruption logicielle
Les interruptions logicielles sont un mcanisme utilis par exemple par
les applications pour faire des appels aux routines du systme
dexploitation.

syntaxe: SWI{<cond>} SWI_number


voir les modes, superviseur
adresse de la table

SWI interruption logicielle lr_svc = adresse de linstruction qui suit le SWI


spsr_svc = cpsr
pc = vectors + 0x8
cpsr mode = SVC (change de mode)
cpsr I = 1 (masque les interruptions)

184
exemple
cpsr = n z c V q i f t_user
pc = 0x00008000
lr = 0x003fffff; lr = r14
r0 = 0x12

SWI 0x123456

cpsr = n z c V q I f t_svc
spsr = n z c V q i f t_user
pc = 0x00000008
lr = 0x00008004 pas de sauvegarde ncessaire
r0 = 0x12 paramtre, le registre r0 nest pas
modifi

185
exemple - suite
les registres peuvent tre utiliss pour passer des paramtres la
routine dinterruption

pour retrouver le SWI_number il faut excuter


<SWI-instruction> AND NOT 0Xff000000

ladresse de linstruction SWI est connue grce au registre lr

code de linstruction SWI

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

cond 1111 valeur immdiate 24 bits


186
gestionnaire dinterruption
SWI_handler
; sauvegarde des registres r0-r12 et lr
STMFD sp!, {r0-r12, lr}
; lecture de linstruction SWI
LDR r10, [lr, #-4]
; on masque les 8 bits de poids fort
BIC r10, r10, #0xff000000 bit clear
; r10 contient le SWI_number
BL routine
; retour indique que le registre
cpsr doit tre mis--jour
LDMFD sp!, {r0-r12, pc}^ avec le contenu de
spsr_svc

187
Remarque sur lexcution
Lorsque le processeur excute linstruction
SWI SWI_number
Lexception correspondante (SWI) est leve et le processeur change la
valeur du pc par 0x8, la valeur correspondante dans la table
dinterruption. Il va donc excuter cette instruction qui est dans notre
cas une instruction
B SWI_handler.

Cette instruction ne modifie pas le link register (lr) et donc lr pointe sur
linstruction qui suit linstruction SWI.

188
instructions et cpsr
Le jeu dinstruction ARM met disposition deux instructions pour
contrler le registre cpsr. Il sagit dinstructions qui permettent de
sauver et restaurer le contenu du registre dtat. En mode utilisateur les
bits peuvent tre lus et seulement le champ flag peut tre modifi.
= psr
Syntaxe: MRS{<cond>} Rd, <cpsr | spsr>
MSR{<cond>} <cpsr | spsr>_<fields>, Rm
MSR{<cond>} <cpsr | spsr>_fields, #immediate

MRS sauvegarde dun psr dans un registre Rd = psr

MSR copie le contenu (partiel)dun registre vers un psr psr[field] = Rn

psr[field]189
=
MSR copie une valeur immdiate (partiellement) vers un psr
immdiate
exemple - cpsr
cpsr = n z c v q I F t_SVC

MRS r1, cpsr


BIC r1, r1, #0x80 0b01000000
MSR cpsr_c, r1

cpsr = n z c v q i F t_SVC
les diffrents champs sont

flags (f) status (s) extension e control (c)

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

N Z C V I F T mode

190
instructions coprocesseur
les instructions coprocesseur tendent le jeu dinstruction du
processeur. Le coprocesseur peut fournir des ressources de calculs
supplmentaires ou contrler la mmoire du systme (mmoire cache
et gestionnaire de mmoire).

Ces instructions dpendent des coprocesseur utiliss, elles ne font pas


parties du processeur ARM.

191
LDR Rd, #imm_32
Les instructions ARM sont codes sur 32 bits, il est donc impossible de
coder une valeur immdiate sur 32 bits charger dans un registre.
Lassembleur ARM propose nanmoins des pseudo-instructions.

Syntaxe: LDR Rd, =constant valeur immdiate


ADR Rd, label

LDR charge une valeur immdiate sur 32 bits Rd = constante sur 32 bits

ADR charge ladresse effective dun label Rd = ladresse sur 32 bits


192
pseudo-instructions
Le compilateur effectue la traduction des pseudo-instructions en
instructions ARM

LDR r0, =0xff devient MOV r0, #0xff valeur immdiate sur 8 bits

LDR r0, =0x55555555 devient LDR r0, [pc, #offset_12]

valeur relative de ladresse ou se trouve


la valeur immdiate charger dans r0

193
instructions conditionnelles
Lintrt des instructions conditionnelles est de rduire les instruction
de rupture de squence qui pnalisent le bon fonctionnement du
pipeline.

calcul du plus grand commun diviseur


while(a!=b)
{
if (a>b) a-=b; else b-=a;
}

194
instructions conditionnelles
ce qui peut scrire en assembleur (r1 est a et r2 est b)

gcd
CMP r1, r2
BEQ complete
BLT lessthan
SUB r1, r1, r2
B gcd
lessthan
SUB r2, r2, r1
B gcd
complete

195
instructions conditionnelles
ou encore

gcd
CMP r1, r2
SUBGT r1, r1, r2
SUBLT r2, r2, r1
BNE gcd

196
Cache
Vitesse dun processeur ~ 1GHz, temps de cycle 1 nanosecondes
(=10^-9 secondes)

Accs mmoire SRAM 20 nanosecondes

Les accs mmoires sont trs couteux en temps


On observe:
Les performances des mmoires voluent moins vite que celle des
processeurs
Augmenter la taille du bus pour transfrer plus de bits par cycle bus.
Cela fonctionne si les accs sont des positions mmoires contiges
(plus de complexit)
Rduire les accs en mmoire externe en utilisant de la mmoire cache
(antmmoire). Ces mmoires sont trs rapides mais la capacit de
stockage est limite.
197
Cache
processeur mmoire

Mmoire
cache 0x

0xDD30003F
0xDD30003F
0x...

Les informations (donnes ou programme) mmoris en mmoire cache sont


accdes beaucoup plus rapidement. Lutilisation de mmoire cache est plus
complexe, par exemple on doit sassurer de la cohrence des informations
entre mmoire cache et mmoire centrale
198
Cache
principe de fonctionnement
Le principe de fonctionnement est le suivant.
Si une position mmoire est souvent accde, linformation nest plus
sauvegarde en mmoire externe mais en mmoire cache.
Linformation va donc tre accde beaucoup plus rapidement (pas de
cycle bus)
1. Est-ce que le mot se trouve en mmoire cache, si oui la donne est
transfre au processeur (cache hit)
2. Sinon (cache miss), on effectue un cycle bus (lent) pour chercher
linformation en mmoire externe (centrale) et on place linformation
en mmoire cache pour un accs ultrieur. Si le cache est plein il
faut choisir
1. si la donne doit en remplacer une autre
2. La donne est rarement accde et nest pas place en cache

199
Cache
principe de fonctionnement
Les performances de lutilisation de la mmoire cache dpendent des
chance de succs (cache hit) et donc de lalgorithme de remplacement
des donnes en mmoire cache. Pour comprendre comment
seffectuent les accs en mmoire on effectue un grand nombre dtude
statistique sur des programmes choisi.
On observe:
1. Lorsquune instruction rfrence une adresse il est trs probable
que les prochains accs soit dans un voisinage de cette adresse.
Par exemple, accs un tableau, les instructions sont disposes
squentiellement en mmoire. Cest le principe de localit
spatiale.
2. Lorsque le processeur rfrence un mot donn, il est trs probable
que ce mot soit rfrenc dans les instants qui suivent. Cest le
principe de localit temporelle

Si les accs mmoire taient alatoire, les mmoires cache ne seraient


pas efficaces
200
Cache - cohrence
Lorsque lon utilise de la mmoire cache, on utilise deux positions
mmoires diffrentes pour stocker la mme information.
Lorsque lon modifie la valeur dune donne qui se trouve en cache on
a deux options:
1. On modifie la donne en mmoire cache et en mmoire externe
simultanment. Cest a stratgie criture immdiate (write
through). Linformations qui se trouve en mmoire cache et
externe est donc toujours cohrente (cest la mme).
2. On modifie la donne en mmoire externe quand cest le moins
pnalisant pour le systme, cest la stratgie dcriture diffre
(write back). On a plusieurs options. Par exemple, on crit en
mmoire externe lorsque le bus est inutilis ou seulement lorsque
linformation en mmoire cache doit tre rutilise. La cohrence
nest pas garantie en permanence, mais les temps dcriture est
plus faible.

201
Exemple Cache direct
On suppose quon dispose dune mmoire centrale dune capacit de
10000 mots, les adresses voluent donc de 0000 9999. On
dcompose ladresse en ltiquette, lindex et loffset. Par exemple,
ladresse 0215 est dcompos en :
02 = ltiquette Lindex Loffset
1 = lindex Ltiquette
5 = loffset 02 1 5

On dispose dun rpertoire qui associe chaque valeur possible de


lindex (0,1,2,,9) une cl permettant didentifier une ligne (tiquette) et
un bit qui indique si les donnes sont valides.
La mmoire cache est organis par ligne de 10 mots (ici 10 lignes)
On dispose dun comparateur qui vrifie si la valeur de ltiquette est
gales la cl.

202
Lindex Mmoire centrale
Ltiquette Loffset
00 0 0
02 1 5
00 1 0
00 2 0
cl 00 3 0
0 0 01

1 1 02 A B C D E F G H I J

2 0 02
02 0 0
3 0 02 02 1 0 A B C D E F G H I J

4 0 00 02 2 0
02 3 0
5 0 99

6 0 03

7 0 00

8 0 99 99 9 0

9 0 04
adresses donnes
Rpertoire Mmoire cache 203
bit validit Comparateur
Cache direct
pseudo-code

si rpertoire[index] = tiquette & bit de validit alors


charger le processeur avec mmoire_cache[index,offset]
sinon
sauvergarder mmoire_cache[index] dans la mmoire centrale
rpertoire[index]=tiquette
charger mmoire_cache[index] depuis la mmoire centrale
charger le processeur avec mmoire_cache[index,offset]
finsi

204
Cache direct
exemple
En supposant que la mmoire cache est dans ltat indiqu sur le
prcdent transparent, on dsire accder successivement les
adresses:
0215 succs (cache hit) la donne est transfre depuis la mmoire
cache
0212 re-succs
0114 chec (cache miss) on modifie lentre de la mmoire cache qui
correspond lindex 1
0225 chec, cause du bit de validit (=0), chargement de la ligne
0116 succs
On observe que toutes les adresses du type 011x, 021x, 031x, etc
donnent lieu des collisions car elles utilisent le mme index.

205
Cache purement associative
Ces mmoires caches utilisent autant de comparateurs que de lignes
de cache, ce qui permet de supprimer lindex dans le rpertoire.

206
Ltiquette Loffset Mmoire centrale

0000
023 5
0010
0020
0030
0 001

1 003

2 022
0200
cl 3 0210

4 023 A B C D E F G H I J 0220
0230 A B C D E F G H I J
5
6
7 000

8 998 9990

9
adresses donnes
Rpertoire Mmoire cache 207
validit
Comparateurs
Mmoire cache associative
pseudo-code
si rpertoire contient ltiquette & bit de validit alors
transfrer la donne vers le processeur depuis la mmoire
cache
sinon
si rpertoire est plein alors
appliquer un algorithme pour choisir une ligne
modifier la valeur de la ligne choisie en mmoire cache
avec les donnes qui se trouvent en mmoire centrale
transfrer les donnes vers le processeur
sinon
choisir une ligne vide et transfrer les donnes
correspondantes depuis la mmoire centrale
transfrer les donnes vers le processeur
finsi
finsi 208
Mmoire cache associative
Ce type de mmoire est plus couteux que la mmoire cache directe,
principalement cause des comparateurs

Ce type de mmoire est plus flexible lusage (plus dindex)

Lalgorithme de choix dune ligne a remplacer est critique pour les


performances de fonctionnement du cache. Un algorithme classique
est LRU qui consiste remplacer la ligne qui t le moins
rcemment utilise

209
Localisation des caches
On distingue trois niveau de mmoire cache
1. Un cache de petite capacit, trs rapide intgr au
processeur

capacit
vitesse

2. Un cache de plus grande capacit, situ lextrieur du


processeur et reli par un bus ddi

3. La mmoire centrale

210
cache de niveau 2

cache de niveau 1

Mmoire centrale
processeur cache de niveau 3
SRAM

instruction DRAM
donnes

211
Conclusion mmoire cache
Les mmoires caches permettent damliorer les performances dun
systme informatique en rduisant les temps daccs (lecture/criture)
en mmoire centrale

La question de la cohrence entre linformation contenue dans la cache


et la mmoire centrale est critique et peut engendrer un mauvais
fonctionnement du systme. Par exemple:
Si on accde une position mmoire qui correspond un registre dun
priphrique (pour commander ou configurer) alors le cache prvient le
processeur de tout accs au priphrique.
Dans un environnement multiprocesseur, certaines variables sont
partages entre les processeurs et la cohrence doit toujours tre
garantie.
Mis--part les processeurs, certains priphriques ncessitent
dassurer la cohrence en permanence.

212
Retour sur les mmoires caches
Les systmes ARM propose des mmoires caches. On se propose de
passer en revue les diffrents systmes. On dtaillera aussi certains
mcanismes suggrs au dbut du cours.

La fonction de la mmoire cache est de conserver des donnes qui se


trouvent en mmoire centrale et permettre des accs beaucoup plus
rapides.

Pour acclrer les critures en mmoire centrale le systme dispose


dun write buffer. Il sagit dune mmoire tampon de type FIFO, place
entre le processeur et la mmoire centrale. Les critures en mmoire
centrale sont effectues par le buffer pour librer, autant que possible,
le processeur.

213
Hirarchie
Processeur registres

Tightly coupled
memory (TCM) write buffer
cache L1

SRAM
DRAM
FLASH mmoire non volatile

Mmoire externe

214
Hirarchie
La mmoire TCM se trouve sur le chip.

Le cache reprsent est un cache de niveau 1 (L1). certaine systmes


ont plusieurs niveaux de cache.
Un cache de niveau 2, L2, se trouve entre le cache L1 et une mmoire.
Pour la gestion de plusieurs cache ont doit se proccuper des
problmes de cohrence entre les diffrents cache.

De manire gnral, le processeur cherche une donne (instruction)


dans le cache de niveau 1 (L1) puis, si chec, dans le cache de niveau
suivant. On parle de cache plusieurs niveaux.
Une mmoire cache peut-tre efficace entre deux niveaux de mmoire
dont les temps daccs sont trs diffrents.
215
Transferts
Les transferts de donnes entre le cache (L1) et la mmoire centrale se
fait par blocks, appels aussi cache lines.

Les critures de la mmoire cache seffecteuent rapidement travers


le Write buffer. Les critures de ce tampon vers la mmoire centrale se
font la vitesse de la mmoire (lentement).

216
Transferts
accs direct la mmoire Mmoire
Processeur centrale
lent

transferts
rapide block
Cache
lent

rapide Mmoire
Processeur
centrale
Write
buffer lent

217
Caches virtuels
Certains systmes disposent dun circuit MMU, Memory Management
Unit, qui soccupe de traduire les adresses (virtuelles) manipules par
le processeur en adresse physique. La mmoire cache peut-tre
place soit

Entre le processeur et le circuit MMU, on parle de cache vituel ou


logique.
Entre le circuit MMU et la mmoire central, on parle de cache physique.

Les curs ARM7- ARM10 utilsent des caches logiques.


(comme les processeurs Intel XScale)

La famille ARM11 utilise un cache physique.

218
Architecture de base
Larchitecture de cache de base propose pour les systmes ARM est un cache
accs direct.
cache line
Miss
31

Tag

Compare Cache Tag v d word3 word2 word1 word0

Cache Tag v d word3 word2 word1 word0


12
11 Cache Tag v d word3 word2 word1 Word0

Set
Index Cache Tag v d word3 word2 word1 word0

Cache Tag v d word3 word2 word1 word0

Cache Tag v d word3 word2 word1 word0

4
3

Data 219
Index
Architecture de base
Comme prcdemment, le Set Index (bits 4-11) pointe sur une entre
de la mmoire cache et le Tag (bits 12-31) est compar avec lentre
de la cache.

Le bit de validit v indique si la ligne de donne (cache line) est valide.

Le bit d (dirty) indique que la donne a t modifie par le processeur


(criture). Ce bit indique que lentre correspondante de la mmoire
centrale doit tre mise--jour (si writeback).

220
Fonctionnement
On a vu que les transferts entre la mmoire centrale et la mmoire
cache taient raliss par blocks, (4 mots de 32 bits).

La mmoire cache implmente une technique appele Data Streaming


lorsquune nouvelle ligne du cache est charge. La mmoire cache est
capable de simultanment fournir la donne au processeur et charger
la ligne du cache.

Le Data Streaming permet de ne par pnaliser un accs en mmoire


centrale aprs un cache miss.

221
Fonctionnement
Lorsquune ligne de la mmoire cache est valide et quon doit la
remplacer, les mmoires cache accs direct peuvent tre inefficace.

Par exemple on considre lexcution de la boucle


do {
routineA();
routineB();
x--;
} while (x>0)

222
Fonctionnement
Avec les routines routineA() et routineB() qui se trouvent aux adresses

0x00000480 et 0x00001480 respectivement

et les donnes accdes en 0x00002480

Dans cette situation, lexcution des routines ne se fera jamais depuis


la mmoire cache

223
Mmoire associative
Pour palier ce problme, on utilise des mmoires caches accs indirect qui
stocke les entres Cache Tag dans une mmoire associative.

Une solution intermdiaire propose pour les systmes ARM, est de mettre
disposition quatre structures de mmoires cache pour chaque valeur de
lindice (Set Index). On divise le nombre dentre de la mmoire cache par 4,
mais on contourne le problme mentionn prcdemment. Cette solution limite
la complexit du circuit par rapport une mmoire cache associative.

31 10 9 4 3 1

Cache Tag Set Index Data Index

224
Miss
31

Compare Cache Tag v d word3 word2 word1 word0

Cache Tag Cachev Tag v d


d word3 word3
word2 word2
word1 word1
word0 word0
10
9 Cache Tage v dCache
Cache Tag vTag
word3 v d word3
d word3
word2 word1 word2
word2 Word0 word1
word1 word0

Cache Tag CachevTag


d v d word3
word3 word2 word2
word1
Cache Tage v d word3 word2 word1 Word0
Cache Tag
Cache Tage v d word3
v d word3 word2 word2word1
Cache Tag v d word3 word2 word1 word0
Cache Tage v d word3 word2
Cache TagCache Tag
v d word3v d word3
word2 word2
word1 word1
word0 word0

v Cache
Cache TagCache Tag Tag
v d
d word3 v d word3
word3
word2 word1 word2
word2 word0 word1
word1 word0
Cache Tag
Cache Tag v d v d word3
word3 word2 word2
word1
4 Cache Tag v d word3 word2 word1 word0
3
Cache Tag
Cache Tag v d v d
word3 word3
word2 word2
word1
Cache Tag v d word3 word2

225
ARM940T - cache
Ce processeur dispose dune mmoire cache qui met en parallle 64
structure de mmoire cache. Chaque structure de mmoire cache
(way) dispose de 4 entres, lindice (SetI Index) est cod sur 2 bits, et
utilise une mmoire associative.

226
ARM940T - cache
31

CAM3 Cache Tag v d Data


CAM3 Cache Tag v d Data
CAM2CAM3 Cache
Cache Tag Tag v d v d Data Data
CAM2CAM3 CacheCache
Tag Tagv d v d Data Data
CAM1CAM2CAM3 Cache
Cache Cache Tag
Tag Tagv d v d v d data Data Data
CAM1CAM2CAM3Cache TagCache
Cache Tagv Tag
d v d v d data Data Data
CAM3
CAM0CAM1CAM2Cache TagCache
Cache Cache
d v Tag
Tagv Tag v d data Data Data
d v d Data
CAM0CAM1CAM2CAM3
Cache TagvCache
TagCache
Cache d v Tag
Tag v d data Data Data
d v d Data
CAM0CAM1CAM2Cache TagCache
Cache Tagv Tag
d v d v d Data data Data
CAM0CAM1CAM2 Tag Tagv Tag
Cache
Cache Cache d v d v d Data data Data
6
5 Select CAM0CAM1 CacheCache
Tag Tagv d v d Data data
CAM0CAM1 Cache Cache
Tag Tagv d v d Data data
CAM0 Cache Tag v d Data
4 CAM0 Cache Tag v d Data
3

227
Stratgie dcriture
Les stratgie dcriture des systmes de mmoire caches ARM sont
classiques:
Writethrough: Chaque criture dans la mmoire cache est reproduite
en mmoire centrale. La cohrence est assure en permanence.

Writeback: Les critures dans la mmoire cache ne sont pas


ncessairement reproduites en mmoire centrale et ltats des
mmoires peut-tre incohrents.
Lorsque le processeur crit dans le cache, il positionne le bit dirty de
manire indiquer lincohrence. Lorsque la ligne sera supprime du
cache, lcriture se fera.
Ce mcanisme est efficace, par exemple, pour les variables locales
une procdure qui ne doivent pas tre sauves en mmoire centrale.

228
Stratgie de remplacement des
lignes
Principalement deux stratgies:
Round-robin: La mmoire cache gre un pointeur qui est la prochaine
ligne remplacer. Le pointeur est incrment dune unit chaque
remplacement (modulo le nombre de ligne)

Pseudorandom: La ligne remplacer est choisie alatoirement.

229
Stratgie dallocation des lignes
Pour lallocation des lignes, il y a aussi deux stratgies possibles:

1. (read-allocate) une ligne du cache est alloue chaque fois quune


lecture est effectue pour une donne qui ne se trouve pas dans
le cache (read-miss). Avec cette stratgie, une criture dune
donne qui ne se trouve pas en mmoire cache se fait
simplement en mmoire centrale. Si la donne se trouve en
cache, le fonctionnement dpend de la stratgie writethrough ou
writeback.
2. (write-allocate) mme comportement quau dessus pour les
lectures. Lorsquune criture se produit, le cache alloue une ligne.

230
ARM720T Writethough Random Read-miss
ARM740T Writethough Random Read-miss
ARM920T Writethough, writeback Random, Read-miss
round-robin
ARM940T Writethough, writeback Random Read-miss
ARM926EJS Writethough, writeback Random , Read-miss
round-robin
ARM946E Writethough, writeback Random , Read-miss
round-robin
ARM10202E Writethough, writeback Random , Read-miss
round-robin
ARM1026EJS Writethough, writeback Random , Read-miss
round-robin
Intel Writeback Round-robin Read-miss
StrongARM
Intel XScale Writethough, writeback Round-robin Read-miss,write-
miss
231
Fonctionnement par lexemple
Le cur ARM940T propose les deux stratgies de remplacement
alatoire et round-robin.

La structure du cache est de proposer 64 structures de cache parallle


et dindexer sur 4 mmoires associative diffrentes.

On cherche crire un programme qui va rapidement remplir la


mmoire cache.

Pour cela, on accde a des adresses mmoires qui correspondent


des entres du cache diffrentes:
0x20000, 0x20040, 0x20080, 0x200C0, 0x20100, etc.
Aprs 64 lecture on a rempli les entres du cache qui correspondent
lindex (Data Index) 0 et la mmoire associative 0. 232
Exemple
int readSet(int times, int numset) {
int setcount, value;
volatile int *newstart;
volatile int *start = (int*)0x20000;

_asm {
timesloop:
MOV newstart, start
MOV setcount, numset
setloop:
LDR value, [newstart, #0]
ADD newstart, newstart, #0x40
SUBS setcount, setcount, #1
BNE setloop
SUBS times, times, #1
BNE timesloop
}
return value;
}
233
Rsultats
Avec numset = 64 et Round-Robin : 0.51 secondes

Avec numset = 64 et Alatoire: 0.51 secondes

Avec numset = 65 et Round-Robin: 2.56 secondes

Avec numset = 65 et Alatoire: 0.58 secondes.

234
Programmation efficace en C

235
Introduction
La programmation bas-niveau des systmes ce fait en assembleur et
souvent en C. Programmer en C ncessite lutilisation dun compilateur
qui doit tirer parti de la structure particulire du processeur et de son
jeu dinstruction pour gnrer du code aussi adapt que possible, cest-
-dire:

qui sexcute le plus rapidement possible


qui est aussi compacte que possible

La structure du code source (en C) un impact sur les performances


du code assembleur gnr.

236
Types de donnes en C
Comment le compilateur utilise les ressources du processeur pour
dfinir les types de donnes C en assembleur et quels types sont plus
avantageux que les autres.

Les processeur ARM7 possdent des registres de 32 bits et des


instructions sur des donnes 32 bits. Larchitecture est de type
load/store, les instructions sexcutent seulement sur les registres (pas
en mmoire)

Nanmoins, le jeu dinstruction dispose dinstructions permettant de


manipuler des donnes de 8, 16, 32 ou 64 bits

237
Types de donnes en C
Type de donne C taille

char 8 bits non sign

short 16 bits sign

int 32 bits sign

long 32 bits signe

long long 64 bits sign

238
Type de donnes en C
ATTENTION: les compilateurs C dfinissent habituellement le type
char comme une donne signe sur 8 bits alors que les compilateur
gcc utilise le type non sign pour les caractres.

Ceci car les premires version du proc. ARM ne pouvait pas manipuler
facilement les donnes 8 bits signe (portabilit du code.).

Il faut donc viter dutiliser un caractre (char i) comme variable de


compteur de boucle avec une condition du type (i>0).

239
Instruction load/store
Pre-ARMv4 LDRB charge une valeur 8 bits non signe

STRB transfert une valeur 8 bits signe ou non

LDR 32 bits signe ou non

STR 32 bits signe ou non

ARMv4 LDRSB 8 bits signe

LDRH 16 bits non signe

LDRSH 16 bits signe

STRH 16 bits signe ou non

ARMv5 LDRD 64 bits signe ou non

STRD 64 bits signe ou non 240


Instructions load/store
Les instructions load qui sexcutent sur des donnes signes de 8 ou
16 bits doivent tendre le signe sur 32 bits, le registre est
compltement utilis pour manipuler la donne (calcul interne sur 32
bits).

Charger une donne de type int en C (depuis 8, 16 ou 32 bits en


mmoire) ncessite aucune instruction supplmentaire lextension du
signe est automatiquement prise en charge.

Lors du transfert de la valeur dun registre vers une position mmoire


sur 8 ou 16 bits les bits de poids faible du registre sont considrs.

241
Variables locales
Les instructions ARM portent gnralement sur des donnes 32 bits.
Les variables locales doivent de prfrence tre de type int ou long.
Les types char ou short doivent tre vits. Si on travail en utilisant une
arithmtique modulo 256 (255+1=0) alors ce sont les bons types a
utiliser.

Exemple: un programme qui calcule une somme de contrle (CRC).

242
Exemple 1
int checksum_v1(int *data)
{
char i; // hypothse fausse: un char occupe moins de place
//car les registres sont 32 bits ainsi que les entres de la pile
int sum=0;

for(i=0; i<64; i++)


{
sum += data[i]; // comme cest un char, il faut calculer modulo 256
}
return sum;
}

243
Exemple 1
code assembleur (i est du type char)
checksum_v1
MOV r2, r0 ; r2 = data
MOV r0, #0 ; sum = 0
MOV r1, #0 ;i=0
checksum_loop
LDR r3, [r2, r1, LSL #2] ; r3 = data[i]
ADD r1, r1, #1 ; r1 = i + 1
AND r1, r1, #0xff ; i = (char) r1
CMP r1, #0x40 ; le paquet contient 64 mots
ADD r0, r3, r0 ; sum += r3
BCC checksum_loop ; if (i<64) loop
MOV pc, r14

244
Exemple 1
code assembleur (i est du type int)
checksum_v2
MOV r2, r0 ; r2 = data
MOV r0, #0 ; sum = 0
MOV r1, #0 ;i=0
checksum_loop
LDR r3, [r2, r1, LSL #2] ; r3 = data[i]
ADD r1, r1, #1 ; r1 = i + 1
CMP r1, #0x40 ; le paquet contient 64
mots
ADD r0, r3, r0 ; sum += r3
BCC checksum_loop ; if (i<64) loop
MOV pc, r14

245
Exemple 2
les donnes sont sur 16 bits

short checksum_v3(short *data)


{
unsigned int i;
short sum=0;

for(i=0; i<64; i++)


{
sum = (short)(sum + data[i]); // x+y est du type int
}
return sum;
}

246
Exemple 2
code assembleur (les donnes a additionner sont sur 16 bits)

checksum_v3
MOV r2,r0 ; r2 = data
MOV r0,#0 ; sum = 0
MOV r1,#0 ;i=0
checksum_loop
ADD r3,r2,r1,LSL #1 ; r3 = &data[i]
LDRH r3,[r3,#0] ; r3=data[i] pas doffset autorise
ADD r1,r1,#1 ; i++
CMP r1,#0x40 ; compare i, 64
ADD r0,r3,r0 ; r0 = r0 + r3
MOV r0,r0, LSL #16
MOV r0,r0,ASR #16 ; sum = (short)r0 extension du signe
BCC checksum_loop
MOV pc,r14
247
Exemple 2
Linstruction LDRH ne permet pas tous les modes dadressages de
linstruction LDR (pr index, registre doffset et dcalage), la premire
instruction ADD calcule ladresse de la donne. (la solution consiste
incrmenter un pointeur sur le tableau, c.f. aprs)

Les donnes additionner sont du type short (16 bits signes) et les
additions de type 32 bits signes. Pour convertir 32 bits signs-> 16
bits signs le compilateur utilise deux instructions. Un premier dcalage
gauche (16 bits) pour enlever linformation contenue dans les bits de
poids fort du registre et un dcalage (16 bits) vers la droite pour
tendre le signe (en utilisant une variable de type int pour la somme
on supprime ces instructions, la conversion seffectue une seule fois
lorsque lon quitte la fonction)

248
Extension du signe
Les instructions
MOV r0,r0, LSL #16
MOV r0,r0,ASR #16
effectuent lextension du signe de la donne (signe) sur 16 bits aux 32 bits du
registre. En effet (exemple sur 8 bits), on considre une valeur -3 code sur 4
bits et tendue 8 bits.
-3 = -(0011) = 1101 la dernire galit utilise le complment deux

on effectue la mme manipulation sur 8 bits


-3 = -(0000 0011) = 1111 1101

les bits de poids fort sont tous 1, pour tendre un nombre


ngatif cod sur 4 bits 8 bits, il faut ajouter des 1

249
Finalement
short checksum_v4(short *data)
{
unsigned int i;
int sum = 0;
for(i=1; i<64; i++)
{
sum+=*(data++);
}
return (short) sum;
}

250
Finalement
checksum_v4
toujours mise jour de r0 (voir
MOV r2, #0
la diffrence avec pr index et !)
MOV r1, #0
checksum_loop
LDRSH r3,[r0],#2 ; post index immdiat r3=*(data++)
ADD r1,r1,#1 , i++
CMP r1,#0x40 ; i<64?
ADD r2,r3,r2 ; sum+=data[i]
BCC checksum_v4
MOV r0,r2, LSL #16
MOV r0,r0,ASR #16 ; r0 = (short)sum
MOV pc,r14 ; return

251
Variables locales Arguments de
fonctions
Convertir les variables locales de types char ou short en des variables
de type int augmente les performances et diminue la taille du code.

Ce constat est aussi vrai pour les variables arguments de fonctions

exemple:
short add_v1(short a, short b)
{
return a+(b>>1);
}

252
Arguments de fonctions
Les arguments a et b ainsi que la valeur de retour sont passs en
arguments la fonction en utilisant les registres (32 bits).

Le compilateur deux options possibles:


1. il suppose que les donnes sont dans lintervalle -32768 - +32767
les donnes ne sont pas modifies (passage de paramtre large,
wide)
2. il force les valeurs tre dans cet intervalle en tendant le signe des
donnes sur 16 bits aux 32 bits des registres (passage de paramtre
troit, narrow)

Le compilateur doit aussi dterminer si cest la fonction appelante


(paramtre troit) ou appele (paramtre large) qui effectue le
changement de type (cast)
253
Valeur de retour
Si le compilateur retourne une valeur large alors la fonction appelante
doit effectuer le changement de type (rduction des valeurs
lintervalle).

Si le compilateur retourne les valeurs troite alors cest la fonction


appele qui effectue les conversions.

Exemple de code assembleur: paramtre troits, valeur de retour


troit
add_v1
ADD r0,r0,r1,ASR #1 ; r0 =(int)r0+2*(int)r1
MOV r0,r0,LSL #16
MOV r0,r0,ASR #16 ; r0=(short)r0
MOV pc,r14
254
Exemple 2 compilateur gcc
add_v1_gcc
MOV r0,r0,LSL #16
MOV r1,r1,LSL #16
MOV r1,r1,ASR #17 ; r1=(int)b>>2
ADD r1,r1,r0,ASR #16 ; r1+=(int)a
MOV r1,r1,LSL #16
MOV r0,r1,ASR #17 ; r0 = (short)r1
MOV pc,r14 ; return r0

Les changements de types sont effectus sur les arguments et sur la


valeur de retour.

255
Type sign/non sign
faut-il choisir signed int ou unsigned int ?
Si le programme utilise des additions, soustractions et des
multiplications, il ny a pas de diffrences.

Il y a des diffrences si on utilise des divisions.

exemple: calcul de la moyenne de deux nombres

int average(int a, int b)


{
return (a+b)/2;
}

256
Type sign/non sign
average_v1
ADD r0,r0,r1 ; r0 = a + b
ADD r0,r0,r0,LSR #31 ; if (r0<0) r0++
MOV r0,r0,ASR #1 ; r0 = r0 >> 1
MOV pc,r14

On doit tester si r0<0 avant de dcaler droite (diviser par deux) car
lopration de dcalage droite ne correspond pas une division par
deux si le nombre est sign et ngatif.
En effet: -3 = 1101, -3>>1 = 1110 = -2 mais la division -3/2 doit donner
-1 (on divise en arrondissant vers 0 comme on le fait pour les nombres
positifs)
Si cest possible il faut prfrer les entiers non sign ds que les
divisions sont utilises

257
Rcapitulations
1. les variables locales qui se trouvent dans les registres doivent de
prfrences tre de type int (sign ou non).
2. pour les variables globales, les tableaux qui se trouvent en
mmoire il faut prfrer le type qui utilise le moins de place
possible. Les donnes doivent tre parcourues en modifiant un
pointeur sur la structure.
3. Utiliser des casts (int), (short) explicite dans les programmes
lorsque lon assigne une variable locale ou crit la valeur dune
variable locale en mmoire (cast troit explicite).
4. il faut viter de laisser le compilateur effectuer des changements
de types implicites. Utiliser des options de compilations pour
signaler le casts implicites.
5. Eviter dutiliser les types char et short pour les arguments de
fonctions et les valeurs de retour.

258
Les boucles
Boucles avec un nombre fixe ditrations:
retour sur le calcul de la somme de contrle
code C optimal
int check_sum(int *data)
{ unsigned int i;
int sum=0;
for(i=0; i<64; i++)
{
sum+=*(data++);
}
return sum;
}

259
Les boucles
compilation assembleur
checksum_v5
MOV r2,r0 ; r2=data
MOV r0,#0 ; sum=0
MOV r1,#0 ; i=0
checksum_v5_loop
LDR r3,[r2],#4 ; r3=*(data++)
ADD r1,r1,#1 ; i++
CMP r1,#0x40 ; compare i, 64
ADD r0,r3,r0 ; sum += r3
BCC checksum_v5_loop
MOV pc,r14 ; return sum
trois instructions pour implmenter la boucle 260
Les boucle en assembleur ARM
Deux instructions sont suffisantes pour implmenter une boucle:
1. Une soustraction pour dcrmenter le compteur de boucle avec
mise jour du registre cpsr (en particulier le bit C)
2. Une instruction conditionnelle de branchement

Le compteur doit donc tre initialis avec le nombre ditrations et tre


dcrment pour viter linstruction CMP. Le compteur ne peut plus
tre utilis comme index des donnes (data[i]) qui doivent tre
accde par pointeur (*(data++)).

261
Exemple
code C
int checksum_v6(int *data)
{
i est non sign, alors la
unsigned int i; condition (i>0) est quivalente
int sum=0;
for(i=64; i!=0; i--)
{
sum+=*(data++);
}
return sum;
}

262
Exemple
code assembleur
checksum_v6
MOV r2,r0 ; r2=data
MOV r0,#0 ; sum = 0
MOV r1,#0x40 ; i = 64
checksum_loop
LDR r3,[r2],#4 ; r3 = *(data++)
SUBS r1,r1,#1 ; i-- + mise--jour cpsr
ADD r0,r3,r0 ; sum+=r3
BNE checksum_loop ; si (i!=0) boucle
MOV pc,r14 ; return sum

2 instructions pour la boucle 263


Compteur sign/non-sign
Si le compteur de boucle est non sign, les conditions i!=0 et i>0 sont
quivalentes. Si le compteur est sign on est tent dutiliser la condition
i>0. On espre que le compilateur va gnrer le code suivant:

SUBS r1,r1,#1 compare i avec 1, i=i-1


BGT loop branch if greater than

En fait le compilateur va gnrer le code suivant

SUB r1,r1,#1 r1
CMP r1,#0
BGT loop branch si r1>0

264
Compteur sign/non sign
Le compilateur se mfie du cas ou i= 0x80000000

Le premier code compare 0x80000000 avec 1, comme 0x80000000<1


La boucle se termine.

Le deuxime fragment de code commence par dcrmenter le


compteur pour obtenir 0x7fffffff, qui est plus grand que zro. La boucle
continue.

265
Boucles avec un nombre variable
ditrations
code C
int checksum_v7(int *data, unsigned int N)
{
int sum = 0; compteur non sign
for(; N!=0; N--)
{ le compteur est dcrment vers 0
sum +=*(data++); (2 instructions assembleur pour la boucle)
}
return sum; on incrmente le pointeur
}

266
Boucles avec un nombre variable
ditrations
code assembleur
checksum_v7
MOV r2,#0 ; sum = 0
CMP r1,#0 ; compare N, 0
BEQ checksum_v7_end
checksum_v7_loop
LDR r3,[r0],#4 ; r3 = *(data++)
SUBS r1,r1,#1 ; N- - + mise--jour de cpsr
ADD r2,r3,r2 ; sum += r3
BNE checksum_v7_loop
checksum_v7_end
MOV r0,r2 ; r0 = sum
MOV pc,r14

267
Boucle avec un nombre variable
ditrations
Le compilateur test que le compteur N est plus grand que 0 avant
deffectuer une premire boucle. Si le programmeur est certain que
cette valeur est >0 alors il faut utiliser une structure do-while

int checksum_v8(int *data, unsigned int N)


{
int sum = 0;
do {
sum += *(data++);
}while (N--!=0)
return sum;
}

268
Boucle avec un nombre variable
ditrations
do-while, code assembleur:
checksum_v8
MOV r2,#0
checksum_v8_loop
LDR r3,[r0],#4 ; r3 = *(data ++) Xcycles
SUBS r1,r1,#1 ; N- - 1 cycle
ADD r2,r3,r2 ; sum += r3 1 cycle
BNE checksum_v8_loop ; if (N!=0) 3 cycles
MOV r0,r2 ; r0 = sum
MOV pc,r14 ; return

269
Technique de droulement des
boucles
Une boucle coute deux instructions une soustraction et un
branchement conditionnel.

Pour le processeur ARM7, une soustraction sexcute en 1 cycle et un


branchement en 3 cycles, le cot de gestion dune boucle est de 4
cycles par boucle.

Pour diminuer le cot de gestion de la boucle, on droule la boucle,


cest--dire que lon recopie plusieurs fois le corps de la boucle (sans
test ni soustraction)

Evidemment, cest possible seulement pour certaines valeurs de N

270
Droulement des boucles
On suppose que le nombre de paquets N est un multiple de 4
int checksum_v9(int *data, unsigned int N)
{
int sum = 0;
do {
sum += *(data++);
sum += *(data++);
sum += *(data++);
sum += *(data++);
N -=4;
} while (N != 0);
}

271
Droulement des boucles
pour le code assembleur de checksum_v8 le traitement du corps de la
boucle sexcute en X + 5 cycles.

Si la boucle est droule, il faut excuter 4 LDR 4 x X cycles, 4 ADD 4


cycles, un SUBS 1 cycle, un BNE 3 cycles soit 8+ 4 x X cycles au total.

Temps de gestion de la boucle 4 cycles pour 4 accumulations.

272
Droulement des boucles
seules les boucles qui sont frquemment utilises sont susceptibles
dtre droule, sinon on augmente la taille du code sans gain de
performance significatif
il faut considrer aussi la taille du corps de la boucle. Plus le corps
de la boucle est grand moins les pertes dues la gestion de la
boucle (4 cycles) sont importants et plus la duplication du code
augmente la taille totale du code. De plus, ca diminue les
performances de la mmoire cache. Gnralement, si drouler une
boucle augmente les performances de moins de 1%, la technique
nest plus efficace.
si le nombre total ditrations excuter nest pas un multiple
constant de 2, 4, etc. on peut drouler une partie du code et faire le
reste en ajoutant des instructions (sans boucles)

273
Droulement des boucles
code C
int checksum_v10(int *data, unsigned int N)
{
unsigned int i;
int sum = 0;
for (i=N/4; i!=0; i--)
{
sum+=*(data++); sum+=*(data++);
sum+=*(data++); sum+=*(data++);
}
for(i=N&3;i!=0;i--) // & oprateur et sur les bits, positionne tous les
sum+=*(data++); // bits 0 except le deux premiers
return sum;
}
274
Boucles - rsum
les compteurs doivent tre dcrments vers 0 pour viter que le
compilateur utilise un registre pour mmoriser le nombre ditrations
et effectuer la comparaison avec zro (gratuit)
les compteurs de boucles sont non signs, les conditions de
terminaisons (i!=0) et (i>0) sont quivalentes (il faut viter la
situation ou le compteur dmarre a 0x80000000 et passe a
0x7FFFFFFF)
utiliser un do-while de prfrence un for pour viter un test au
dbut de la boucle
drouler le boucles si cest efficace
prfrer les structures de donnes qui gnrent des tableaux
multiples de 2, 4, etc. et qui permettent le droulement des boucles

275
Allocation des registres
Le compilateur essaye dallouer un registre par variable locale dclare
(utilise) dans une fonction C. Si plusieurs variables ne sont pas
utilises simultanment, le compilateur utilise le mme registre pour
ces variables.

Si le nombre total de variables est suprieur au nombre de registres le


compilateur utilise la pile. Laccs ces variables est lent car il
ncessite un accs la mmoire externe.

Lors de lcriture dune fonction il faut:


1. minimiser lutilisation de la pile
2. sassurer que les variables les plus frquemment utilises
sont stockes dans des registres.

276
Convention
Le passage des paramtres en C utilise les conventions suivantes
concernant lusage des registres

r0-r3: Registres pour le passage de paramtres ainsi que la valeur de


retour

r4-r8: Registres dusage gnral pour la fonction. Les valeurs de ces


registres doivent tre sauves/restaures pour contenir la mme valeur
au dbut et la fin de lexcution de la routine.

r9-r11: idem que les registres r4-r8 sauf si certaines options de


compilations sont actives.

277
Convention
r12: un scratch register , la fonction peut lutiliser sans ce soucier de
le restaurer.

r13: le registre de pile, stack registre, sr, (full descending)

r14: le registre de lien, link register, lr

r15: le compteur de programme, program counter, pc

En rgle gnral les compilateurs peuvent utiliser les registres r0-r11


pour les variables locales, r12 pour les calculs intermdiaires. Une
bonne habitude est de limiter le nombre de variables locales 12.

278
Convention
Si le compilateur doit utiliser la pile, il le fait pour les variables le moins
frquemment utilises.

Une variable utilise lintrieur dune boucle compte plusieurs fois.


Comme il peut tre difficile pour le compilateur destimer le nombre de
fois quune boucle est excute, le compilateur slectionne les
variables qui se trouvent dans le plus grand nombre de boucles
imbriques.

Le langage C dfini le mot cl register pour indiquer quune variable


doit (si possible) tre sauve dans un registre.

279
Appels de fonctions - arguments
ARM dfini un standard pour lappel des procdures: ARM Procedure
Call Standard (APCS), qui dfinit comment les arguments sont passs
aux fonctions et comment sont gres les valeurs de retour.

Les quatre premiers arguments entiers (pointeurs) sont passs dans


les registres r0, r1, r2, r3.

Les autres arguments entiers (pointeurs) sont placs sur la pile (full
descending) de manire croissante avec la mmoire

r3 argument 3
sp+12 argument 7
r2 argument 2
sp+8 argument 6
r1 argument 1
sp+4 argument5
sp argument 4 r0 argument 0 280
valeur retour
Appels de fonctions - arguments
Les arguments cods sur deux mots tel que les double ou long long
sont passs dans deux registres conscutifs et retourn dans r0, r1

Les fonctions qui utilisent au maximum quatre arguments sont plus


efficaces (lutilisation de la pile ncessite des accs externes).

En C++ le premier argument pass lors de lappel la mthode dun


objet est le pointeur this. Largument est implicite et supplmentaire
aux autres arguments.

Si une fonction C ncessite plus de quatre arguments (trois en C++)


alors il faut les regrouper dans une structure et passer en argument un
pointeur sur la structure.

281
Exemple
Une routine qui permet dinsrer des caractres dans une file dattente
(tampon circulaire).

occup occup occup libre libre libre libre libre

Q_start Q_ptr Q_end

0xyyyyyyyy data
0xyyyyyyyy
0xyyyyyyyy
N donnes

0xyyyyyyyy
0xyyyyyyyy
282
Exemple
occup occup occup occup libre libre libre libre

Q_start Q_ptr Q_ptr Q_end

0xyyyyyyyy
0xyyyyyyyy data
0xyyyyyyyy
N donnes

0xyyyyyyyy
0xyyyyyyyy

283
Code C
char *queue_bytes_v1(char *Q_start, char *Q_end, char *Q_ptr, char *data,
unsigned int N)
{
do {
*(Q_ptr++)=*(data++);
if (Q_ptr==Q_end) Q_ptr=Q_start;
} while (--N)
return Q_ptr;
}

Q_start: adresse du dbut de la queue (inclus)


Q_end: adresse de la fin de la queue (non inclus)
Q_ptr: adresse de la position courante dans la queue
data: adresse sur le dbut des donnes transfrer dans la queue
N : nombre de bytes a transfrer
284
Code assembleur
queue_bytes_v1
STR r14, [r13,#-4]! sauvegarde de lr sur la pile + mise jour
LDR r12, [r13,#4] r12=N
queue_v1_loop
LDRB r14, [r3], #1 r14 = *(data++), mise jour de r3
STRB r14, [r2], #1 *(Q_ptr++)=r14
CMP r2, r1 if (Q_ptr == Q_end)
MOVEQ r2, r0 Q_ptr = Q_start
SUBS r12, r12, #1 N- - mise a jour du cpsr
BNE queue_v1_loop if (N!=0) goto loop
MOV r0,r2 r0 = Q_ptr
LDR pc, [r13], #4 return r0

285
Utilisation dune structure
typedef struct {
char *Q_start, *Q_end, *Q_ptr;
} Queue;

void queue_bytes_v2(Queue *queue, char *data, unsigned int N) {


char *Q_ptr=queue->Q_ptr;
char *Q_end=queue->Q_end;
do {
*(Q_ptr++)=*(data++);
if (Q_ptr == Q_end) Q_ptr = queue->Q_start;
} while (--N)
queue->Q_ptr = Q_ptr;
}
286
comparaison v_1 v_2
La deuxime version du programme qui utilise une structure contient
une instruction de plus (au dbut du programme pour initialiser les
pointeurs)

Chaque appel a la fonction ncessite linitialisation de 3 registres (les


trois arguments) pour la seconde version contre 4 registres et un
paramtre a placer sur la pile (empiler et dpiler le paramtre N). Si on
considre lappel la fonction la deuxime version comporte moins
dinstructions (au moins 1 instructions pour modifier le registres
supplmentaire et deux instructions pour empiler/dpiler).

Probablement que dautres instructions sont conomises en utilisant


la structure dans dautres parties du programme.

287
utilisation dune structure-
code assembleur
queue_bytes_v2
STR r14, [r13, #-4] sauvegarde lr sur la pile
LDR r3, [r0, #8] r3 = queue->Q_ptr
LDR r14, [r0, #4] Q_end
queue_v2_loop
LDRB r12, [r1], #1 r12 = *(data++)
STRB r12, [r3], #1 *(Q_ptr++) = r12
CMP r3, r14 if (Q_ptr == Q_end)
LDREQ r3, [r0, #0] Q_ptr = queue->Q_start
SUBS r2, r2, #1 --N et mise a jour du cpsr
BNE queue_v2_loop if (N!=0) goto loop
STR r3, [r0, #8] queue->Q_ptr = r3
LDR pc, [r13], #4 return

288
Autres stratgies
Lorsquune fonction utilise peu de variables locales ou/et que le code
gnr par la fonction est petit le compilateur peut procder des
optimisations si le code de la fonction se trouve dans le mme
fichier que le code des fonctions appelantes

1. Le compilateur utilise dans le corps du programme des registres


diffrents que dans le corps de la fonction pour viter des
sauvegardes
2. Si possible le corps de la fonction est plac directement dans le
corps du programme (inline) pour supprimer les instructions
dappels de la fonction (sauvegarde sur la pile, mise--jour des
registres).

289
Exemple 2
une fonction uint_to_hex converti une entier 32 bits en une chane de
caractres de 8 caractres hexadcimaux.

unsigned int nybble_to_hex(unsigned int d) {


if (d<10) return d + 0;
return d - 10 + A;
}

void uint_to_hex(char *out, unsigned int in) {


unsigned int i;
for(i=8;i!=0;i--){
in = (in<<4) | (in>>28); // rotation gauche de 4 bits
*(out++) = (char)nybble_to_hex(in & 15);
}
}

290
Exemple 2 code assembleur
uint_to_hex
MOV r3, #8 ; i=8
uint_to_hex_loop
MOV r1, r1, ROR #28 ; rotation 4 bits gauche
AND r2, r1, #0xf ; r2 = in & 15
CMP r2, 0xa ; if (r2>=10)
ADDCS r2, r2, #0x41 ; r2 += A 10 non sign
ADDCC r2, r2, #0x30 ; r2 += 0 non sign
STRB r2, [r0], #1 ; *(out++)=r2
SUBS r3, r3, #1 ; i-- + mise--jour du cpsr
BNE uint_to_hex_loop ; if (i!=0) goto loop
MOV pc, r14 ; return

291
Exemple 2 code assembleur
Lappel la fonction nybble_to_hex t supprimer et la fonction
insrer dans le corps de la routine appelante (inline)

Stratgies pour une programmation efficace:


1. Utiliser des fonctions avec 4 arguments, utiliser des structures et
passer en paramtres des pointeurs sur les structures.
2. Dfinir de petites fonctions, les inclure toutes dans le mme fichier et
dfinir les fonctions avant de les appeler pour permettre au
compilateur de bien grer les registres et les inline.
3. Les fonctions critiques doivent tre prcdes du mot cl inline.

292
aliasing - pointeur
Le terme aliasing rfre la situation ou plusieurs pointeurs pointent
sur la mme adresse. Lorsque plusieurs pointeurs sont utiliss, le
compilateur doit toujours suspecter que la valeur pointe par un
pointeur t modifie mme si ce pointeur na pas t utilis.
exemple:

void timer_v1(int *timer1, int *timer2, int *step)


{
*timer1 += *step;
*timer2 += *step;
}

293
code assembleur
timer_v1
LDR r3, [r0,#0] ; r3 = *timer1
LDR r12, [r2,#0] ; r12 = *step
ADD r3, r3, r12 ; r3 += r12
STR r3, [r0, #0] ; *timer1 = r3
lcriture pu modifier
LDR r0, [r1, #0] ; r0 = *timer2 le contenu de [r2]
LDR r2, [r2,#0] ; r2 = *step aliasing possible
ADD r0, r0, r2 ; r0 += r2
STR r0, [r1, #0] ; *timer2 = r0
MOV pc, r14

294
structures
Linstruction LDR supplmentaire est un accs la mmoire externe,
viter. La solution consiste utiliser une variable locale

typedef struct {int step;} State;


typedef struct {int timer1, timer2;} Timers;

void timers(State *state, Timers *timers)


{
int step = state->step;
timers->timer1 += step;
timers->timer2 += step;
}

295
structures
ATTENTION, le code suivant gnre aussi une instruction supplmentaire,
mme si des structures sont utilises

void timers(State *state, Timers *timers)


{
timers->timer1 += state->step;
timers->timer2 += state->step;
}
Un autre exemple est
state->step
appel a une fonction
state->step ; rinitialisation de la variable cause de lappel la fonction

296
Exemple 2
int checksum(void)
{ int *data; int N, sum=0;
data = get_next_packet(&N);
do {
sum += *(data++);
} while(--N);
}
le compilateur doit prendre en compte
que les deux pointeurs peuvent pointer
sur la mme donne (aliasing)

297
Exemple2 - assembleur
checksum
STMFD r13!, {r4, r14} sauvegarde r4, lr sur la pile
SUB r13, r13, #8 cre deux variables sur pile
ADD r0, r13, #4 r0 = &N pour appel proc.
MOV r4, #0 sum = 0
BL get_next_packet
checksum_loop
LDR r1, [r0], #4 r1 = *(data++)
ADD r4, r1, r4 sum += r1
LDR r1, [r13, #4] r1 = N depuis la pile!
SUBS r1, r1, #1 r1 et mise jour cpsr
STR r1, [r13, #4] N=r1 criture sur la pile !
BNE checksum_loop
MOV r0, r4 r0 = sum
ADD r13, r13, #8 supprime les variables sur pile
LDMFD r13!, {r4, pc} 298
exemple 2 - remarque
Le compilateur rserve de la place pour deux variables sur la pile et en
utilise une seule..

Lassembleur ARMv5 met a disposition linstruction LDRD (Load 64


bits) pour travailler sur 64 bits et les mots doivent tre aligns sur des
adresses divisibles par 8.
Le compilateur maintient les adresses de la pile alignes.

Linstruction LDRD nest pas utilise dans le corps de la routine mais


pourrait ltre dans la routine get_next_packet

299
aliasing recommandations
Il faut utiliser des variables locales pour viter que le compilateur
considre des donnes identiques comme diffrentes

Il faut viter daccder une variable locale par son adresse pour viter
quelle se trouve sur la pile. Si cest ncessaire il faut dfinir une
nouvelle variable locale et copier la valeur utile.

300
Alignement
Lorganisation des structures composes peut avoir des consquences sur les
performances du code gnr par le compilateur.
Les donnes accdes par les instructions load/store doivent tre alignes.
Jusqu la version ARMv5TE, on a les restrictions

1 byte LDRB, LDRSB, STRB Alignement quelconque

2 bytes LDRH, LDRSH, STRH Multiple de 2 bytes

4 bytes LDR, STR Multiple de 4 bytes

8 bytes LDRD, STRD Multiple de 8 bytes

301
Alignement
Pour respecter ces contraintes, le compilateur ajoute des champs non utiliss
(pad) dans les structure de donnes composes.

Exemple:
struct {
+3 +2 +1 +0
char a;
int b; +0 pad pad pad a

char c; +4 b[31,24] b[23,16] b[15,8] b[7,0]


short d; +8 d[15,8] d[7,0] pad c
}
(little-endian)

302
Alignement
Pour optimiser loccupation de la mmoire on doit rordonner la dfinition de la
structure.
struct {
char a;
char c;
short d;
int b;
}

(little endian)
+3 +2 +1 +0

+0 d[15,8] d[7,0] c a

+4 b[31,24] b[23,16] b[15,8] b[7,0]

+8 libre libre libre libre

303
Alignement
Certain compilateur dispose doption pour rduire la taille des donnes en
mmoire en supprimant les bits de padding. Pour le compilateur armcc, cest le
mot cl _packed, qui ne produit pas toujours une organisation optimale

_packed struct{
char a; +3 +2 +1 +0
int b; +0 b[23,16] b[15,8] b[7,0] a
char c; +4 D[16,8] d[7,0] c b[31,24]
short d;
+8 libre libre libre libre
}

Pour sassurer dobtenir le rsultat voulu, il est recommand dintroduire les


champs de remplissages manuellement.

304
Champs de bits
En C on peut dfinir des boolens en utilisant un seul bit de donne en
mmoire.

typedef struct {
unsigned int StageA : 1;
unsigned int StageB : 1; 3 bits en mmoire
unsigned int StageC : 1;
} Stages_v1;

Stages_v1 exemple;

exemple.StageA = 1;

305
Champs de bits
Lordre des bits en mmoire change selon le compilateur.
Souvent le code gnr nest pas optimis.
Exemple:

void dostagesA(void);
void dostagesB(void);
void dostagesC(void);

306
Champs de bits
Void dostages_v1(Stages_v1 *stages) {
if (stages->StageA)
dostageA();
if (stages->StageB)
dostageB();
if (stages->StageC)
dostageC();
}

307
Champs de bits
dostages_v1
STMFD r13!,{r4,r14} La fonction dostageA peut modifier
MOV r4,r0 le champ de bits!
LDR r0,[r0,#0] ; r0 contient le champ de bits
TST r0,#1 ; calcule r0 & #1, test le premier bit
BLNE dostageA
LDR r0,[r4,#0] ; r0 contient le champ de bits
MOV r0,r0,LSL #30
CMP r0, #0
BLLT dostageB
LDR r0,[r4,#0] ; ncessaire
MOV r0,r0, LSL #29
CMP r0,#0
LDMLTFD r13!,{r4,r14} ; return
BLT dostageC
LDMFD r13!,{r4,pc}

sans link. 308


Champs de bits
Le compilateur accde trois fois le champ de bits en mmoire pour
prvenir les problmes daliasing. Les champs de bits tant de taille
quelconques, le compilateur utilise souvent des pointeurs.

Pour amliorer les performances, il est recommand dutiliser des


oprations logiques.

typedef unsigned long Stages_v2;

#define STAGEA (1ul << 0)


#define STAGEB (1ul << 1)
#define STAGEC (1ul << 2)

309
Champs de bits
void dostages_v2(Stages_v2 *stages_v2) {
Stages_v2 stages = *stages_v2;

Variable locale, plus daliasing


if (stages & STAGEA) dostageA();
if (stages & STAGEB) dostageB();
if (stages & STAGEC) dostageC();
}

310
Champs de bits
dostages_v2
STMFD r13!,{r4,r14}
LDR r4,[r0,#0]
TST r4,#1
BLNE dostageA
TST r4,#2
BLNE dostageB
TST r4,#4
LDMNEFD r13!,{r4,r14}
BNE dostageC
LDMFD r13!,{r4,pc}

311
Champs de bits
En conclusion, pour manipuler des champs de bits il est prfrable
dutiliser des masques.
Exemple: stages |= STAGEA; (enable) stages &= ~STAGEB; (disable)
stages ^= STAGEc; (toggle)

312
Division
Le processeur ARM de dispose pas dinstruction pour le calcul des
divisions. Le temps dexcution des routines des librairies C standards
varie entre 20 et 100 cycles en fonction de limplmentation ou de la
taille des oprandes.

Dans certaines situations il est possible de supprimer les oprations de


divisions. Par exemple, pour la gestion dun tampon circulaire. Dans ce
cas, pour accder llment suivant du tampon, on crit

offset = (offset + increment) % buffer_size;

313
Tampon circulaire
Il est plus efficace dcrire

offset += increment;
if (offset >= buffer_size)
offset -= buffer_size;

Le calcul du reste de la division peut prendre 50 cycles, la deuxime


implmentation 3 (on suppose que increment < buffer_size).

314
Division signe/non signe
Les routines de division de nombres signs sont implmente en trois
tapes:

1.On calcule la valeur absolue des oprandes


2.On calcule la division non signe
3.On calcule le signe

Il faut donc de prfrence utiliser des nombres non signs.

315
Division / reste
Les routines des librairies C retournent gnralement le rsultat de la
division et le reste. On utilise cette proprit pour calculer plus
efficacement.
Exemple:
typedef struct { int x; int y; } point;

point getxy_v1(unsigned int offset, unsigned int bytes_per_line) {


point p;
p.y = offset / bytes_per_line;
p.x = offset p.y*bytes_per_line;
return p;
}

316
Division / reste
Pour le calcul de p.x, on a voulu viter de calculer une division. En fait,
crire p.x=offset % bytes_per_line; est meilleur, car le calcul de la
premire division retourne aussi le reste.

getxy_v2
STMFD r13!, {r4,r14}
MOV r4, r0
MOV r0, r2
BL _rt_udiv valeurs de retour dans r0, r1
STR r0, [r4, #4]
STR r1, [r4, #0]
LDMFD r13!, {r4,pc}

317
Division / Multiplication
Si un programme effectue souvent la division par un mme
dnominateur, z, il devient efficace de calculer 1/z et de remplacer les
divisions par des multiplications.

Dans tous les cas, on prfre calculer avec des valeurs entires et on
vite les nombres en virgule flottante.

Une premire ide est dutiliser la transformation


n =d = ( n ( 232 =d) ) =232 = n s=232

Pour calculer la multiplication, on utilise des nombres entiers sur 64 bits

318
Division / Multiplication
Cette approche nous oblige a effectuer une division avec des entiers
sur 64 bits pour le calcul de s, ce qui est long.
Dautre part, si d=1, la valeur mmoriser est aussi sur 64 bits.

s = ( 232 1) =d = 23 2 e1 ; 0 < e1 1
En pratique, on utilise d

exact
Pour calculer la division, on utilise arrondis
q = (unsigned int)( ((unsigned long long)n * s) >> 32);

232
La division par introduit une erreur

q = n s2 32 e2 ; 0 e2 < 1

319
Division / Multiplication
Do: n
q= n e1 2 32 e2 ; 0 n e1 2 32 + e2 < 2
d

(n 2< q n)
On a donc lestimation d d

q = n =d; ou q = n =d 1

Pour corriger le rsultat, on calcule r=n-qd, en on vrifie que 0<= r < d


n =d + 1
r=n-q*d; n
d
if (r>=d) { r-=d; q++}
n =d

n =d 1
320
Division / Multiplication
Exemple: On doit diviser des valeurs entires non signes contenues
dans un tableau.

void scale( unsigned int *dest, unsigned int *src, unsigned int d,
unsigned int N) {
unsigned int s = 0xFFFFFFFFu / d;
do { unsigned int n, q, r;
n = *(src++);
q=(unsigned int)(((unsigned long long)n * s) >> 32);
r = n - q*d;
if (r>=d) q++;
*(dest++)=q;
} while (--N);
} 321
Remarques
La multiplication 64 bits est implmente en utilisant UMUL (maximum
4 cycles).

Lalgorithme est le mme si les nombres s =sont


( 216cods sur 16 bits, on
1) =d
utilise une multiplication sur 32 bits et

322
Division constante
Si dans un programme une division par une constante d apparait
souvent, on peut optimiser lexcution en cherchant une valeur de s qui
donne le bon rsultat. On cherche une approximation rationnelle
1 m
= s
d 2N + k

n =d = m n =2N + k ; 0 n < 2N
telle que
On a le rsultat suivant
si 2N + k ds 2N + k + 2k ; al or s n =d = n s
si 2N + k 2k ds < 2N + k ; al or s n =d = n s + s
0 n < 2N

323
Division constante
( n = ( n =d) d + r ; 0 r < d)
En effet,
n r ds 2N + k r 2N + k r+ 1
n s ( n =d) 2N + k = n s 2N + k = n + < 2N + k < 2N + k
d d d d

< 2N 0 : : : 2k

On procde de la mme manire pour lautre quation

324
Division constante

ds 2N + k ( r + 1) 2N + k
( n + 1) s ( n =d) 2N + k = ( n + 1) +
d d

< 2N + 1 -2k : : : < 0

325
Division constante
2k < d 2k + 1
En pratique, on a N=32, on choisit k tel que et
2N + k + 2k
s = (2N + k + 2 ) =d =
k e; 0 e < 1
d

On a
2N + k + 2k
ds = d ed < 2N + k + 2k
d

2N + k + 2k
ds = d ed 2N + k + 2k d 2N + k + 2k 2k + 1
d | {z }
2k

326
Division constante
Avec ces choix de s et k, un des deux rsultats sapplique toujours.
On calcule donc ds et on implmente la multiplication selon
(
2N + k
ds
< 2N + k

327
Implmentation de la division
On suppose donns n et d et on cherche calculer q=n/d la division
entire et le reste r=n%d.

Supposons quon sache que le quotient q peut tre cod sur N bits.
Une implmentation de la division consiste calculer les N bits de q
successivement.

En C: (division non signe)


unsigned udiv_simple( unsigned d, unsigned n, unsigned N) {
unsigned q=0, r=n;

328
Implmentation de la division
do
{
N--; // on test le bit suivant
if ( (r>>N) >= d) { // si r >= d * (1<<N)
r -= (d<<N);
d += (1<<N);
} while(N);

return q;
}
n = c0 d + c1 2d + c2 4d + c4 8d + : : :
En fait, on dcompose

329
Implmentation de la division
Pour montrer que lalgorithme est correcte, on montre que lexpression
ci-dessous est un invariant dans la boucle
n= qd + r , 0 r < d2N

330
En assembleur

331
332
333
334
Newton-Raphson
Une autre technique qui permet de calculer la division est dutiliser la
mthode de Newton_Raphson.

Cette mthode
f ( x ) =permet
0 de calculer itrativement la racine dune
quation
xn
On suppose quon connait une approximation et on calcule une
meilleure approximation avec la formule

xn + 1 = xn f (xn )
f 0( x n )

335
Newton-Raphson
On2Ncherche
=d calculer n/d. On va calculer une approximation entire de
n =d = n 2N =d=2N
et on calculera
f (x ) = d 2N
La fonction xpossde lapproximation cherche pour
racine. Litration du schma de Newton-Raphson donne

xn + 1 = xn d 2N =x n = 2x n dx 2
n
2n x n 2 2N

336
Racines carres
La mthode de Newton-Raphson est trs gnrale et permet de
calculer toutes les fonctions classiques, racine carre, exponentielle,
sinus, cosinus, .

Pour le calcul de la recine carre, on peut aussi utiliser une stratgie


dessai et soustraction. Cette mthode est particulirement efficace
lorsque la prcision demande nest pas trop grande (typiquement
moins de 16 bits).

Si d est un nombre entier, le rsultat du calcul de la racine carre est


deux entiers q et r tels que
d = q2 + r ; 0 r 2q:

337
Racines carres
r > 2q
Remarquez que si alors q peut-tre incrment.
( q + 1) 2 = q2 + 2q + 1

Supposons que d soit un entier sur 32 bits. Le rsultat q est cod sur
16 bits et le reste r sur 17 bits.

On test successivement les bits n = 15, 14, 13, etc de q. Le nouveau


reste se calcule comme suit (initialement q = 0, r = d)
r n ew = d ( q + 2n ) 2 = ( d q2 ) 2n + 1 q 22n = r ol d 2n ( 2q + 2n )

r n ew 0
Donc, si on effectue la modification
r r 2n ( 2q + 2n )
q q + 2n
338
Racines carres
En C,

unsigned t, q=0, r=d;


do {
N--;
t=2*q+(1<<N);
if ((r>>N) >= t) {
r -= (t<<N);
q += (1<<N);
}
} while(N);

q et r contiennent le rsultat

339

Vous aimerez peut-être aussi