mikrocontroller.net

Forum: Compiler & IDEs Funktionen in speziellen Speicherbereich pressen.


Autor: DerAlbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: DerAlbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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):
SECTIONS
{
  .myfoo          : { *(.blah) }
}

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

Autor: DerAlbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Der Albi (der-albi)
Datum:

Bewertung
0 lesenswert
nicht 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????

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Der Albi (der-albi)
Datum:

Bewertung
0 lesenswert
nicht 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. 
:-(

Autor: DerAlbi (Gast)
Datum:

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

MFG

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: DerAlbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

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.