mikrocontroller.net

Forum: Compiler & IDEs GNUARM Programbereich reservieren ?


Autor: roty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte beim GCC-ARM einen Teil des Programmbereiches für per
Programm erzeugt Tabellen reservieren, die dann mit IAP Prozeduren
später platziert werden. Der Bereich ist also zunächst leer, bis auf
eine Dummy-Konstante. Das Programm soll dadurch auch nicht aufgebläht
werden.

Mein bisher benutzer C-Compiler wurde das so erledigt:
#pragma text:iap_area
   const u_char iapstart_dummy[] =        {0};
#pragma text:text
Beim Linken wurde dann die Startaddresse und die Länge von iap_area
festgelegt.

Wie bitte macht man das beim GNUARM Compiler ?

Danke

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Linker-Script die Section definieren. Die Daten kann man dann mit
__attribute__((section (".sectionname"))) verziert dort plazieren.

Autor: roty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@A.K.

Könntest du bitte etwas weiter ausholen ?

Danke

Autor: roty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weiss nicht ob ich's verstanden habe.

Habe im Linker cmd file folgendes gemacht:

....

MEMORY
{
  flash       : ORIGIN = 0,          LENGTH = 128K  /* FLASH ROM
       */
   iapflash    : ORIGIN = 0x00020000, LENGTH = 384K  /* IAP FLASH ROM
        */
  ram         : ORIGIN = 0x40000000, LENGTH = 32768 /* free RAM area
      */              */
  ram_usb_dma : ORIGIN = 0x7FD00000, LENGTH = 8192  /* on-chip USB DMA
RAM area */
}

....

  .iap :
  {
      *(.iap)
  } >iapflash

und dann :

const u_char Loggerarea[] __attribute__((section (".iap"))) =  {0};


Ergebnis ist aber, dass sich die Filegröße fast verdoppelt. Das wollte
ich
eigentlich nicht haben .

Mach ich was falsch ?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn in der IAP-Section von Compiler/Linker keine Daten liegen sollen,
dann darf sie entsprechend definiert werden. In Analogie zu .bss also:

  .iap (NOLOAD) :
  {
      *(.iap)
  } >iapflash

Statt über attributierte Variablen lässt sich eine komplette Sektion
auch über vom Linker definierte Symbole ansprechen. Beispielsweise
mit:

  .iap (NOLOAD) :
  {
      _iap_start_ = . ;
      *(.iap)
  } >iapflash

und im Programm:

  extern char __iap_start__[];

Autor: roty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@A.K

Danke vielmals, es scheint zu funktionieren.

Ich beneide dich um dein Wissen rundum GCC! Wenn ich genau gewußt
hätte
was
mich beim Umstieg auf GCC alles erwartet, hätte ich vermutlich nicht
angefangen.
Zumal es sicher nicht lange dauern wird bis ich an die nächste Hürde
stoße.

Danke jedenfall nochmals.

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.