Forum: Mikrocontroller und Digitale Elektronik [PIC] goto mit per #define deklarierter, berechneter Adresse fehlerhaft


von Stefan (Gast)


Lesenswert?

Hallo zusammen,

ich könnte nochmal Hilfe gebrauchen...

Ich schreibe einen Bootloader und möchte am Ende des Bootloaders zur 
Firmware springen.

Die Adresse der Firmware wird berechnet (und lautet 0x77FC bzw. 30716). 
Schreibe ich die Adresse von Hand in den Code, dann funktioniert alles. 
Verwende ich die berechnete Adresse, gibt es ein Problem.

c-file:
1
    #define AppVector ((32768 - (2000 / 64 + 1) * 64)-4)
2
    unsigned int appVec = AppVector; // ok, lädt den Wert 30716 in appVec
3
#asm
4
    goto AppVector ; falsch, führt zu goto 2095100
5
    goto 0x77FC    ; ok, führt zu goto 30716
6
#endasm
lst-file:
1
   874                           ;main.c: 39: unsigned int appVec = ((32768 - (2000 / 64 + 1) * 64)-4);
2
   875  0079AC  0E77                 movlw  119
3
   876  0079AE  6E15                 movwf  main@appVec+1,c
4
   877  0079B0  0EFC                 movlw  252
5
   878  0079B2  6E14                 movwf  main@appVec,c
6
   879  0079B4  EFFE FFFB            goto  2095100  ;# 
7
   880  0079B8  EFFE F03B            goto  30716  ;#

Wie man sieht, wird die Testvariable appVec aus AppVector korrekt 
befüllt (119=0x77 252=0xFC)
Im goto Befehl wird aber aus AppVector 2095100 und nicht wie erwartet 
30716.

Falls relevant:
MPLABX mit XC8, PIC18F25K22


Viele Grüße
Stefan

von H.Joachim S. (crazyhorse)


Lesenswert?

Stefan schrieb:
> ((32768 - (2000 / 64 + 1) * 64)-4)

Hast dich wohl mit der Klammersetzung vertan. Wenn man so ausrechnet wie 
es da steht kommen 2095100 raus.

von Stefan (Gast)


Lesenswert?

Also die Klammern sind richtig, das bestätigt auch Matlab.
((32768 - (2000 / 64 + 1) * 64)-4)  müsste 30716 ergeben
((32768 - (2000 / 64 + 1))* 64)-4   ergäbe 2095100, aber das habe ich 
nicht geschrieben

Außerdem wird die integer Variable mit dem gleichen Ausdruck richtig 
bedatet, und das goto nicht.

Es muss irgendwas got  assembler  compiler spezifisches sein.

von Dr. Sommer (Gast)


Lesenswert?

Stefan schrieb:
> goto AppVector

Das springt vermutlich an die Adresse der Variablen selbst. Verrückt, 
dass der Compiler so was erlaubt. Versuch mal "goto *AppVector;". 
Ansonsten Inline Assembler.

von Stefan (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Stefan schrieb:
>> goto AppVector
>
> Das springt vermutlich an die Adresse der Variablen selbst. Verrückt,
> dass der Compiler so was erlaubt. Versuch mal "goto *AppVector;".
> Ansonsten Inline Assembler.

nein, AppVector ist eine per #define erzeugte Konstante und keine 
Variable. Daher auch keine Adresse. 2095100 kommt raus, wenn man keine 
Punkt-Vor-Strich-Rechnung beachtet.
Ich habe jetzt ein paar zusätzliche Klammern gesetzt und es 
funktioniert.

Schön ist das aber nicht, dass der Compiler bei der Auswertung ein und 
desselben Ausdrucks an zwei verschiedenen Stellen etwas 
unterschiedliches macht.

Danke euch!

Viele Grüße
Stefan

von Dr. Sommer (Gast)



Lesenswert?

Stefan schrieb:
> nein, AppVector ist eine per #define erzeugte Konstante und keine
> Variable.

Oh, falsch geguckt.

Stefan schrieb:
> ((32768 - (2000 / 64 + 1) * 64)-4)  müsste 30716 ergeben

Also jetzt bin ich komplett  verwirrt ? ist das Problem vielleicht dass 
32768 außerhalb des Bereichs von 16bit "int" ist?

von Dr. Sommer (Gast)


Lesenswert?

Ach, rundende Integer-Logik natürlich...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.