Sida 1 av 1

Relocatable mode, Linker error, Symbol is not word-aligned.

Postat: 17 november 2008, 21:43:08
av Zmod
Tjenare!
Har börjat skriva på ett litet proram som ska vara till en PIC18F1230, som ska använda en lcd och använda mig av ADC för att läsa av värdet på en pinne. Nåja har börjat koda men har stött på ett problem. När koden blir någorlunda lång får jag följande problem från linkern.

Kod: Markera allt

MPLINK 4.20, Linker
Copyright (c) 2008 Microchip Technology Inc.
Error - file './an.o', section 'DLY_C', Symbol '_DLY_C_001E' is not word-aligned.
It can not be used as the target of a call or goto instruction.
Errors    : 1
Linker scriptet jag har inkluderat heter 18f1230_g, kanske kan va bra att veta. Så här ser koden ut.

Kod: Markera allt

	list      p=18f1230             ; list directive to define processor
	#include <p18f1230.inc>         ; processor specific variable definitions


    #define     LCD_E       PORTA, 6
    #define     LCD_RS      PORTA, 7
    #define     LCD_PORT    PORTB	 ;Port b 4-7
	#define		LED			PORTB, 2 ;Whateva

RESET_VECTOR	CODE	0x0000

		goto	Main		;go to start of main code

HI_INT_VECTOR	CODE	0x0008

		bra	HighInt		;go to high priority interrupt routine


;******************************************************************************
;High priority interrupt routine
; The high priority interrupt code is placed here.

		CODE

HighInt:

;	*** high priority interrupt code goes here ***


		retfie	FAST


;******************************************************************************
;Start of main program
; The main program code is placed here.
MAIN	CODE

main

loop	
	goto loop
;	*** main code goes here ***



;***************Delay variabler 

DLY_V      UDATA_ACS
d1           RES 1
d2           RES 1
d3           RES 1
;
;***********Delay code
DLY_C       CODE
;
delay_5ms
        movlw 0xE7
     movwf d1
     movlw 0x04
     movwf d2
Delay_5ms_0
     decfsz d1, f
     goto $+2
     decfsz d2, f
     goto Delay_5ms_0
     goto $+1
     return

delay_100us
     movlw 0x21
     movwf d1
Delay_100us_0
     decfsz d1, f
     goto Delay_100us_0
     return


;******************************************************************************
;End of program


		END

Om jag t.ex tar bort delayrutinen för 5ms och bara har kvar den för 100us så går det bra. Så det verkar som att linkern får svårt att få plats med allt i minnet eller något :S.

Vad beror det här på och hur löser jag det?

Postat: 17 november 2008, 21:52:32
av kimmen
Nu håller jag inte på med PIC nåt men skulle det inte kunna vara att du reserverar 3 bytes precis före den?

Vad händer om du lägger till en fjärde "dummy"?

Postat: 17 november 2008, 21:54:38
av sodjan
> goto $+1

goto $ bör generellt undvikas helt. Använd labels.
goto $ + någonting måste alltid vara + någonting jämt (på PIC18)

Sen vet jag inte riktigt vad den där goto har för funktion...

Men det är något annat också...

EDIT: Shit... Jag körde med fel LKR... :roll:

Ändra bara $+1 till $+2 så bygger det "rent"...

EDIT2:

> men skulle det inte kunna vara att du reserverar 3 bytes precis före den?

Nej, RAM reserveras från GPR's och det har ingenting med programminnet att göra.

Postat: 17 november 2008, 23:18:46
av Zmod
Tackar sodjan! Fick tweaka lite i delayrutinerna så dom funka som dom ska sen funka det fint! Tack åter en gång!

Postat: 17 november 2008, 23:29:35
av sodjan
Jo, jag misstänkte att den där extra goto'n var en "avrundning" för att få
en "exakt" delay. Ingen bra lösning i alla fall för så pass långa tider som
5 ms. 100 us kan väl vara OK för en delay i programvaran...