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
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.
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
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
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
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
"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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.