GCC Section will nicht

Gast #5088024
So versuche ich es mit den Variablen:
int variable[1000] __attribute__((section(".m_data_2")));
int variable2[1000] __attribute__((section(".m_data_2")));

Linker Skript:
1
/* Specify the memory areas */
2
MEMORY
3
{
4
  m_interrupts          (RX)  : ORIGIN = 0x00000000, LENGTH = 0x00000400
5
  m_flash_config        (RX)  : ORIGIN = 0x00000400, LENGTH = 0x00000010
6
  m_text                (RX)  : ORIGIN = 0x00000410, LENGTH = 0x0003FBF0
7
  m_data                (RW)  : ORIGIN = 0x1FFFC000, LENGTH = 0x00004000
8
  m_data_2              (RW)  : ORIGIN = 0x20000000, LENGTH = 0x00004000
9
}
Gast #5088079
Michael H. schrieb:
> Linker Skript:

Das allein genügt nicht. Man braucht einen Eintrag im Bereich

SECTIONS
{
 .......
}

analog zum "normalen" RAM. Der Eintrag besagt wie der Linker
das RAM nutzen kann. Details wird sicherlich noch jemand posten
der sich bessser damit auskennt.

Inititalisierung beim Startup ist dann noch ein spezielleres Thema.
Gast #5088099
Rufus Τ. F. schrieb:
> Michael H. schrieb:
>> m_data                (RW)  : ORIGIN = 0x1FFFC000, LENGTH = 0x00004000
>> m_data_2              (RW)  : ORIGIN = 0x20000000, LENGTH = 0x00004000
>
> Da beide RAM-Bereiche aufeinanderfolgen - müssen die denn
> unterschiedlich sein?
>
> Das Leben dürftest Du Dir einfacher machen mit
>
>> m_data                (RW)  : ORIGIN = 0x1FFFC000, LENGTH = 0x00008000
>
> Oder was hab' ich nicht verstanden?

Seh ich genauso.
Wenn du uns noch über deine MCU aufklärst, kann mans dir sogar genau 
sagen.
Gast #5088104
Woran mache ich das fest?
>`m_data' overflowed by 4660 bytes

Wenn er eine Sektion in den Ram schreiben würde, dann wären das 4000 
bytes weniger.

Habe nun die Lösung gefunden: Man muss die Sektion im Linkerfile 
definieren, und zwar mir (siehe unten). Dann kann man über .SecRam 
darauf zugreifen.

    .SecRam  :
  {
  *(.myvars*);
  } > m_data_2

Danke an alle für den Support.
Gast #5088106
Das ganze ist der Freescale MKE14F.

Angeblich würde man einen HardFault bekommen wenn der DMA an der grenze 
Ankommen würde. Eine Lösung wäre eine Variable an die Grenze zu legen. 
Z.B. uint8_t blocker=1;
Aber wie sage ich Gcc dass er das an diese Adresse 0x20...0 legen muss?
Persönliche Seite #5088626
Rufus Τ. F. schrieb:
> Michael H. schrieb:
>> m_data                (RW)  : ORIGIN = 0x1FFFC000, LENGTH = 0x00004000
>> m_data_2              (RW)  : ORIGIN = 0x20000000, LENGTH = 0x00004000
>
> Da beide RAM-Bereiche aufeinanderfolgen - müssen die denn
> unterschiedlich sein?
>
> Das Leben dürftest Du Dir einfacher machen mit
>
>> m_data                (RW)  : ORIGIN = 0x1FFFC000, LENGTH = 0x00008000
>
>
> Oder was hab' ich nicht verstanden?

Kommt auf die Anwendung an. Einige Cortexe teilen das RAM bei 
0x20000000. Und je nach Anwendung kann das erhebliche Einflüsse auf die 
gesamtperformance haben wo man welche Dinge anlegt.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 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.