Forum: Compiler & IDEs GNUARM Programbereich reservieren ?


von roty (Gast)


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

von A.K. (Gast)


Lesenswert?

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

von roty (Gast)


Lesenswert?

@A.K.

Könntest du bitte etwas weiter ausholen ?

Danke

von roty (Gast)


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 ?

von A.K. (Gast)


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__[];

von roty (Gast)


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.

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.