Programallokering Att placera program i flashrespektive RAM-minne Program i FLASH-minne Bara lokala variabler Globala oinitierade variabler Globala initierade variabler Program med avbrott Program i RAM-minne Bara lokala variabler Globala oinitierade variabler Globala initierade variabler Program med avbrott Programtyper Kräver skrivbar stack Kräver skrivbart bss segment Kräver skrivbart data segment Kan göras helt självgående tack vara Resetvektorn Kan ej göras helt självgående RAM är skrivbart Kräver att avbrottsvektorer relokeras till RAM 1
Standardkonfiguration för projekt Typ av applikation Projektets startup-fil Namn på laddfil Switchar Standardbibliotek Skapa mapfil Länkarskript Konstantsegment (kräver inget minne) Startupsegment Kodsegment Segment för konstant initierad data Initierad data Oinitierad data Länkarkonfigurering Länkarskript Assemblatorkonfigurering Kompilatorkonfigurering Definedirektiv Segmentgrupper Minnesallokering Relokerade avbrottsvektorer Alla segment i den ordning de står Start av RAM 2
Systemets startup-fil Sätt stackpekare Initiera serieport för simulator Initiera C-bibliotek som finns med i XCCinstallationen Gå till applikation Systemets startup-fil forts. Kolla efter hårdvara Initiera inte om hårdvara utan använd initiering i debugger Anropa rutin i debugger Skapa från rutiner i debugger 3
Enkelt program för RAM med bara lokala variabler och inga avbrott h-fil med symboliska namn på alla processorregister Pekarmakron Lokala variabler Startupfil för enkelt program för RAM med bara lokala variabler och inga avbrott Vad behåller vi? Initiering av stack Uppsättning av C-bibliotek Flytta till längst upp i RAM, dvs 0x3FFF Anrop av applikation Vad tar vi bort? Serieportsinitiering för simulator Anrop av rutiner i debugger Vad lägger vi till? MC12 använder initiering av PLL i debugger. Vi måste skriva egen itiering Egen initiering av serieport om vi behöver sådan - Rutiner för outchar, tstchat och inchar 4
Systemets startup-fil forts. Registerdefinitioner Stack längt upp i RAM Initiera PLL Initiera C-bibliotek Gå till applikation Systemets startup-fil forts. Sätt PLL-frekvens till 16 MHz Vänta på låst PLL Välj PPL-klockan som referens för bussklockan SYNR 1 PLLCLK 2 OSCCLK REFDV 1 OBS 5
Länkarskript för RAM-applikation utan relokerade avbrottsvektorer Allt i en följd Project/Settings Egen startup-fil. Glöm inte att inkludera filen i projektet Länkarskript Skapa listfil Behåll assemblerfil 6
Vad visar mapfilen? 1(3) Start- och slutadress för grupp I gruppen ingående segment Start- och slutadress för segment Vad visar mapfilen? 2(3) Start för segment Slut för segment Segmentstorlek Innehåll från initiering av C-bibliotek 7
Vad visar mapfilen? 3(3) Från initiering av C-bibliotek Nå i h Några register- och bitmanipuleringsfunktioner i C 8
Läsning från register Exempel: läsning av resultatregistret ATD0DR4L indata *((unsigned char *)(0x0099)); Användande av pekarmakro och symboliskt registernamn indata REG8(ATD0DR4L); Att skriva till register Exampel: activera ATD0 genom att sätta bit ADPU in registret ATD0CTL2 *((unsigned char *)(0x0082)) 0x80; Användande av pekarmakro och symboliskt registernamn REG8(ATD0CTL2) 0x80; Komplettera med symboliskt bitnamn REG8(ATD0CTL2) ADPU; 9
Att testa registerbitar Exampel: vänta på Conversion Complete Flag 5 (CCF5) ; while! REG8 ATD0STAT1 &CCF5 Sätta registerbitar Enstaka bitar Exampel: Aktivera digital it ingång 3 iatd0 REG8(ATD0DIEN) IEN3; Multipla bitar Exampel: Sätt Fast Clear Flag och aktivera ATD REG8(ATD0CTL2) ADPU AFFC; 10
Att sätta registerbitar utan att påverka övriga bitar Exempel: välj 8 bitars upplösning genom att sätta bit 7 i ATD0: kontrollregister 4 REG8(ATD0CTL4) Alternativt REG8(ATD0CTL4) SRES8; REG8(ATD0CTL4) SRES8; Att nollställa registerbitar Exempel: välj datarepresentation utan tecken i ATD0:s resultatregister genom att nollställa bit 6 i ATD0:s kontrollregister 5 REG8(ATD0CTL5) REG8(ATD0CTL5)& ~DSGN ; Alternativt REG8(ATD0CTL5)& ~DSGN; OBS ~ inte! 11
Enkelt program för RAM med globala oinitierade variabler Global oinitierad variabel Samma startupfil som tidigare Samma skriptfil som tidigare 12
Vad visar mapfilen? 1(3) Adresser något förändrade Vad visar mapfilen? 2(3) Något mindre Något större Oförändrat 13
Vad visar mapfilen? 3(3) Ny, oinitierad variabel i bss Enkelt program för RAM med globala initierade variabler Global initierad variabel 14
Samma startupfil som tidigare Samma skriptfil som tidigare Vad visar mapfilen? _temp har flyttat från bss till data 15
Enkelt program för FLASH med bara lokala variabler Kod som via länkarskript placeras på adress 0xFF0E i FLASH för att göra FLASH-minnet läsbart Vad måste vi ändra i startup-filen? Ingenting! Filen påverkar bara initiering av TOS i RAM 16
Länkarskript för applikation med bara lokala variabler i FLASH-minne Bara lokal kod Ingen plats krävs för variabler Vi borde kunna nöja oss med ett text-segment men XCC kräver att alla segment är med Lägg övriga segment på ett bra sätt för framtida applikationer Lägg bss i RAM för att vara skrivbar Lägg övriga segment i FLASH Skriv inte över avbrottsvektorerna Länkarskript för applikation med bara lokala variabler i flashminne forts. Till RAM Till FLASH Till RAM Till FLASH Undvik avbrottsvektorerna och unsecure 17
Vad visar mapfilen? 1(3) I RAM I FLASH Vad visar mapfilen? 2(3) Nytt 18
Vad visar mapfilen? 3(3) Nytt Enkelt program för flashminne med oinitierade globala variabler Global oinitierad variabel 19
Samma startuppfil Samma länkarskript Vad visar mapfilen? Oinitierad variabel i bss 20
Enkelt program för flashminne med initierade globala variabler Global initierad variabel Vad visar mapfilen? Initierad variabel i data Men data ligger ju i FLASH och är inte skrivbart??? 21
Hur gör vi datasegmentet skrivbart? data-segmentet kan inte ligga i RAM från början då det innehåller initierade variabler vars värden måste finnas med i programkoden Slutsats! Vårt program måste kopiera data-segmentet till RAM XCC:s C-bibliotek innehåller rutiner för detta så vi behöver bara ge en flagga till länkaren. Vi behöver inte ändra i programkoden men i den assemblerade och länkade koden så måste alla referenser till de initierade variablerna nu gå till adresserna för deras kopior i RAM. Detta sker automatiskt Project/Settings Kopiera data-segment till RAM 22
Vad visar mapfilen? 1(3) data-segment i FLASH Kopia av datasegment i RAM Vad visar mapfilen? 2(3) Ingen förändring Kopian av datasegmentet syns inte men ligger direkt ovanför bss-segmentet 23
Vad visar mapfilen? 3(3) Ingen förändring Program i flash med avbrott Byt ut fördröjning mot avbrott från realtidsklockan Initiera avbrott Avbrott från realtidsklocka Resetvektor Låt resetvektorn peka på _start i startup-filen Skriv avbrottsrutin för realtidsklockan 24
Program i flash med avbrott forts. Initiera RTI Vänta på avbrott Program i flash med avbrott forts. Interruptrutin Avbrottsvektor för RTI med pekare till avbrottsrutin Resetvektor med pekare till avbrottsrutin 25
Skriptfil 1(2) Skriptfil 2(2) Avbrottsvektor för RTI Resetvektor Avbrottsvektor för RTI Resetvektor 26
Samma startupfil som tidigare då vi inte har några relokerade avbrottsvektorer Vad visar mapfilen? 1(3) Avbrottsvektorer för RTI Avbrottsvektorer för RESET 27
Vad visar mapfilen? 2(3) Avbrottsvektor för RTI Avbrottsvektor för RESET Vad visar mapfilen? 3(3) Avbrottsvektor för RTI Avbrottsvektor för RESET 28
Mer generell avbrottshantering i flash Lägg med alla avbrottsvektorer Låt de avbrott vi inte använder peka på en tom dummy-rutin Mer generell avbrottshantering i flash forts. Avbrottsvektorer Skapa minnessegment Utfyllnad på reserverade adresser Namn på avbrottsrutiner Resetvektor 29
Mer generell avbrottshantering i flash forts. Dummy-rutin Mer generell avbrottshantering i flash forts. Omdirigering till dummyrutin Omdirigera inte det avbrott vi skall använda Resetvektorn skall inte omdirigeras och saknas därför här 30
Länkarskript för avbrottshantering i flash Länkarskript för avbrottshantering i flash forts. Avbrottsvektortabell Avbrottsvektoradresser 31
Samma startupfil som tidigare då vi inte har några relokerade avbrottsvektorer som skulle behöva plats i RAM Vad visar mapfilen? 1(3) avbrottsvektorer 32
Vad visar mapfilen? 2(3) Avbrottsvektorsegment Vad visar mapfilen? 3(3) Avbrottsrutin Avbrottsvektorer 33
Avbrottshantering i RAM Vi behöver Ett program i flashminne som mappar om avbrottsvektorerna till RAM Detta program kan sedan om det skrivs tillräckligt generellt användas av alla senare RAMapplikationer med avbrott RAM-applikationer som använder de ommappade avbrottsvektorerna Ommappning av avbrottsvektorer Låt de verkliga avbrottsvektorerna peka, inte på en avbrotts- eller en dummyrutin, utan på var sin rutin som gör ett hopp till en adress i RAM Vi förfinar det ytterligare genom att inte låta rutinen ange vart vi skall hoppa utan vi låter den läsa vart den skall hoppa från en adress i RAM där vi kan skriva in adressen till vår avbrottsrutin Vi gör en ny relokerad avbrottsvektortabell i RAM 34
Ommappning av avbrottsvektorer Ny avbrottsvektortabell Ser ut som den tidigare avbrottsvektortabellen men med nya funktionsnamn till relokeringsfunktionerna Ommappning av avbrottsvektorer forts. Rutin för läsning av avbrottsrutinens adress från ommappad avbrottsvektortabell i RAM Den relokerade avbrotts- vektortabellens t startadress t Läser den adress som hoppet skall ske till från minnesadressen x+offset = REL_IRQ_START+offset 0x3F80 i stället för den verkliga avbrottssvektortabellens startadress 0xFF80 Olika för olika avbrott 35
Ingen startupfil t då vi bara gör ett bakgrundsprogram utan stack och utan anrop till huvudprogram. Ingen initiering av stack etc Samma länkarskript som för den generella avbrottshanteringen a i flash Vad visar mapfilen? 1(3) init, bss och datasegment saknas (egentligen är de tomma) Relokeringsfunktioner Avbrottsvektorer 36
Vad visar mapfilen? 2(3) Relokeringsfunktioner Tomma segment Vad visar mapfilen? 3(3) Avbrottsvektorsegment Relokeringsfunktioner Avbrottsvektorer 37
Program med enstaka avbrott i RAM Detta är ett nytt program som använder relokeringen Nästan samma program som det i FLASH-minne Ingen Resetvektor då detta program inte blir fristående Adressen till vår avbrottsrutin skall skrivas in till rätt ommappade avbrottsvektor Skriptfilen skall placera programmet i RAM-minne Program eller stack får inte störa den ommappade avbrottsvektortabellen. TOS måste ligga på en adress som är lägre än den ommappade avbrottsvektortabellens startadress (REL_IRQ_START), välj 0x3F7F Program med enstaka avbrott i RAM forts. Programkod Adress till ommappad avbrottsvektor 38
Program med enstaka avbrott i RAM forts. Programkod forts. Skriv adress till avbrottsrutin till avbrottets adress i den ommappade avbrottsvektortabellen Program med avbrott i RAM Skriptfil Den ommappade avbrottsvektortabellen placeras inte i RAMminnet av länkaren så den behöver inte vara med i skriptet Adresserna till våra avbrottsrutiner skriver vi till vår ommappade avbrottsvektortabell via vårt C- program Inkludera inte ommappad avbrottsvektortebell 39
Program med avbrott i RAM forts. Startupfil Ändra Top Of Stack (TOS) till 0x3F7F Vad visar mapfilen? 1(3) 40
Vad visar mapfilen? 2(3) Vad visar mapfilen? 3(3) Avbrottsrutin 41
Generellt program med avbrott i RAM På samma sätt som i flash tar vi med hela avbrotts- vektortabellen, t här ommappad Den ommappade avbrottsvektortabellen måste tas med i skriptfilen Startup-filen påverkas inte (TOS nedanför relokerade avbrottsvektorer) Låt oanvända avbrott omdirigeras till en tom dummyrutin Generellt program med avbrott i RAM forts. Programkod Ingen #define av avbrottsvektoradress 42
Generellt program med avbrott i RAM forts. Programkod forts. Ingen initiering av avbrottsvektor Avbrottsrutin Dummyrutin Generellt program med avbrott i RAM forts. Programkod forts. Omdirigering till dummyrutin Dirigera inte om den avbrottsvektor som används 43
Generellt program med avbrott i RAM forts. Programkod forts. Relokerad avbrottsvektortabell Generellt program med avbrott i RAM forts. Skriptfil Ommappade avbrottsvektorer Ommappad avbrottsvektortabell 44
Vad visar mapfilen? 1(3) Relokerade avbrottsvektorer Vad visar mapfilen? 2(3) Segment för relokerade avbrottsvektorer 45
Vad visar mapfilen? 3(3) Avbrottsrutin Relokerade avbrottsvektorer 46