Forum: Compiler & IDEs Funktionen in speziellen Speicherbereich pressen.


von DerAlbi (Gast)


Lesenswert?

Hallo.
Ich arbeite mit dem AVR32.

Im AVR32 müssen alle Interruproutinen innerhalb von 8KB liegen, da sie 
sonst nur durch umwege erreicht werden können.

Wie schaffe ich es dem GCC zu sagen, dass er die InterruptRoutinen alle 
in einen gemeinsamen Speicherbereich legt, z.B. ab FlashAdresse 
0x8001E000.

Zur Zeit mache ich es so:

Linker: -Wl,--section-start=.InterruptSection=0x8001E000

Code: __attribute__((_interrupt_)) __attribute__((section 
(".InterruptSection"))) void unhandled_interrupt(void)

Aber nicht alle Funktionen werden dann tatsächlich hinter diese Adresse 
verschoben.. warum geht das nur mit einigen, und andere bleiben, wo sie 
auch sonst stehen..?

Ich wäre für Hilfe sehr dankbar :-)

MFG

von DerAlbi (Gast)


Lesenswert?

also ich fände es schon erstmal toll zu wissen, obs denn überhaupt für 
alle Funktionen funktionieren müsse, die ich mit __attribute__((section
(".InterruptSection"))) versehe.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Hab keine Ahnung von AVR32 :-)

Um die Verwirrung mit Sectionnamen zu verhindern nenne ich 
Input-Sections anders als Output-Sections.

Die In-Sections (*.blah) sammle ich dann über ein Skript ein zu einer 
Out-Section (.myfoo):
1
SECTIONS
2
{
3
  .myfoo          : { *(.blah) }
4
}

Die Out-Section wird dann ab ne bestimme Adresse gelegt per ld- oder 
objcopy-Option.

von DerAlbi (Gast)


Lesenswert?

Sry für alleinunterhaltung:
Neuigkeiten: Mein Projekt ha ja mehrere .cpp ;-)
Implementiere ich eine Funktion in einer anderen .cpp, (dort wo auch 
andere InterruptFunktionen ihre Adresse erfolgreich wechseln) 
funktioniet das _atribute_ auch.

Sehr komisch. Es scheint also cpp-abhängig zu sein - warum?

MFG

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Lass einfach mal ein map-File erzeugen und schau was der Linker zu den 
Funktionen meint. Vielleicht ist's nur Zufall daß sie richtig zu liegen 
kommen.

von Der A. (der-albi)


Lesenswert?

@Johann L: Es tut mir wirklich leid, ich weiß weder, was Input oder 
output-sections sind, noch wo ich dein beispiel überhaupt einfügen 
müsste.
ich habe keinen Zugriff aufs makefile.
Ich nutze AVR32 Studio.

MakeFile hängst dran.

InterruptSection taucht 2x auf. einmal komisch, einmal richtig.
warum????

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Du machst aus dem Schnippsel eine Datei und linkst die dazu, wenn die 
Objekte zum elf zusammengelinkt werden. M.a.W. du musst einfach ne 
Linker-Option angeben (diesen Dateinamen). Was der Linker nicht kennt 
interpretiert er als Linkerskript.

> ich habe keinen Zugriff aufs makefile

Natürlich du kannst

1) Per Studio ld/gcc/as/objcopy-Flags/Optionen setzen
2) das Makefile selber schreiben

Falls nix davon geht klopp AVR32-Studio in die Tonne. Ich kenn Studio 
nicht, ist mir zu schwergewichtig.

von Der A. (der-albi)


Lesenswert?

Naja. Mir is das auch grade alles nix. ich habe jetzt für jede 
.cpp-Datei eine eigene Sectio aufgemacht. Das scheint zu gehen. eine 
Section scheint nur für eine .cpp gültig zu sein. warum weiß der teufel.
kA, was ich falsch mache.
Das mit dem Linkerskript.. da hab ich ehrlich gar keine Ahnung davon. 
:-(

von DerAlbi (Gast)


Lesenswert?

Los sagt mal was: wie gehtn das einheitlich für alle .cpp Dateien ;-)

MFG

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Der Albi wrote:

> Das mit dem Linkerskript.. da hab ich ehrlich gar keine Ahnung davon.

Steht doch oben wie's geht. Die 4 Zeilen anzupassen (anzupassen ist nur 
eine davon), in 'ne Datei zu schreiben und die dazulinken wirste schon 
schaffen.

von DerAlbi (Gast)


Lesenswert?

Tut mir echt leid. Ich sehe einfach nicht, wie das funktioniert. Du gibt 
weder eine Adresse an, noch sonstwas.
Ebenfalls verstehe ich den Sinn einer In- bzw Out-Section nicht.

Das Dazulinken ist tatsächlich nicht das Problem. Nur verstehen müsste 
ich es, was ich da dazulinke(n muss).

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Die Lösung hängt auch davon ab, die das Speicher-Layout im Linkerscript 
(ld) beschrieben ist.

Die Funktionen um die es geht müssen wohl nahe an der Vector-Tabelle 
liegen?
Schau doch mal in eines der ld-Files bei den avr32-binutils, da siehst 
du wie .text zusammengebaut wird.

Die vectab ist wahrscheinlich ein Teil von .text, dann kommst du mit 
einer eigenen Section nicht weiter. Im ld findest du bestimmt ne 
vorgefertigte (Input)section für genau den Zweck.

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.