Forum: Compiler & IDEs GCC ARM : Wie Lookup-Table an bestimmte Adresse linken?


von lookup (Gast)


Lesenswert?

Hallo,

bräuchte bitte mal etwas Hilfe zu GCC für ARM.

Ich benutze GCC für ARM und möchte die IAP Funktion nutzen. Dazu
muss ich den Flashbereich so aufteilen, dass der Code der zu IAP gehört
in solche Flashsektoren gelinkt wird, die nicht gelöscht werden.

Das habe ich für Funktionen hinbekommen und es klappt.

Jetzt benötige ich aber ein Lookup-Table auch in diesen Bereich der
nicht gelöscht wird.Da setzt es jetzt aber leider bei mir aus.
Entweder
die Tabelle wird ins RAM gelegt, oder in einen Codebereich
der wieder
gelöscht wird.

Kann mir bitte mal jemand sagen was ich tun muss, damit die
Tabelle in einem bestimmten Adressbereich zum liegen kommt?

Danke sehr.

von M.K. B. (mkbit)


Lesenswert?

Ich hatte ein ähnliches Problem, bei dem bestimmte Puffer zum Austausch 
mit der Hardware in einem bestimmten RAM liegen mussten. Im Prinzip 
müsstest du damit auch in der Lage sein, das ganze in einen Flash zu 
legen.

Im Script, dass du dem Linke mitgibst (.ld) musst werden der Speicher 
und die Sections angelegt. Folgender Code ist nur ein Auszug und zeigt 
die Section "Communication_Buffers", die im DSRAM_2 liegen muss.
1
MEMORY
2
{
3
  DSRAM_2_comm(!RX) : ORIGIN = 0x20000000, LENGTH = 0x6000
4
}
5
6
7
SECTIONS
8
{
9
  /* Place communication buffers in correct ram section */ 
10
  Communication_Buffers : 
11
  {
12
  } > DSRAM_2_comm
13
}

Im Code kannst du dann festlegen, dass bestimmte Daten in dieser Section 
liegen.
1
static uint8_t m_aMemory[DMA_MEMORY_SIZE] __attribute__ ((section ("Communication_Buffers")));

von lookup (Gast)


Lesenswert?

Danke mal für die Hilfe.

Das habe ich aber ja schon für die Funktionen so gemacht und da klappt
es auch. D.h. ich habe mehrere Flash Sektoren (bestimmer Adressbereich)
in denen IAP Funktionen stehen.

Mein Problem ist jetzt dass ich die Tabelle nicht in diesen Bereich
bekomme. Das mit dem
1
__attribute__ ....
 funktioniert bei
Funktionen, aber bei der Tabelle nicht. Irgend was mache ich da wohl
noch falsch.

von Carl D. (jcw2)


Lesenswert?

Kann es sein, daß die Tabelle einfach nicht const ist.
Meiner Erfahrung nach legt der Arm-GCC diese dann sofort .rodata und 
damit in den ROM-Bereich legt. Anders als bei AVR muß man sonst keine 
Tricks anwenden.
Also erst mal schauen, daß sie überhaupt im FLASH landen und dann in die 
richtige Section schieben.

BTW, mit Code müßte man weniger spekulieren.

von lookup (Gast)


Lesenswert?

Zur Info für ähnliche Fälle.

Denke ich habe es hinbekommen. Die Lösung war ein weitere Anweisung im
Linker script. (Zeile *(.iapsectio.LT)). Sie hier:
1
   .iapsection :
2
    {
3
      . = ALIGN(4);
4
      __iapsection_start__ = .;
5
    *(.iapsection.LT)
6
    *(.iapsection*)
7
      __iapsection_end__ = .;
8
    } > IAP

Dann klappt das mit dem attribute unter Verwendung von *(.iapsectio.LT)
bei Definition der Tabelle.
1
__attribute__((section(".iapsection.LT"))) const u_char sector_table[] =
2
      {   0,1,2,3,4,5,6,7, ......

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.