mikrocontroller.net

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


Autor: Stefan (Gast)
Datum:

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

Autor: H.Joachim S. (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dr. Sommer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, rundende Integer-Logik natürlich...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.