2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 Wouter van Ooijen Mail: [email protected] Sheets en info: www.voti.nl/hvu/PEMSY1 Onderwerp: Programmeren van een Embedded Systeem Literatuur: ARM system on chip architecture S.B. Furber Addison Wesley Longman 0-201-67519-6 Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 2 instructie aan de hand van sheets boek als ondersteuning opgaves, in de les of thuis maken ARM V3.2 bordje aanschaffen (€ 60), wordt in volgende vak(ken) weer gebruikt tentamen 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 3 inleiding embedded/real-time/microcontrollers eerste uitleg ARM assembly language oefeningen ARM assembler met de simulator 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 4 steeds meer transistoren op een chip... losse transistor analoge ICs logica micro processor micro controller programmeerbare logica ‘super’ microprocessor klant-specifieke logica uC als IP 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 5 meestal: ‘computer-achtig’ ding geschikt voor real-time geschikt voor embedded gebruik combinatie van processor, ROM, RAM, I/O, ... compact goedkoop zuinig 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 ergens in, deel van een geheel vaste functie, dus niet vrij programmeerbaar 6 2007-2008 PEMSY1 niet: snel zo snel mogelijk interactief, batch wel: op tijd! http://www.voti.nl/hvu/PEMSY1 7 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 nut responstijd 8 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 ultra-goedkoop chinees, inclusief de documentatie lastig verkrijgbaar general-purpose PIC, Atmel, 8051, 68HC high-end ARM, PowerPC special purpose DSP, ethernet, USB, analoog, ... 9 2007-2008 PEMSY1 IP kale chip chip in behuizing module PCB box (bv PLC) http://www.voti.nl/hvu/PEMSY1 10 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 bijna altijd cross-development: jij werkt op een PC daar draait je editor, compiler, assembler, linker loader of programmer om te laden evt. In-Circuit Debugger luxer: ICE primitiever: burn and crash 11 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 C (of een andere HLL): grof makkelijk en snel reduceert de ontwikkelkosten Assembler: nauwkeurig moeilijker, specifiek, meer werk reduceert de hardware kosten 12 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 13 vaak het meeste in C kritische delen soms in assembler kennis van assembler is nuttig voor efficient gebruik van een controller, ook in C ! het zal je maar gebeuren: een bug in je compiler... 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 CISC doe zo veel mogelijk per instructie codeer instructies compact RISC voer zoveel mogelijk instructies uit codeer instructies simpel 14 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 1983 : een opvolger voor the BEEP uit pure noodzaak: RISC, klein Acorn RISC Machine zuinig (veel MIPS per Watt) krachtig beschikbaar als chip, maar ook als IP interne of externe bus MAC 15 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 ARM Advanced RISC Machines • load store architecture • fixed length 32-bit instructions • 3-address instruction formats • many instructions execute in one cycle • instructions are conditionally executed 16 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 17 registers en geheugen R0 0000 0000 R1 0000 0001 R2 0000 0002 R3 0000 0003 R4 0000 0004 R5 0000 0005 R6 0000 0006 R7 0000 0007 R8 0000 0008 R9 0000 0009 R10 ……. R11 FFFF FFFB R12 FFFF FFFC R13 = SP FFFF FFFD R14 = LR FFFF FFFE R15 = PC FFFF FFFF registers ARM processor geheugen chip 2007-2008 PEMSY1 18 http://www.voti.nl/hvu/PEMSY1 ARM User Programming model 31 0 r0 r1 r2 r3 r4 r5 r6 r7 31 0 r8 r9 r10 r11 r12 r13 r14 r15 (PC) 0 31 CPSR Status register NZCV r13: stack pointer r14: link register 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 Data Movement – load a constant value LDR destination, =value • Examples: – LDR r0, =10 – LDR r1, =’a’ – LDR r2, =buffer Let op: het boek gebruikt ADR R2, buffer Geen # betekent: er volgt een label Dit is geen ‘echte’ ARM instructie Destination moet een register zijn 19 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 LDR R0, =value R0 0000 0000 R1 0000 0001 R2 0000 0002 R3 0000 0003 R4 0000 0004 R5 0000 0005 R6 0000 0006 R7 0000 0007 R8 0000 0008 R9 0000 0009 R10 ……. R11 FFFF FFFB R12 FFFF FFFC R13 = SP FFFF FFFD R14 = LR FFFF FFFE R15 = PC FFFF FFFF registers geheugen 20 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 Data Movement – load from a register MOV destination, source • Examples: – MOV – MOV – MOV r0, r1 r1, r2 r2, r3 21 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 MOV R0, R1 R0 0000 0000 R1 0000 0001 R2 0000 0002 R3 0000 0003 R4 0000 0004 R5 0000 0005 R6 0000 0006 R7 0000 0007 R8 0000 0008 R9 0000 0009 R10 ……. R11 FFFF FFFB R12 FFFF FFFC R13 = SP FFFF FFFD R14 = LR FFFF FFFE R15 = PC FFFF FFFF registers geheugen 22 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 Data Movement – load from memory LDR destination, [ source_pointer ] • Examples: – LDR r1, [ r3 ] 23 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 LDR R0, [ R1 ] R0 R1 0000 0000 000 0004 0000 0001 R2 0000 0002 R3 0000 0003 R4 0000 0004 R5 0000 0005 R6 0000 0006 R7 0000 0007 R8 0000 0008 R9 0000 0009 R10 ……. R11 FFFF FFFB R12 FFFF FFFC R13 = SP FFFF FFFD R14 = LR FFFF FFFE R15 = PC FFFF FFFF registers geheugen 24 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 Data Movement – save to memory STR destination, [ destination_pointer ] • Examples: – STR r1, [ r3 ] 25 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 STR R0, [ R1 ] R0 R1 0000 0000 FFFF FFFC 0000 0001 R2 0000 0002 R3 0000 0003 R4 0000 0004 R5 0000 0005 R6 0000 0006 R7 0000 0007 R8 0000 0008 R9 0000 0009 R10 ……. R11 FFFF FFFB R12 FFFF FFFC R13 = SP FFFF FFFD R14 = LR FFFF FFFE R15 = PC FFFF FFFF registers geheugen 26 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 27 Data processing Instructions • Largest group of instructions, all sharing the same instruction format. • Contains: – – – – Arithmetic operations Comparisons (no results - just set condition codes) Logical operations Data movement between registers • Remember, this is a load / store architecture – These instruction only work on registers, NOT memory. • They each perform a specific operation on one or two operands. – First operand always a register - Rn 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 Arithmetic Operations • Operations are: – – – – – – ADD ADC SUB SBC RSB RSC operand1 + operand2 operand1 + operand2 + carry operand1 - operand2 operand1 - operand2 + carry -1 operand2 - operand1 operand2 - operand1 + carry - 1 • Syntax: – <Operation> Rd, Rn, Operand2 • Examples – ADD r0, r1, r2 – SUBGT r3, r3, #1 – RSBLES r4, r5, #5 28 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 29 Logical Operations • Operations are: – – – – AND EOR ORR BIC operand1 AND operand2 operand1 EOR operand2 operand1 OR operand2 operand1 AND NOT operand2 [ie bit clear] • Syntax: – <Operation> Rd, Rn, Operand2 • Examples: – AND – BICEQ – EORS r0, r1, r2 r2, r3, #7 r1,r3,r0 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 ADD R3, R1, R2 R0 0000 0000 R1 0000 0001 R2 0000 0002 R3 R4 R5 + 0000 0003 0000 0004 0000 0005 R6 0000 0006 R7 0000 0007 R8 0000 0008 R9 0000 0009 R10 ……. R11 FFFF FFFB R12 FFFF FFFC R13 = SP FFFF FFFD R14 = LR FFFF FFFE R15 = PC FFFF FFFF registers geheugen 30 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 copieer de files uit empty.zip in een lege directory let op: geen spaties in de pathname dubbel-klik op de .ppr file edit je main.s build (ctrl-F9) start debugger (F9) 31 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 .global main LABEL1: LABEL2: X: Y: Z: .word 10 .word 11 .word 12 .word 13 .word 14 .align @ begin main main: @ hier komt je code @ einde main klaar: b klaar 32 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 na starten van de debugger zet je onder file > target settings: Target = Simulator (als je netjes afsluit blijft zou dit moeten blijven staan) 33 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 (evt. kan je breakpoints zetten of verwijderen) run als het goed is kom je nu op een breakpoint aan het begin van main 34 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 Loop nu instructie voor instructie door je programma heen (step) Let op wat er veranderd in de regsiters en (uiteindelijk) in het geheugen 35 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 Maak de registers en een stuk geheugen zichtbaar 36 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 37 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 - Doe twee stappen, - kijk in R1 waar in het geheugen getal_1 terecht is gekomen - Laat je geheugen venster daarheen wijzen 38 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 Doen – thuis lezen lees 3.1 t/m blz 52 3.2 t/m blz 58 halverwege 39 2007-2008 PEMSY1 http://www.voti.nl/hvu/PEMSY1 40 Doen - hier oefenen 1. Schrijf en test een programma dat de waarden in R0 en R1 verwisselt. Je hebt een extra register nodig. 2. Schrijf en test een programma dat de waarden in de geheugenlocaties X en Y optelt, en het resultaat in geheugenlocatie Z zet. 3. Schrijf en test een programma dat de waarden in de geheugenlocaties LABEL1 en LABEL2 verwisselt. Let goed op het verschil tussen een label en de inhoud van het geheugen op de plek van dat label.