Forum: Compiler & IDEs GCC + ASM Funktionen


von Andreas A. (aauer1) Benutzerseite


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

von A.K. (Gast)


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.

von Ernst (Gast)


Lesenswert?

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

von Ernst (Gast)


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

von Andreas A. (aauer1) Benutzerseite


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

von Andreas A. (aauer1) Benutzerseite


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

von A.K. (Gast)


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.

von Andreas A. (aauer1) Benutzerseite


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.