Programmation sur ARM

publicité
Informatique embarquée
(IEM)
Programmation sur ARM (1/2)
2008-2009 (v0.2)
Daniel Rossier
[email protected]
Plan du cours IEM
Introduction aux systèmes embarqués
Programmation sur ARM
Architecture hôte/cible, crosscross-compilateur, transfert de fichiers ((ttftp
ttftp),
), systèmes de
fichiers racine (rootfs
(rootfs),
), techniques de mise au point (debugging
(debugging JTAG)
Gestion des interruptions et routines de services (Interrupt
(Interrupt Service Routine)
Modèle du programmeur, jeu d'instructions, langage d'assemblage, extensions du
langage, traduction de structures C en assembleur
Outils de développement croisé (cross(cross-development
development))
Préfixes binaires, complément de C, introduction aux systèmes embarqués, rappel
sur l'architecture d'un processeur et I/O
Rappel sur le modèle de programmation du ARM, IRQ/ISR
Gestion mémoire et accès DMA
Programmation sur ARM (1/2) - IEM/REDS
2
Programmation sur ARM
Modèle du programmeur
Jeu d'instructions
Langage d'assemblage
Extensions du langage
Traduction de structures C en assembleur
Programmation sur ARM (1/2) - IEM/REDS
3
Modèle du programmeur
Programmation sur ARM (1/2) - IEM/REDS
4
Les registres
37 registres de 32 bits
1 registre à usage particulier: r15 (PC)
1 registre d'état cpsr (current program status register)
5 registres d'état dépendant du mode d'exécution: spsr (saved
program status register)
30 registres à usage général (15 visibles dans un mode
donné)
Un jeu de registres généraux: r0-r12
Un registre pour pointer sur la pile: r13 (stack pointer, sp)
Un registre pour garder une adresse de retour: r14 (link register, lr)
Les modes privilégiés - sauf le mode system - ont
accès à un spsr particulier.
Le mode system permet la modification du cpsr.
Programmation sur ARM (1/2) - IEM/REDS
5
Registres ARM
USER
r1
r2
r3
r4
r5
FIQ
IRQ
SVC
Undef
Abort
r6
r7
r8
r8
r9
r9
r10
r10
r11
r11
r12
r12
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
spsr
spsr
spsr
spsr
spsr
r15 (pc)
cpsr
Programmation sur ARM (1/2) - IEM/REDS
6
Registres visibles en mode USER
USER
r1
Reg. visible
r2
r3
r4
r5
FIQ
IRQ
SVC
Undef
Abort
r6
r7
r8
r8
r9
r9
r10
r10
r11
r11
r12
r12
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
spsr
spsr
spsr
spsr
spsr
r15 (pc)
cpsr
Programmation sur ARM (1/2) - IEM/REDS
7
Registres visibles en mode FIQ
USER
r1
Reg. visible
r2
r3
r4
r5
FIQ
IRQ
SVC
Undef
Abort
r6
r7
r8
r8
r9
r9
r10
r10
r11
r11
r12
r12
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
spsr
spsr
spsr
spsr
spsr
r15 (pc)
cpsr
Programmation sur ARM (1/2) - IEM/REDS
8
Registres visibles en mode IRQ
USER
r1
Reg. visible
r2
r3
r4
r5
FIQ
IRQ
SVC
Undef
Abort
r6
r7
r8
r8
r9
r9
r10
r10
r11
r11
r12
r12
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
spsr
spsr
spsr
spsr
spsr
r15 (pc)
cpsr
Programmation sur ARM (1/2) - IEM/REDS
9
Registres visibles en mode SVC
USER
r1
Reg. visible
r2
r3
r4
r5
FIQ
IRQ
SVC
Undef
Abort
r6
r7
r8
r8
r9
r9
r10
r10
r11
r11
r12
r12
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
spsr
spsr
spsr
spsr
spsr
r15 (pc)
cpsr
Programmation sur ARM (1/2) - IEM/REDS
10
Registres visibles en mode Undef
USER
r1
Reg. visible
r2
r3
r4
r5
FIQ
IRQ
SVC
Undef
Abort
r6
r7
r8
r8
r9
r9
r10
r10
r11
r11
r12
r12
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
spsr
spsr
spsr
spsr
spsr
r15 (pc)
cpsr
Programmation sur ARM (1/2) - IEM/REDS
11
Registres visibles en mode Abort
USER
r1
Reg. visible
r2
r3
r4
r5
FIQ
IRQ
SVC
Undef
Abort
r6
r7
r8
r8
r9
r9
r10
r10
r11
r11
r12
r12
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r13 (sp)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
r14 (lr)
spsr
spsr
spsr
spsr
spsr
r15 (pc)
cpsr
Programmation sur ARM (1/2) - IEM/REDS
12
Jeu d'instructions
Programmation sur ARM (1/2) - IEM/REDS
13
Registre d'état CPSR (Current Program Status Register)
31
28 27
N Z C V Q
24
23
J
16 15
U
flags
n
d
e
status
Condition code flags
N = Negative result from ALU
Z = Zero result from ALU
C = ALU operation Carried out
V = ALU operation oVerflowed
f
i
8
n
Architecture 5TE/J only
Indicates if saturation has occurred
6
5
4
I F T
d
extension
Sticky Overflow flag - Q flag
e
7
0
mode
control
Interrupt Disable bits.
I = 1: Disables the IRQ.
F = 1: Disables the FIQ.
T Bit
Architecture xT only
T = 0: Processor in ARM state
T = 1: Processor in Thumb state
Mode bits
10000 USER
10001 FIQ
10010 IRQ
J bit
10011 Supervisor
Architecture 5TEJ only
10111 Abort
11011 Undefined
J = 1: Processor in Jazelle state
11111 System
Programmation sur ARM (1/2) - IEM/REDS
14
Jeu d'instructions ARM - Propriétés (1/3)
Instructions de traitement de données
Instructions codées sur 32 bits
Exécution en 1 cycle
Données
Dans registre ou valeur immédiate sur 12 bits
⇒ Implique des restrictions!
source 1
Instructions à 0, 1, 2 ou 3 opérandes
Destination, source 1, source 2
source 2
La dernière opérande est un registre à décalage.
Exécution conditionnelle des instructions.
Programmation sur ARM (1/2) - IEM/REDS
ALU
15
Jeu d'instructions ARM - Propriétés (2/3)
Instructions de transferts de données
Instructions codées sur 32 bits
Adresse dans registres (+offset immédiat)
avec ou sans pré- ou post-indexage (<a_mode>)
Exécution conditionnelle des instructions
Transfert simple registre-mémoire
Exécution en 2 cycles
Transfert multiple registres-mémoire
Exécution en n+1 cycles
Programmation sur ARM (1/2) - IEM/REDS
16
Jeu d'instructions ARM - Propriétés (3/3)
Instructions conditionnelles
Comparaisons entre registres
Instructions codées sur 32 bits
Exécution en 1 cycle
Exécution conditionnelle des instructions
Programmation sur ARM (1/2) - IEM/REDS
17
Exemples
Instructions de traitement de données
add
r2, r3, r3, LSL #2
ands
r4, r4, #0x20
sub
r0, r1, #5
addeq
r5, r5, r6
Instructions spécifiques aux accès mémoire
ldr
r0, [r1], #+4
strneb r2, [r3, r4]
ldrsh
r5, [r6, #8]!
stmfd
sp!, {r0, r2-r7, r10}
@ load/store: flags jamais modifiés!
Programmation sur ARM (1/2) - IEM/REDS
18
Type d'adressage - Indexage
Sans indexage
@ r0 := mem32[r1]
ldr
r0, [r1], #+4
@ r0 := mem32[r1]
@ r1 := r1+4
Pré-indexage, sans mémorisation du nouvel index
r0, [r1]
Post-indexage
ldr
ldr
r0, [r1, #+4]
@ r0 := mem32[r1+4]
Pré-indexage, avec mémorisation du nouvel index
ldr
r0, [r1, #+4]!
@ r0 := mem32[r1+4]
@ r1 := r1+4
Programmation sur ARM (1/2) - IEM/REDS
19
Structures de contrôle - Conditions
Suffixe
EQ
NE
CS/HS
CC/LO
MI
PL
VS
VC
HI
LS
GE
LT
GT
LE
Flags de l'ALU
Z
Z
C
C
N
N
V
V
C
C
N
N
Z
Z
set
clear
set
clear
set
clear
set
clear
set and Z clear
clear and Z set
and V the same
and V differ
clear, N and V the same
set, N and differ
Signification
Equal
Not equal
Higher or same (unsigned >= )
Lower (unsigned < )
Negative
Positive or zero
Overflow
No overflow
Higher (unsigned > )
Lower or same (unsigned <=)
Signed >=
Signed <
Signed >
Signed <=
Programmation sur ARM (1/2) - IEM/REDS
20
Branchements et sous-programmes
b <label>
relatif au PC: plage de ±32Mbytes
bl <sous-programme>
stocke l'adresse de retour dans LR
retour en restaurant le PC à partir du LR
si le sous-programme n'est pas une feuille, mettre LR
sur la pile
Appels imbriqués
bx <registre>
1 bit disponible pour spécifier le passage dans l'un
des états THUMB ou ARM
Programmation sur ARM (1/2) - IEM/REDS
21
Instructions ARM
Commentez les bouts de programme ci-dessous et
dessinez les organigrammes correspondants.
cmp r5, #5
@ r5 = 5 ?
cmpne r4, #-5
@ sinon r4 = -5 ?
addeq r0, r1, r1, LSL #2 @ si r5 = 5 ou r4 = -5 @ r0 = 5*r1
cmp r0, #0
@ r0 < 0 ?
rsbmi r0, r0, #0
@ si < r0 = -r0
@ if ((r5 == 5) || (r4 == -5))
@
r0 = 5*r1;
@ r0 = abs(r0);
Programmation sur ARM (1/2) - IEM/REDS
22
Langage d'assemblage
Programmation sur ARM (1/2) - IEM/REDS
23
Langage d'assemblage
Qu'est-ce que l'assembleur?
Un langage composé de mnémoniques
représentant les instructions d’un certain processeur
pouvant être traduit en langage machine (code
binaire).
Correspondance exacte (1-à-1) entre un mnémonique et
une instruction processeur (assemblage d'un opcode avec
son instruction machine).
Désassemblage possible (par un désassembleur)
Un programme qui traduit le langage assembleur en
langage machine.
Il s'agit d'un compilateur d’assemblage.
Programmation sur ARM (1/2) - IEM/REDS
24
Le langage assembleur
Instructions
Pseudo-instructions et macro-instructions
Mnémoniques → instructions machine câblées (code
binaire, langage machine).
Interprétées par le compilateur d’assemblage et
traduites en instruction(s).
Directives
Indications définissant des actions qui seront
exécutées par le compilateur d’assemblage.
Programmation sur ARM (1/2) - IEM/REDS
25
Contenu d'un fichier source (1/4)
Fichier texte contenant:
un programme (mnémoniques)
et/ou des sous-programmes
et/ou des déclarations de données
et/ou des déclarations de macro-instructions
et terminé par un retour de ligne (CR)
Texte composé de lignes, chacune avec 3 parties
optionnelles
{nom:} {instr. | pseudo-instr. | macro-instr. | directive} {@ comment}
Programmation sur ARM (1/2) - IEM/REDS
26
Contenu d'un fichier source (2/4)
nom (« symbol ») :
Etiquette (label) ou nom attribué à une donnée, un
sous-programme ou une macro-instruction
Composé de lettres, chiffres, ‘_’, ‘.’, ‘$’
Doit être suivi de ‘:’
Doit débuter par un chiffre s'il s'agit d'une étiquette
locale
Utilisation dans une boucle
Utilisée lors de branchement
Utilisée dans les macros
Doit être unique et différent des mots-clés
Sensible à la casse (majuscules/minuscules)
Programmation sur ARM (1/2) - IEM/REDS
27
Contenu d'un fichier source (3/4)
{instr.|pseudo-instr.|macro-instr.|directive} :
Utilisation
de mots-clés réservés (à l'exception
des macros), souvent suivis de paramètres
Chaque
instruction est sur une seule ligne (y
compris les paramètres).
Macros
et directives sont sensibles à la casse
(majuscules/minuscules)
Programmation sur ARM (1/2) - IEM/REDS
28
Contenu d'un fichier source (4/4)
{@ comment} :
Commentaire
Depuis
dans le code
le symbole @ jusqu’à la fin de la ligne
Programmation sur ARM (1/2) - IEM/REDS
29
Modes d'adressage (1/2)
Premiers modes d'adressage
Adressage d'un registre
Valeur immédiate (indiquée par #)
#1
#0xF0
#0b11101101
Adressage d'une case mémoire
Rn
Divers modes existent
Exemples
mov r5,r6
@ r5 ⇐ r6
mov r8,#255
@ r8 ⇐ 255 (0xff)
mvn r9,0
@ r9 ⇐ 255
Programmation sur ARM (1/2) - IEM/REDS
30
Modes d'adressage (2/2)
Modes d'adressage de la mémoire
[Rn]
[Rn, #imm]
Pré-indexé
Accès à un élément d'un tableau (base + index)
Possibilité de décalage sur Rj (LSL, LSR, ...)
[Rn], #imm
pré-indexé
Accès à des champs d'une structure, accéder à des paramètres et des variables locales
dans la pile
[Ri,Rj]
Déréférençage (accès à l'adresse contenu dans Rn)
Post-indexé
Accès avec Rn, puis mise à jour de Rn
[Rn, #imm]! ou [Ri,Rj]!
Auto-indexé
Accès à mem [Rn+#imm] ou [Ri+Rj]
Ri = Ri + #imm ou Ri = Ri + Rj
Programmation sur ARM (1/2) - IEM/REDS
31
Exécution en pipeline
!! ATTENTION !!
L'architecture ARM est une architecture en pipeline.
ARM-7/9 ⇒ 3/5 étages de pipeline
1
debut: add r3,pc,#4 @ r3 ⇐ pc+4
mov r1,#5
b
quelquepart
var
.fill 1,4
fetch
2
3
instruction
decode execute
fetch
decode
fetch
execute
decode execute
time
Quand le processeur exécute add r3,pc,#4
il décode l'instruction suivante et il charge
(à l'adresse indiquée par pc) l'instruction suivante,
donc pc = debut+8
8+4 = 12 !
Programmation sur ARM (1/2) - IEM/REDS
32
Groupes d’instructions
Les groupes d'instructions suivants sont définis:
Transfert de données
Entre registres du CPU
Entre registres du CPU et mémoire (ou I/O)
Traitement
Arithmétique
Logique
Comparaisons et tests
Opérations n’affectant que les flags.
Branchement
Contrôle d’exécution
Modification du registre PC
Programmation sur ARM (1/2) - IEM/REDS
33
Transfert de données - reg ⇔ reg
Instructions à 2 opérandes
La donnée est copiée de la source dans la destination
Destination, source
La valeur dans source est inchangée.
Exemples
mov r1, r3
/* r1 := r3 */
mrs r2, cpsr
/* r2 := cpsr */
Programmation sur ARM (1/2) - IEM/REDS
34
Transfert de données - reg ⇔ mem (1/3)
Les instructions de transfert ont 2 opérandes.
Destination, source
Il existe différents mnémoniques en fonction de la taille de la
donnée.
ldr <reg>, <adr>
ldrb <reg>, <adr>
Copie d'un mot de la mémoire dans un registre
str <reg>, <adr>
Copie d'un mot de la mémoire dans un registre
Copie d'un mot de la mémoire dans un registre
strb <reg>, <adr>
Copie d'un mot de la mémoire dans un registre
Programmation sur ARM (1/2) - IEM/REDS
35
Transfert de données - reg ⇔ mem (2/3)
ldr et str permettent le transfert d'un mot à la fois
Il existe deux autres instructions pour agir sur plusieurs
mots à la fois:
<ldm¦stm>{cond}<FD|ED|FA|EA|IA|IB|DA|DB>Rn{!},<Rlist>{^}
F : Full
D: Descending stack adresse I: Increment
B : Before
E : Empty
A : Ascending stack adresse
A : After
D: Decrement
Programmation sur ARM (1/2) - IEM/REDS
36
Transfert de données - reg ⇔ mem (3/3)
Exemples
ldr r0,[r1]
/* r0 := mem32[r1] */
ldr r0,[r2,#-3]
/* r0 := mem32[r2 – 3] */
ldr r0,[r1,+r2,LSL #2]
/* r0 := mem32[r1 + r2 • 22] */
ldmia r1, {r0,r2,r5}
/* r0 := mem32[r1] */
/* r2 := mem32[r1 + 4] */
/* r5 := mem32[r1 + 8] */
Programmation sur ARM (1/2) - IEM/REDS
37
Format des instructions (1/3)
Transfert d’un seul word ou d’un byte non signé
Programmation sur ARM (1/2) - IEM/REDS
38
Format des instructions (2/3)
Transfert d’un half-word ou d’un byte signé
Programmation sur ARM (1/2) - IEM/REDS
39
Format des instructions (3/3)
Transfert d’un bloc de N registres parmi les 16 registres
Echange entre un registre et une case mémoire
Programmation sur ARM (1/2) - IEM/REDS
40
Instructions de transfert
Le tableau tab débute à l'adresse 0x00c24f54.
⇒
Complétez le code ci-dessous. Partez du principe que le
processeur est configuré en little-endian.
R1
r1,
r2,
r2,
r2,
tab
[r1]
[r1]
[r1], #4
ldrb r2, [r1]
ldr r2, [r1,#4]!
ldr
tab
Adresses croissantes
adr
ldrb
ldr
ldr
R2
r2, [r1,#2]
Programmation sur ARM (1/2) - IEM/REDS
A0
D0
74
24
05
35
25
A5
F0
07
1B
87
41
Instructions de traitement (1/4)
Opérandes possibles:
Registres (32 bits)
Valeur immédiate
Dans le code de l’instruction, exprimée avec 12 bits seulement
Pas d’opérande en mémoire !!
Les 3 opérandes sont spécifiés séparément.
Destination (du résultat)
Opérande 1
Registre
Registre
Opérande 2
Registre ou valeur immédiate
Programmation sur ARM (1/2) - IEM/REDS
42
Instructions de traitement (2/4)
Exemples
add r0, r1, r2
/* r0 := r1 + r2 */
/* Avec une valeur immédiate sur 12 bits (val: 8 bits, n: 4 bits)
immediate = val • 22n 1 à 255 décalé 0, 2, 4,... ou 32 bits à gauche */
add r0, r2, #3
/* r0 := r2 + 3 */
/* Ce n’est pas un simple transfert, car la valeur est décalée */
mov r1, r3, LSL #4
/* r1 := r3 • 24 */
Programmation sur ARM (1/2) - IEM/REDS
43
Instructions de traitement (3/4)
Format des instructions
Programmation sur ARM (1/2) - IEM/REDS
44
Instructions de traitement (4/4) - Opcodes
Opcode[24:21]
Mnemonic
Signification
0000
and
Logical bit-wise AND
Rd := Rn AND Op2
0001
eor
Logical bit-wise exclusive OR
Rd := Rn EOR Op2
0010
sub
Substract
Rd := Rn - Op2
0011
rsb
Reverse subtract
Rd := Op2 - Rn
0100
add
Add
Rd := Rn + Op2
0101
adc
Add with carry
Rd := Rn + Op2 + C
0110
sbc
Substract with carry
Rd := Rn - Op2 + C - 1
0111
rsc
Reverse substract with carry
Rd := Op2 -Rn + C - 1
1000
tst
Test
Scc on Rn AND Op2
1001
teq
Test equivalence
Scc on Rn EOR Op2
1010
cmp
Compare
Scc on Rn - Op2
1011
cmn
Compare negated
Scc on Rn + Op2
1100
orr
Logical bit-wise OR
Rd := Rn OR Op2
1101
mov
Move
Rd := Op2
1110
bic
Bit clear
Rd := Rn AND NOT Op2
1111
mvn
Move negated
Rd := NOT Op2
Programmation sur ARM (1/2) - IEM/REDS
Effet
45
Instructions de traitement
Soit les variables entières signées x, y, z.
x dans l’adresse mémoire 0x010
y dans l’adresse mémoire 0x014
z dans l’adresse mémoire 0x018
⇒ Codez en assembleur les opérations ci-dessous.
@z=x+y+4
@ z = 3x – 5
@ z = (x + y) / (y – 4)
@ z = 4x2 + 3
Programmation sur ARM (1/2) - IEM/REDS
46
Instructions de branchement (1/3)
Branchement inconditionnel
Branchement conditionnel
Branchement avec lien (adresse de retour)
Inconditionnel
Appel
ou conditionnel
de sous-programme
Programmation sur ARM (1/2) - IEM/REDS
47
Instructions de branchement (2/3)
Exemples
b <label>
bne <label>
bl
SPrg
….
SPrg:
…
mov
pc, lr
@
@
@
@
@
PC :=
si NE
sinon
LR :=
puis
<label>
alors PC := <label>
PC := PC + 4
adr ret
PC := SPrg */
@ PC := LR (return)
Programmation sur ARM (1/2) - IEM/REDS
48
Instructions de branchement (3/3)
Format de l'instruction
Branchement
cond
101
L 24-bit signed word offset
Branchement
cond
avec (bl) et sans lien (b)
avec changement d'état (bx)
000100101111111111110001
Programmation sur ARM (1/2) - IEM/REDS
Rm
49
Instructions de branchement
⇒ Ecrire un programme qui calcule la somme des 10 premiers
entiers.
Programmation sur ARM (1/2) - IEM/REDS
50
Récapitulation
Ecrire un programme qui recherche le maximum dans un tableau de
10 entiers signés.
Programmation sur ARM (1/2) - IEM/REDS
51
Références
Cours NUM3 de l'ancienne orientation IT
ARM System Developer's Guide
Programmation sur ARM (1/2) - IEM/REDS
52
Téléchargement