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