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

Gast #5621023
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.