www.mikrocontroller.net

Forum: Compiler & IDEs ARM7: Kann keine Konstante in Register schreiben?


Autor: Kaspar Schleiser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Beim lpc2387 konnte ich mit folgendem Code den VIC anspringen:
...
    mov    r0, #0xffffff00    /* lpc23xx */

/*    mov    r0, #0xfffffF030     /* lpc214x */

    ldr    r0, [r0]
    add    lr,pc,#4
    mov     pc, r0
...

Beim lpc2148 ist die VIC-Adresse nicht 0xffffff00, sondern 0xffffff030. 
Diese Konstante mag aber der Assembler nicht:

[...]
common.s: Assembler messages:
common.s:140: Error: invalid constant (fffff030) after fixup
[...]

Hat jemand eine Idee? Sollte ich nicht jeden Wert in das Register 
schreiben können?

Ich benutze gcc version 4.3.1 mit GNU assembler version 2.18.

Danke im Vorraus,
Kaspar

Autor: Skua (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zähl mal die Stellen deiner Konstanten.
Naaa.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei ALU Befehlen ist nur eine rotierte 8bit Konstante möglich. 
0xfffff030 past nicht in dieses Schema.

Bei LDR allerdings sind +/-12bit Offset möglich, und daher lässt sich 
diese Adresse innerhalb der ersten zig Bytes vom Flash per LDR direkt 
PC-relativ adressieren:
    ldr r0,[pc,#-...]
Oder eben so von überall her:
    mov r0,#0
    ldr r0,[r0,#0xfffff030]

Autor: Skua (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ A.K.
Deine Lösung hat aber weniger Fs als der OP.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ändert aber nichts am Problem. Auch mit einem F weniger passt die 
Konstante nicht ins ALU-I Schema. Das überschüssige F hat der Assembler 
sowieso ignoriert (siehe Fehlermeldung oben).

Autor: Skua (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt hab ichs kapiert.

Autor: Kaspar Schleiser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnellen Antworten!

Die Fehlermeldung kam natürlich auch mit der richtigen Anzahl F's.

Ich hab das Problem jetz mit rumrechnen gelöst, allerdings würde ich 
natürlich gerne die Instruktion in der Interruptroutine sparen...

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kaspar Schleiser wrote:
> Ich hab das Problem jetz mit rumrechnen gelöst, allerdings würde ich
> natürlich gerne die Instruktion in der Interruptroutine sparen...

Am einfachsten ist es, die Pseudo Instruktion "LDR rn, =<const>" zu 
verwenden. Dann nimmt Dir der Assembler das Rechnen ab.
.equ VicVectAddr, 0xFFFFF030

ldr r0, =VicVectAddr
add lr,pc,#4
mov pc, r0

Gruß
Marcus

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marcus Harnisch wrote:
>
> .equ VicVectAddr, 0xFFFFF030
> 
> ldr r0, =VicVectAddr
> add lr,pc,#4
> mov pc, r0
> 

Da fehlte natürlich noch ein "ldr r0, [r0]", aber das war ja nicht die 
eigentliche Frage...

Gruß
Marcus

Autor: Kaspar Schleiser (kaspar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marcus Harnisch wrote:
> Am einfachsten ist es, die Pseudo Instruktion "LDR rn, =<const>" zu
> verwenden. Dann nimmt Dir der Assembler das Rechnen ab.
>
>
> .equ VicVectAddr, 0xFFFFF030
> 
> ldr r0, =VicVectAddr
> 
Daraus macht der Assembler:
ac:   e59f0048        ldr     r0, [pc, #72]   ; fc <switch_context_int+0xc> 

Sonst habe ich ein MVN und ein SUB. ldr sieht schöner aus, braucht aber 
3 Takte, mvn und sub jeweils nur einen, oder nicht?

Gruß
Kaspar

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum willst du eigentlich unbedingt die Adresse fertig ins Register 
laden, wenn man sie genausogut in den LDR Befehl mit reinschreiben kann? 
Also den LDR der den Vektor läd, nicht den mit dem "=" Operanden.

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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