Länkningsproblem med relocatable kod

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
jfri
Inlägg: 180
Blev medlem: 1 februari 2010, 21:41:20

Länkningsproblem med relocatable kod

Inlägg av jfri »

Jag har försökt göra om en tidigare fungerande absolut kod till relocatable kod. Detta för att kunna dela upp ett program i flera filer. Nedanstånde kod genererar länkningsfelet
MPLINK 4.37, Linker
Copyright (c) 1998-2010 Microchip Technology Inc.
Error - section 'ramdata' can not fit the absolute section. Section 'ramdata' start=0x00000020, length=0x00000005
Errors : 1

vilket jag inte förstår då detta ram borde vara ledigt och bara en ram sektion finns

Kod: Markera allt

reglera.asm
 include <p16f676.inc>
 
   __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF  & _BODEN_OFF )
 
 extern	 HelloWorld  
 
 Reset   CODE   0x0
   pagesel  main
   goto     main
 ;:::::::  Initiering ::::::::::::::::  
MAIN 	CODE
main 
	BANKSEL	OSCCAL
	call 		3FFh 					;Get the cal value
	movwf 		OSCCAL 					;Calibrate	
	BANKSEL	PORTC
	clrf 		PORTC 					;Init PORTC
	BANKSEL	ANSEL
	movlw		b'11000111'				;Use AN0-AN2 and AN6,AN7 as analog input
	movwf		ANSEL
	MOVLW	             b'11011100'				;Set RC5,RC1,RC0  as output
	movwf 		TRISC 								
	BANKSEL	PORTC
	bsf	  	PORTC,5				             ;TX must intially be high
	BANKSEL	TRISA
	movlw		b'11111111'
	movwf		TRISA
	bsf		PORTC,0		
;:::::::: Huvudloop :::::::::::::::::
loop
	Call  		HelloWorld
	btfsc		PORTA,5							;Poll switch på RA5
	goto		$-1
	goto  		loop
 END
print.asm
 include <p16f676.inc>
 
BAUD		EQU	.39
BAUD1		EQU	.30
BAUDX		EQU	.29
BAUDY		EQU	.30
BAUDS		EQU	.32
extern		Text
 ramdata  	udata	0x20
XmtReg		res	1
Count		res	1
DlyCnt		res	1
offset		res	1
W_temp		res	1
    	
PRINT	 CODE   
HelloWorld
	clrf  		offset	
nextchar
	movlw HIGH Text
	movwf PCLATH
	movf  offset,0
	Call  Text
	Call  Printbyte
	incf  offset,1
	movf  offset,0
	sublw .13
	btfsc STATUS,Z
	goto  break
	goto  nextchar
break
	clrf  offset
	return
Printbyte
	movwf W_temp
	movwf XmtReg
Xmtr
	movlw 8
	movwf Count
	bcf	  PORTC,5
	Call  Delay1	
X_next
	bcf   STATUS,C
	rrf	  XmtReg,1
	btfsc STATUS,C
    	bsf   PORTC,5
	btfss STATUS,C
	bcf	  PORTC,5
    	Call  DelayX
    	Decfsz Count,1
    	goto  X_next
X_stop
	bsf	  PORTC,5
	Call  DelayS
	movf  W_temp,0
	return
DelayS
	movlw BAUDS
    	goto  SAVE
DelayY
	movlw BAUDY
	goto  SAVE
DelayX
	movlw BAUDX
	goto  SAVE
Delay1
	movlw BAUD1
	goto  SAVE
Delay
	movwf BAUD
SAVE
	movwf DlyCnt
redo_1
	decfsz DlyCnt,1
	goto   redo_1
	return
	
 global	HelloWorld
 
  END

text.asm
include <p16f676.inc>
txtdata  code 0x300
Text
	addwf	PCL,1
	retlw	'H'
	retlw	'e'
	retlw	'l'
	retlw	'l'
	retlw	'o'
	retlw	' '
	retlw	'W'
	retlw	'o'
	retlw	'r'
	retlw	'l'
	retlw	'd'
	retlw	'\r'
	retlw     '\n'
 global	Text
 END
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Länkningsproblem med relocatable kod

Inlägg av vfr »

Hur ser länkfilen (.lkr-filen) ut? Utan den så är det svårt att svara på någonting...
jfri
Inlägg: 180
Blev medlem: 1 februari 2010, 21:41:20

Re: Länkningsproblem med relocatable kod

Inlägg av jfri »

Någon .lkr fil fanns inte i projektkatalogen. Det fanns dock i microchip katalogen en 16f676_g.lkr. Denna lade jag till under projektets linkerscripts. Får ändå samma länkfel. Vid läsning av MPLAB hjälpfilerna såg jag inga hänvisningar till att man skulle skapa någon egen länk script.
Försökte med udata_shr och då länkades allt utan problem.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Länkningsproblem med relocatable kod

Inlägg av sodjan »

Nyare versioner av MPLAB lägger till LKR filen automatiskt om den
ser att man bygger relocatabel code. Man behöver alltså inte
lägga till LKR filen till projektet manuellt.

> Försökte med udata_shr och då länkades allt utan problem.

Exakt, just det är "felet".
Just denna PIC har inget "banked memory". Allt RAM är "shared memory".
Alltså *måste* du använda udata_shr. Om du tittar i LKR filen så finns
det enbart en "SHAREBANK". Normalt finns det även en eller flera "DATABANK"
som heter "gpr0", "gpr1" o.s.v. Inte på denna PIC dock. Det är det länkaren
försöker säga men den kanske inte lyckas helt med det... :-)

Dete syns även i memory-mappen i databladet, för övrigt.

Det är samma sak med alla (mindre) PIC16 som har *allt* RAM "shared",
12F675/629 t.ex. Det gör också att man inte behöver köra med BANKSEL
för sina variabler sm ligger i RAM, de är alltid åtkomliga...
Skriv svar