AVR Assembler handledning 3 (4 / 9 steg)
Steg 4: .org assembler direktiven
Vi vet redan vad de .nolist, .lista, .include och .def assembler direktiv göra från vår tidigare tutorials, så låt oss först ta en titt på de 4 rader kod som kommer efter det:
.org 0x0000
JMP Reset
.org 0x0020
JMP overflow_handler
.Org uttalandet talar assembler var i "programminne" att sätta nästa uttalande. Som programmet körs, innehåller "Program disk" (förkortat som PC) adressen till den aktuella raden som körs. I det här fallet när PC är 0x0000 det visas kommandot "jmp Reset" som bor i den minnesplatsen. Anledningen till att vi vill sätta jmp Reset i detta läge är eftersom när programmet börjar, eller chip återställs, datorn börjar köra kod på denna plats. Så, som vi kan se, vi har bara sagt det att omedelbart "hoppa" till avsnittet heter "Reset". Varför har vi gjort det? Det innebär att de två sista raderna ovan är bara att vara hoppat över! Varför?
Jo är det där det blir intressant. Du kommer nu att behöva öppna upp en pdf-läsare med full ATmega328p databladet som jag pekade på den första sidan i denna handledning (det är därför det är punkt 4 i den "måste" avsnitt). Om skärmen är för liten, eller du har alldeles för många fönster öppna redan (som är fallet med mig) kan du göra vad jag gör och lägga den på en Ereader, eller din Android-telefon. Du kommer att använda det hela tiden om du planerar att skriva kod. Häftiga är att alla microcontollers är organiserade i mycket liknande sätt och så när du vänjer sig läsa datablad och kodning från dem du kommer att finna det nästan trivialt att göra samma sak för en annan mikrokontroller. Så vi faktiskt lära sig hur man använder alla mikrokontroller i en känsla och inte bara atmega328p.
Okej, vända sig till sidan 18 i databladet och ta en titt på figur 8-2.
Detta är hur programminnet i mikrokontroller ställs in. Du kan se att det börjar med adress 0x0000 och delas upp i två sektioner; en ansökan flash och ett boot flash avsnitt. Om du kortfattat sida 277 tabell visas 27-14 att avsnittet flash tar upp platser från 0x0000 till 0x37FF och boot flash avsnittet tar upp de återstående platserna från 0x3800 till 0x3FFF.
Övning 1: hur många platser finns det i programminnet? Dvs. konvertera 3FFF till decimal och lägga till 1 eftersom vi börjar räkna på 0. Eftersom varje minnesplats är 16 bitar (eller 2 byte) bred vad är det totala antalet byte minne? Nu konvertera detta till kilobyte, att komma ihåg att det finns 2 ^ 10 = 1024 byte i kilobyte. Avsnittet boot flash går från 0x3800 till 0x37FF, hur många kilobyte är detta? Hur många kilobyte minne kvar för oss att använda för att lagra vårt program? Med andra ord, hur stor kan vårt program vara? Slutligen, hur många rader kod kan vi ha?
Okej, nu när vi vet allt om organisationen av flash programminnet, låt oss fortsätta med vår diskussion om .org uttalanden. Vi ser att den första minnesplatsen 0x0000 innehåller vår instruktion att hoppa till vår sektion vi märkt Reset. Nu ser vi vad uttrycket ".org 0x0020" gör. Det säger att vi vill ha anvisningen på nästa rad att placeras på minnesplats 0x0020. Anvisningen har vi placerat finns det en hoppa till ett avsnitt i vår kod som vi har märkt "overflow_handler"... nu varför i helsike skulle vi kräva att detta hoppa ska placeras i minnesplatsen 0x0020? Kan vi slå till sidan 65 i databladet och ta en titt på tabellen 12-6.
Tabell 12-6 är en tabell med "Återställa och avbryta vektorer" och visar exakt där PC kommer att gå när den tar emot ett "avbrott". Till exempel, om du tittar på vektor nummer 1. "Källa" av avbrottet är "RESET" som definieras som "yttre Pin, Power on Reset, Brown-out Reset och vakthund system reset" betyder, om någon av dessa saker hända med våra mikrokontroller, kommer att PC börja köra våra program vid program-minnesplatsen 0x0000. Vad händer med vårt .org direktiv då? Tja, vi placerade ett kommando på minnesplats 0x0020 och om du tittar ner i tabellen ser du att om en Timer/Counter0 overflow händer (kommer från TIMER0 OVF) kommer den att köra oavsett är på plats 0x0020. Så när det händer, PC kommer att hoppa till platsen märkt vi "overflow_handler". Cool rätt? Du kommer att se i en minut varför vi gjorde detta, men först låt oss avsluta detta steg av handledningen med parentes.
Om vi vill göra vår kod mer snyggt och prydligt bör vi verkligen ersätta 4 rader vi diskuterar för närvarande med följande (se sidan 66):
.org 0x0000
rjmp Reset; PC = 0X0000
Reti; PC = 0X0002
Reti; PC = 0X0004
Reti; PC = 0X0006
Reti; PC = 0X0008
Reti; PC = 0X000A
...
Reti; PC = 0X001E
JMP overflow_handler: PC = 0x0020
Reti: PC = 0x0022
...
Reti; PC = 0X0030
Reti; PC = 0X0032
Så att om ett visst avbrott inträffar kommer det att bara "reti" händer vilket betyder "tillbaka från avbrott" och inget annat. Men om vi aldrig "Aktivera" dessa olika avbrott, då de inte kommer att användas och vi kan sätta programkod i dessa fläckar. I vårt nuvarande "blink.asm" program endast vi aktiverar timer0 overflow avbrottet (och naturligtvis reset avbrottet som är alltid aktiverad) och så vi kommer inte att bry sig med andra.
Hur vi "aktiverar" timer0 overflow avbrottet då? ... som är föremål för vårt nästa steg i den här guiden.