GCC ARM : Wie Lookup-Table an bestimmte Adresse linken?

Gast #5621023
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.
#5621060
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")));
Gast #5621078
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.
#5621112
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.
Gast #5621115
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, ......

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren