GCC Section will nicht

Gast #5088024
Lesenswert?

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
Lesenswert?

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.
Persönliche Seite #5088094
Lesenswert?

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?
Gast #5088099
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

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