Relocatable mode "Kämpa på med felmeddelanden"

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Radioman
Inlägg: 178
Blev medlem: 2 november 2006, 16:15:04
Ort: Stora Höga (4 mil norr GBG)
Kontakt:

Relocatable mode "Kämpa på med felmeddelanden"

Inlägg av Radioman »

Hej alla kodare
Jag lade mig i en annan tråd och vill fortsätta med den avstickaren här och nu i stället.

En kompis till mig försöker lära sig att använda assembler på ett smart sätt. (Jag är också intresserad men har hittills tagit lite genvägar med en basic kompilator. :oops: ) Vi har riktat in oss på mellanklassen och testar mycket med 16f88 och 16f877a.

Han provade ett macro kod exempel från manualen MPASM_&_ MPLINK_33014H, SIDAN 161 7.6.1 Literal to RAM Conversion
och fick ett konstigt larm.

Nu har jag själv knackat in koden och får inte de felet han fick men lika förb.... så får jag ett error. Se här:

MPLINK 4.02, Linker
Copyright (c) 2006 Microchip Technology Inc.
Error - section '.code' can not fit the absolute section. Section '.code' start=0x00000000, length=0x00000020
Errors : 1

BUILD FAILED: Sun Feb 04 17:19:40 2007

Programmet:
Bild

Orginal exemplet säger ORG 0 men jag provade med code 0. Samma fel i bägge fallen.
Kanske är felkoden tydlig men jag förstår då inte vad jag skall göra.
Skall man inte ens kunna få ett exempel att fungera? :rofl
Användarvisningsbild
Icecap
Inlägg: 26660
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Jag gjorde exakt det samma på ett projekt som jag har gjort åt mitt jobb, det är i abs. mode och jag ville ha det i rel. mode.

Under proj. lade jag till .LKR-filen till rätt processor (PIC16F628A) och gjorde:

Kod: Markera allt

	UDATA_SHR
w_temp			res	1	; variable used for context saving 
status_temp		res	1	; variable used for context saving
pclath_temp		res	1	; variable used for context saving
	UDATA
Postscale		res	1	; Every Int_Per_Sec of these is one second
Seconds			res	1	; Used to count the seconds
Minutes			res	1	; Used to count the minutes
Hours			res	1	; Used to count the hours
... många fler variabler ...
;**********************************************************************
Start	CODE	0x000		; Reset location
	nop
	goto	Initialize	; go to beginning of program
;--------------------------------------------------
ISR	CODE	0x004		; Interrupt vector location
	movwf	w_temp		; save off current W register contents
... en hel del mer bla bla
;--------------------------------------------------
	CODE ; Har testat med och utan denna, samma skit ändå
Initialize
	banksel	OPTION_REG	; Select correct bank

Kompileringen går bra, inga fel men linkaren har en dålig dag:
MPLINK 4.02, Linker
Copyright (c) 2006 Microchip Technology Inc.
Error - section 'ISR' can not fit the absolute section. Section 'ISR' start=0x00000004, length=0x000000c6
Errors : 1
BoF
EF Sponsor
Inlägg: 222
Blev medlem: 7 oktober 2006, 16:43:37

Inlägg av BoF »

Lägg in koden nedanför under include direktivet.

Kod: Markera allt

RESERT_VECTOR CODE 0x00                  ; Resert vector
	        goto Start	          ; Jump to Main address
Plus som Icecap säjer .LKR fil skall läggas till projektet.
BoF
EF Sponsor
Inlägg: 222
Blev medlem: 7 oktober 2006, 16:43:37

Inlägg av BoF »

Kod: Markera allt

;-------------------------------------------------- 
INT_VECTOR   CODE   0x004      ; interrupt vector location 
	goto   isr_routine

isr_routine:        
   movwf   w_temp      ; save off current W register contents 
... en hel del mer bla bla 
;-------------------------------------------------- 
Prova detta.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Lägg för fasen *INTE* in kodexempel som *BILDER* !!!
Hur har du tänkt att man ska kunna använda koden ???

Läg in koden som det ska vara så ska jag kolla...
Användarvisningsbild
Radioman
Inlägg: 178
Blev medlem: 2 november 2006, 16:15:04
Ort: Stora Höga (4 mil norr GBG)
Kontakt:

Inlägg av Radioman »

BoF skrev:Lägg in koden nedanför under include direktivet.

Kod: Markera allt

RESERT_VECTOR CODE 0x00                  ; Resert vector
	        goto Start	          ; Jump to Main address
Plus som Icecap säjer .LKR fil skall läggas till projektet.
Svaret från MPLAB blir:
Error[152] C:\TEMP\UDATA_TEST.ASM 15 : Executable code and data must be defined in an appropriate section
Upprepas ca 20 rader.

Sedan skall det väl vara reset och inte resert ?

*.LKR fil är såklart på plats.
Användarvisningsbild
Radioman
Inlägg: 178
Blev medlem: 2 november 2006, 16:15:04
Ort: Stora Höga (4 mil norr GBG)
Kontakt:

Inlägg av Radioman »

sodjan skrev:Lägg för fasen *INTE* in kodexempel som *BILDER* !!!
Hur har du tänkt att man ska kunna använda koden ???

Läg in koden som det ska vara så ska jag kolla...
Brukar bli så ostrukturerat med kommentarer inpå programkoden men jag gör ett försök :)
**************
;Literal to RAM conversiontest
;Udata test
#include <p16f88.inc>

udata 0x20
Out0 res 1 ;LSB
Out1 res 1 ; :
Out2 res 1 ; :
Out3 res 1 ; :

Unpack32 MACRO Var, Adress ; Var = 32 bit literal to be unpacked
Banksel Adress ;Adress Specifies the LSB start
movlw Adress ;use FSR and INDF for indirect
movwf FSR ;access to desired adress

movlw Var & H'FF' ;Mask to get LSB
movwf INDF ;Put in first location
movlw Var >>D'08' & H'FF' ;Mask to get next byte of literal
incf FSR,F ;Point to next byte
movwf INDF ;Write data to next byte
movlw Var >>D'16' & H'FF' ;Mask to get next byte of literal
incf FSR,F ;Point to next byte
movwf INDF ;Write data to next byte
movlw Var >>D'24' & H'FF' ;Mask to get last byte of literal
incf FSR,F ;Point to last byte
movwf INDF ;Write data to last byte
endm ;End of the Macro Definition
code 0

Start ;Testcode for Unpack32 MACRO
Unpack32 0x12345678, Out0 ;Put Unpack Macro here
goto $ ;Do nothing (loop forever)
END
Edit: Denna kod är för 16F88 processorn (med tillhörande *.lkr fil). Bildexemplet först i inlägget provade jag med 16F877a
BoF
EF Sponsor
Inlägg: 222
Blev medlem: 7 oktober 2006, 16:43:37

Inlägg av BoF »

Kod: Markera allt


;Literal to RAM conversiontest 
;Udata test 
	list p=16f877A
	#include <p16f877A.inc>

	__CONFIG   _CP_OFF & _LVP_OFF & _BODEN_OFF &  _WDT_OFF & _PWRTE_ON & _HS_OSC & _CPD_OFF


	errorlevel -302

;-------------------------------------------------------------------------------------------------------
;									; Program memory structure



RESERT_VECTOR CODE 0x00                  ; Resert vector 
           goto Start             ; Jump to Main address 

	udata 0x20 
Out0 res 1 ;LSB 
Out1 res 1 ; : 
Out2 res 1 ; : 
Out3 res 1 ; : 

Unpack32 MACRO Var, Adress ; Var = 32 bit literal to be unpacked 
	Banksel Adress ;Adress Specifies the LSB start 
	movlw Adress ;use FSR and INDF for indirect 
	movwf FSR ;access to desired adress 

	movlw Var & H'FF' ;Mask to get LSB 
	movwf INDF ;Put in first location 
	movlw Var >>D'08' & H'FF' ;Mask to get next byte of literal 
	incf FSR,F ;Point to next byte 
	movwf INDF ;Write data to next byte 
	movlw Var >>D'16' & H'FF' ;Mask to get next byte of literal 
	incf FSR,F ;Point to next byte 
	movwf INDF ;Write data to next byte 
	movlw Var >>D'24' & H'FF' ;Mask to get last byte of literal 
	incf FSR,F ;Point to last byte 
	movwf INDF ;Write data to last byte 
	endm ;End of the Macro Definition 

	code  

Start ;Testcode for Unpack32 MACRO 
	Unpack32 0x12345678, Out0 ;Put Unpack Macro here 
	goto $ ;Do nothing (loop forever) 
	END
Obs! Jag ändrade PIC för jag hittade ingen p16f88.lkr fil för en p16f88,
fungerar fint.


Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Program\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F877A "test.asm" /l"test.lst" /e"test.err" /o"test.o"
Executing: "C:\Program\Microchip\MPASM Suite\MPLink.exe" "C:\Program\Microchip\MPASM Suite\LKR\16f877a.lkr" "E:\Tmp\test.o" /o"test.cof" /M"test.map"
MPLINK 4.06, Linker
Copyright (c) 2006 Microchip Technology Inc.
Errors : 0

MP2COD 4.06, COFF to COD File Converter
Copyright (c) 2006 Microchip Technology Inc.
Errors : 0

MP2HEX 4.06, COFF to HEX File Converter
Copyright (c) 2006 Microchip Technology Inc.
Errors : 0

Loaded E:\Tmp\test.cof.
BUILD SUCCEEDED: Sun Feb 04 19:31:34 2007
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, nu finns det en kod som "bygger rent".
Bara en liten kommentar...

Finessen (en av dom) med reloc mode är att det blir lättare att flytta
kod mellan olika processor modeller. T.ex så tar MPLINK adresserna till RAM
på respektive modell från LKR filen. D.v.s att man inte (om man inte måste)
ska ange en adress till udata direktivet. Om den koden sedan flyttas till
en annan processor som inte har RAM på h'20' så spricker det hela...

Sen är den "snyggare" om man har sina macrodefinitioner innan någon
exekverbar kod (d.v.s före första CODE direktivet). Det blir lite enklare
att se vad som är macrodefinitioner respektive "riktig" kod... :-)

Jag brukar även lägga data allokeringerna (udata_xxx) före code segmenten.
Men det kanske är mer en smaksak...

> movlw Var & H'FF' ;Mask to get LSB

"movlw low Var" är lite renare och snyggare.
Se sid 43 i MPASM manualen.
Användarvisningsbild
Radioman
Inlägg: 178
Blev medlem: 2 november 2006, 16:15:04
Ort: Stora Höga (4 mil norr GBG)
Kontakt:

Inlägg av Radioman »

Tack så mycket för hjälpen :)

RESERT_VECTOR CODE 0x00 ; Resert vector
goto Start ; Jump to Main address

Gjorde tydligen hela grejen.

Det är lite jobbigt att lära sig när maualernas exempel inte fungerar. Är detta vanligt med Microchips dokument ?
Först trodde jag att uttrycket resert_vector var felstavat av BoF.Jag sökte igenom hela manualen efter uttrycket "RESERT_VECTOR" utan resultat så jag vet fortfarande inte hur detta fungerar. Bara att det fungerar och det är inte alltid tillräckligt. Var kan man läsa om resert_vector ?

Det är lätt att famla iväg efter lösningar på andra forum. En tråd på Microchips forum behandlar samma problem men där är grabbarna inne och rör i Linker scriptfilen. Skall det behövas i tid och otid?
http://forum.microchip.com/tm.aspx?m=97134
Användarvisningsbild
Radioman
Inlägg: 178
Blev medlem: 2 november 2006, 16:15:04
Ort: Stora Höga (4 mil norr GBG)
Kontakt:

Inlägg av Radioman »

Spännande detta.

Vad jag kan förstå så finns det ingenting som heter resert_vector. Det kan dock vara reset_vector.

Det sjuka är att det inte spelar någon roll för MPLAB vad du skriver :shock: . Bägge fungerar utan larm. Kan någon förklara varför ?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Därför att det inte spelar någon roll vad du skriver där.
Kalla den vad du vill. Se ävern MAP filen...
Användarvisningsbild
Radioman
Inlägg: 178
Blev medlem: 2 november 2006, 16:15:04
Ort: Stora Höga (4 mil norr GBG)
Kontakt:

Inlägg av Radioman »

OK, jag tror jag förstår. Först nu fick jag en riktig *.map fil också.
BoF
EF Sponsor
Inlägg: 222
Blev medlem: 7 oktober 2006, 16:43:37

Inlägg av BoF »

Ber om ursäkt att RESERT_VECTOR skapade lite förvirring och besvär!
Det är enbart en ”Label” så kan det stå vad som helst som är giltigt för en label.
Användarvisningsbild
Icecap
Inlägg: 26660
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Jag vill passa på att tacka sodjan, jag skickade ett projekt till honom för att kolla om han orkade göra det relokerbart åt mig helt enkelt för att ha ett utgångspunkt.

Han gjorde det och gjorde mig uppmärksam på ett punkt som jag i eftertankens sjuka blekhet helt enkelt hade missad:
Interruptvektorn är skyddad. Den kan alltså inte sträcka sig över mer än 1 adress, instruktionen måste alltså bli: GOTO xxx varefter det kommer en ny sektion kod osv.

Med detta i handen kan jag numera "leka" lite vid behov (skingra tankarna) och göra färdiga återvinningsbara filer av det viktigaste icke-projektspecifika.
Skriv svar