Samma kod skriven som "absolute mode" och "relocatable mode".
I en sådan här kort kod blir inte fördelarna med relocatable mode helt tydliga, men skillnaderna i själva koden framgår förhoppningsvis. De punkter där det skiljer är markerade med rött. Notera också att men ska lägga till LKR filen till Linker Scripts i projekt-fönstret i MPLAB. Dessa LKR filer ligger i installationskatalogen för MPLAB.
Glöm inte att titta i MAP filen också, där det framgår vart länkaren har lagt koden och variablerna.
(I absolute mode skapas ingen MAP fil...)
Se även min infosida om relocatable mode.
Absolute mode |
Relocatable mode |
;********************************************* ; Enkelt blink-a-led, 16F628A. ; ;********************************************* ; Files required: P16F628A.INC ; ; ;********************************************* ; ; list p=16f628A #include <p16f628A.inc> ; __CONFIG _DATA_CP_OFF & _CP_ON & _LVP_OFF & _BODEN_OFF & _BOREN_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _MCLRE_ON ; ;********************************************* ; Här början den igentligen koden... ; Vi måste ange h'0000' i koden eftersom ; länkaren inte används. ; ; RESET_VECTOR ORG h'0000' goto start nop nop nop goto isr_routine ; ; ; ;********************************************* ; Några variabler. ; De används inte i koden men visar skillanden ; mellan abs och reloc mode. Varablerna läggs i ; "shared/unbanked memory" för att slippa ; banksel... ; Var1 EQU h'70' Var2 EQU h'71' Var3 EQU h'72' ; ; ; ;********************************************* ; Huvudkoden. ; Notera användningen av ORG + adress ! ; ; MAIN ORG h'0010' ; start ; banksel cmcon movlw h'07' movwf cmcon ; Stäng av ADC. ; banksel trisa clrf trisa clrf trisb ; Alla = utgångar. ; banksel t1con movlw b'00110001' movwf t1con ; Se datablad... ; banksel pie1 movlw b'00000001' movwf pie1 ; Avbrott från TMR1. ; banksel intcon bsf intcon, peie bsf intcon, gie ; Avbrott... ; loop goto loop ; Vänta på avbrott... ; ; ; ;********************************************* ; Interruptkoden. ; Notera användningen av ORG + adress ! ; ISR_ROUTINE ORG h'0080' ; isr_routine ; banksel porta comf porta, f ; Blinka !! ; banksel pir1 bcf pir1, tmr1if ; retfie ; ;********************************************* ; end |
;********************************************* ; Enkelt blink-a-led, 16F628A. ; ;********************************************** ; Files required: P16F628A.INC ; 16F628A.LKR ; ;********************************************** ; ; list p=16f628A #include <p16f628A.inc> ; __CONFIG _DATA_CP_OFF & _CP_ON & _LVP_OFF & _BODEN_OFF & _BOREN_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _MCLRE_ON ; ;********************************************** ; Här början den igentligen koden... ; "STARTUP" är definierat i LNK filen till ; h'0000'. Genom att kalla kodsegmentet nedan ; för STARTUP, så läggs det automatisk rätt. ; STARTUP CODE goto start nop nop nop goto isr_routine ; ; ; ;********************************************** ; Några variabler. ; De används inte i koden men visar skillanden ; mellan abs och reloc mode. Varablerna läggs i ; "shared/unbanked memory" för att slippa ; banksel... ; MY_VARS UDATA_SHR Var1 RES 1 Var2 RES 1 Var3 RES 1 ; ; ;********************************************** ; Huvudkoden ; Ingen adress angiven, länkaren lägger ; koden där det är "ledigt"... ; MAIN CODE ; start ; banksel cmcon movlw h'07' movwf cmcon ; Stäng av ADC. ; banksel trisa clrf trisa clrf trisb ; Alla = utgångar. ; banksel t1con movlw b'00110001' movwf t1con ; Se datablad... ; banksel pie1 movlw b'00000001' movwf pie1 ; Avbrott från TMR1. ; banksel intcon bsf intcon, peie bsf intcon, gie ; Abrott... ; loop goto loop ; Vänta på avbrott... ; ; ; ;********************************************** ; Interruptkoden. ; Notera användningen av CODE ! ; ISR_ROUTINE CODE ; isr_routine ; banksel porta comf porta, f ; Blinka !! ; banksel pir1 bcf pir1, tmr1if ; retfie ; ;********************************************* ; end |
Här kommer MAP filen för exemplet ovan.
"Section info" listar resultatet av varje CODE och UDATA/UDATA_SHR direktiv, plus
lite som läggs till automatisk men som är ointressant just nu...
"Symbols" listar alla symboler vilka kan vara "lables" eller variabler (det är igentligen samma
sak, bara något som innehåller en adress till flashminnet eller till RAM minnet...)
Notera att symboler skapade med EQU *inte* kommer med i denna lista! Utan enbart de
symboler där MPASM/MPLINK *vet* att det är just en *adress* till något i minnet.
En symbol skapad med EQU kan ju innehålla precis vad som helst...
MPLINK 4.11, Linker
Linker Map File - Created Wed Jul 04 15:29:15 2007
Section Info
Section Type Address Location Size(Bytes)
--------- --------- --------- --------- ---------
STARTUP code 0x000000 program 0x00000a
.cinit romdata 0x000005 program 0x000004
MAIN code 0x000007 program 0x00002a
ISR_ROUTINE code 0x00001c program 0x00000e
.config code 0x002007 program 0x000002
MY_VARS udata 0x000070 data 0x000003
Program Memory Usage
Start End
--------- ---------
0x000000 0x000022
0x002007 0x002007
36 out of 2182 program addresses used, program memory utilization is 1%
Symbols - Sorted by Name
Name Address Location Storage File
--------- --------- --------- --------- ---------
ISR_ROUTINE 0x00001c program static C:\DATA\proj\abs_reloc\reloc.asm
LOOP 0x00001b program static C:\DATA\proj\abs_reloc\reloc.asm
START 0x000007 program static C:\DATA\proj\abs_reloc\reloc.asm
VAR1 0x000070 data static C:\DATA\proj\abs_reloc\reloc.asm
VAR2 0x000071 data static C:\DATA\proj\abs_reloc\reloc.asm
VAR3 0x000072 data static C:\DATA\proj\abs_reloc\reloc.asm
Symbols - Sorted by Address
Name Address Location Storage File
--------- --------- --------- --------- ---------
START 0x000007 program static C:\DATA\proj\abs_reloc\reloc.asm
LOOP 0x00001b program static C:\DATA\proj\abs_reloc\reloc.asm
ISR_ROUTINE 0x00001c program static C:\DATA\proj\abs_reloc\reloc.asm
VAR1 0x000070 data static C:\DATA\proj\abs_reloc\reloc.asm
VAR2 0x000071 data static C:\DATA\proj\abs_reloc\reloc.asm
VAR3 0x000072 data static C:\DATA\proj\abs_reloc\reloc.asm