GCC + ASM Funktionen

OP Persönliche Seite #363683
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
Gast
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.
Gast
Geht in etwa so:
1
void my_aligned_function(uint8_t param) __attribute__((section
2
(".mysection")));
3
void my_aligned_function(uint8_t param) {
4
  // Code Hier
5

6
}

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
Gast
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
OP Persönliche Seite
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
Gast
"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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.