Hallo zusammen,
ich habe ein kleines Problem meinen Assembler-Code in ein C-Projekt zu
integrieren/kombinieren.
Mein erstes Problem ist es, Konstanten aus einem C-Header im
Assembler-File zu nutzen.
Viele Konstanten (speziell Speicheradressen, aber auch andere) sind in
dem Schema "0x10000000U" definiert. Dabei macht das "U" im
Assembler-file große Probleme, da es im Assemblercode nicht richtig
interpretiert (gerne auch ignoriert) wird und Fehler wirft.
Falls mir hier jemand Ideen geben kann, wie ich das bewerkstelligen kann
ohne die "U"s alle aus meinen Headern zu entfernen, fände ich das sehr
schön.
Kleines Beispiel:
-----------------
header.h
1
...
2
#define MYADDR 0x10000800
3
...
-----------------
asm.S
1
...
2
LDRR1,=MYADDR
3
...
-----------------
Vielen Dank
Leo
PS: Meine Umgebung:
Ich arbeite aktuell im CooCox CoIDE für einen STM32F4.
Ziel soll aber idealerweise Compiler-/Enwicklungsumgebungs-unabhängig
und für alle möglichen STM32F[0-4] brauchbaren code zu erzeugen.
Vielen dank für die Antwort.
Wie wichtig ist denn eigentlich diese Typendefinition bei Defines?
Ich habe mir angewöhnt sie zu machen, aber können Berechnungsfehler
auftreten, wenn man sie nicht macht?
Ich finde gerade dazu nicht sehr viel.
Vielen Dank nochmal,
Leo
Leo B. schrieb:> Viele Konstanten (speziell Speicheradressen, aber auch andere) sind in> dem Schema "0x10000000U" definiert.
Folgendes wird vom GNU-Assembler akzeptiert, auch wenn die Verwendung
der Suffixe L, U, UL usw. für Integer-Konstanten nicht dokumentiert zu
sein scheint:
1
#define MYADDR 0x10000800U
2
3
LDR R1, =MYADDR
> Ziel soll aber idealerweise Compiler-/Enwicklungsumgebungs-unabhängig> und für alle möglichen STM32F[0-4] brauchbaren code zu erzeugen.
Beim C-Compiler ist das kein so großes Problem, weil die C-Syntax
genormt ist. Beim Assembler kocht aber i.Allg. jeder Hersteller sein
eigenes Süppchen.
Yalu X. schrieb:> Folgendes wird vom GNU-Assembler akzeptiert, auch wenn die Verwendung> der Suffixe L, U, UL usw. für Integer-Konstanten nicht dokumentiert zu> sein scheint:>> --------------------------> #define MYADDR 0x10000800U>> LDR R1, =MYADDR> --------------------------
Leider widerspricht da mein Compiler:
1
Error: garbage following instruction -- `ldr R1,=0x10000800U'
Wenn Du die Typen richtig definierst, können keine Fehler entstehen.
Außer den selbstgemachten Fehler (z.B. Überläufe).
Was aber passieren kann, wenn Du defaults verwendest, ist, es wird die
falsche Voreinstellung verwendet. Z.B. default unsigned und verwendet
signed ("Wenn ich den Erwische, der mir ein Bit Datenbreite geklaut
hat..."). Oder so Späßchen wie 2 + 224 = -30.
Leo B. schrieb:> Leider widerspricht da mein Compiler:> Error: garbage following instruction -- `ldr R1,=0x10000800U'
Hmm, meiner bringt diese Fehlermeldung nur dann, wenn ich einen auch in
C ungültigen Suffix, bspw. "K", an die Zahl anhänge:
1
Error: garbage following instruction -- `ldr R1,=0x10000800K'
Eine gebräuchliche Methode ist, sich einfach in C eine Dummyfunktion mit
allen Variablen, Argumenten und Returnwerten zu schreiben und die nach
Assembler übersetzen zu lassen. Da kann man dann einfach den gewünschten
Assemblercode einfügen.
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