mikrocontroller.net

Forum: Compiler & IDEs Assembler in C Projekt, Integrationsprobleme


Autor: Leo B. (luigi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
...
#define MYADDR 0x10000800
...
-----------------
asm.S
...
LDR  R1, =MYADDR
...

-----------------


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.

: Verschoben durch Moderator
Autor: Clemens L. (c_l)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benutze UINT32_C aus <stdint.h>, und definiere es entsprechend für den 
Assembler.

Autor: Leo B. (luigi)
Datum:

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

Autor: Yalu X. (yalu) (Moderator)
Datum:

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

#define MYADDR 0x10000800U

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.

Autor: Leo B. (luigi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
Error: garbage following instruction -- `ldr R1,=0x10000800U'

Autor: Amateur (Gast)
Datum:

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

Autor: Amateur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Error: garbage following instruction -- `ldr R1,=0x10000800U'
Versuch's mal ohne "U". Ich kenne aber den Compiler/Prozessor nicht.

Autor: Yalu X. (yalu) (Moderator)
Datum:

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

Error: garbage following instruction -- `ldr R1,=0x10000800K'

Vielleicht sind diese Integer-Suffixe ein neueres Feature von GAS. Ich
habe hier die Version 2.28.

Edit:

Hier wurde der U-Suffix eingeführt:

  https://sourceware.org/git/gitweb.cgi?p=binutils-g...

Die Änderung ist seit Version 2.27 vom August 2016 offziell. Seit
Version 2.28 vom März 2017 ist auch der L-Suffix erlaubt.

: Bearbeitet durch Moderator
Autor: Peter Dannegger (peda)
Datum:

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

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.