www.mikrocontroller.net

Forum: Compiler & IDEs GCC + ASM Funktionen


Autor: Andreas Auer (aauer1) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich verwende den GCC und schreibe damit hauptsächlich C Code. Jetzt ist
es aber so, dass ich eine ASM Funktion schreiben muss, die an einer
bestimmten Stelle im Flash liegt.

D.h. in meinem ASM File definier ich z.B. mit ".org 0x7000"  den
Beginn meines Codesegmentes im Flash und danach schreib ich meinen
Code. Soweit sollte es ja noch stimmen.
Das Problem was bei mir nun auftaucht, ist, dass der Linker die 0x7000
vom Ende des übersetzten C Codes anfügt. D.h. die definierte Stelle
liegt weiter hinten im Flash was absolut nicht gut ist.

Gibts da irgendeine Compiler/Linker Option, die es möglich macht, dass
wirklich 0x7000 als Speicherstelle definiert ist??

mfg
Andreas

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt's einen zwingenden Grund, weshalb das so schräg sein muss? Warum
muss das an 0x7000 liegen?

Wenn's der ASM-Teil nicht arg lang ist: direkt ins C rein.

Autor: Ernst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht in etwa so:
void my_aligned_function(uint8_t param) __attribute__((section
(".mysection")));
void my_aligned_function(uint8_t param) {
  // Code Hier

}

Bei reinen inline-asm funktionen evtl noch attribute naked setzen.

Dann dem Linker beim Compilieren sagen, wohin die Section "mysection"
soll:

LDFLAGS += -Wl,--section-start=.mysection=0x7000

/Ernst

Autor: Ernst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, die Frage bezog sich wohl auf ein externes ASM File, das
dazugelinkt wird...

In dem Fall, im ASM File mit

 .section        .mysection,

ebenfalls den Codebereich angeben, und wie oben linken.

(Genaue syntax der .section Anweisung selbst nachschauen, hab ich jetzt
nicht im Kopf)


/Ernst

Autor: Andreas Auer (aauer1) Benutzerseite
Datum:

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

Kurz zur Erklärung warum das so sein muss... Ich schreib Code in C für
eine Firma (USB Host Ansteuerung). Die Firma will nun noch ihren
eigenen Code hinzufügen. Die können aber kein C und wollen das in ASM
machen.
Erschwerend kommt noch hinzu, dass die ihren ASM Code in 8031 ASM
schreiben und dann mit einem Cross Compiler in den Befehlssatz des AVR
gehen.

Möglichkeiten wie direkter Aufruf meiner C Funktionen geht also nicht.
Auch wird deren ASM File nicht zu meinem gelinkt, weil deren Compiler
kein .o-File erstellen kann (also absoluter schrott).
Deshalb soll mein C Code am Beginn des Flash stehen (maximal bis
0x7000). Bei 0x7000 gibts dann eine Tabelle, wo Sprünge auf meine
Funktionen definiert sind. Ab 0x8000 beginnt dann deren Hex-File. Mit
Sprünge auf "0x7000 + offset" kann er dann auf meine Funktionen
zugreifen.

Ich weiß... absolut kompliziert. Aber leider geht die Firma nicht von
ihrem Cross Assembler weg.

Noch eine Frage... zwischen meinem C Code und der Sprungtabelle auf
0x7000 liegt ja massig ungenutzter Speicher. Ist es möglich beim
erstellen des HEX Files zu sagen, dass er dort nicht 0x00 hinschreiben
soll, sondern 0xFF. Dann ginge das Flashen mit Ponyprog schneller!

mfg
Andreas

Autor: Andreas Auer (aauer1) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok... die letzte Frage hat sich von selbst gelöst. Der Bereich
dazwischen wird mit 0xFF aufgefüllt. Danke für die Hilfe.

mfg
Andreas

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Erschwerend kommt noch hinzu, dass die ihren ASM Code in 8031 ASM
schreiben und dann mit einem Cross Compiler in den Befehlssatz des AVR
gehen."

Bizarrer lässt sich sowas kaum ausdenken.

Autor: Andreas Auer (aauer1) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jop... das ist absoluter Blödsinn. Aber die sind total Stolz auf diesen
Cross Assembler.

Ich kann nur sagen: "Jedem das seine"

mfg
Andreas

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.