Forum: Compiler & IDEs Speicher an einer festen Adresse bereitstellen (im DDR-RAM eines ARMs)


von ARMed (Gast)


Lesenswert?

Hallo Leute,

ich möchte an einer bestimmten Adresse im RAM Daten ablegen. Dazu 
deiniere ich einfach die Addresse und die Länge meines Bereiches.
Wie kann ich dafür sorgen, dass der Linker dort nichts anderes hinlegt?

Konkret geht es um einen ARM im Zynq, dessen Daten im DDR-RAM abgelegt 
werden.

Grüße, ARMed

von Dr. Sommer (Gast)


Lesenswert?

ARMed schrieb:
> Wie kann ich dafür sorgen, dass der Linker dort nichts anderes hinlegt?
Indem du ihm nicht sagst, dort etwas abzulegen. Wenn der Linker nicht 
weiß dass dein DDR-RAM existiert, legt er dort auch nichts hin. Konkret 
geht das indem du im Linkerscript die .data Section eben in den SRAM 
oder wo das sonst hinsoll hinlegst.
Darüber hinaus wäre es vielleicht doch schlau, dem Linker die Existenz 
des DDR-RAM's beizubringen über eine entsprechende Section im 
Linker-Script, und eine globale Variable anzulegen und diese per 
Attribut in eben diese Section zu legen. So sparst du dir die hässliche 
Rechnerei mit Adressen im Code, sondern kannst einfach normal direkt auf 
die Variable zugreifen, und der Linker ersetzt die Zugriffe mit der im 
Linkerscript angegebenen Adresse des DDR-RAM's.

von ARMed (Gast)


Lesenswert?

Ich möchte nicht den ganzen DDR RAM, sondern nur ein paar MB davon 
selbst verwalten. Diese paar MB möchte ich aber an einer ganz bestimmten 
Adresse haben.

Kann ich eine Section an eine bestimmte Länge zuweisen? Damit könnte man 
dann eine eigene Section für diesen Bereich konfigurieren.

Wenn nicht, würde sowas funktionieren?:
1
MEMORY
2
{
3
   ps7_ddr_0_S_AXI_BASEADDR : ORIGIN = 0x00100000, LENGTH = 0x1FF00000
4
   ps7_ram_0_S_AXI_BASEADDR : ORIGIN = 0x00000000, LENGTH = 0x00030000
5
   ps7_ram_1_S_AXI_BASEADDR : ORIGIN = 0xFFFF0000, LENGTH = 0x0000FE00
6
}
7
8
/* Specify the default entry point to the program */
9
10
ENTRY(_vector_table)
11
12
/* Define the sections, and where they are mapped in memory */
13
14
SECTIONS
15
{
16
.text : {
17
   *(.vectors)
18
   *(.boot)
19
   *(.text)
20
   ...
21
   *(.ARM.extab)
22
   *(.gnu.linkonce.armextab.*)
23
} > ps7_ddr_0_S_AXI_BASEADDR
24
25
.init : {
26
   KEEP (*(.init))
27
} > ps7_ddr_0_S_AXI_BASEADDR
28
29
...
30
31
.stack (NOLOAD) : {
32
   . = ALIGN(16);
33
   _stack_end = .;
34
   . += _STACK_SIZE;
35
   _stack = .;
36
   
37
    ...
38
39
   . += _UNDEF_STACK_SIZE;
40
   . = ALIGN(16);
41
   __undef_stack = .;
42
} > ps7_ddr_0_S_AXI_BASEADDR
43
44
//*****************hier meine Sektionen********************
45
.mySection1 MY_SECTION1_ADDRESS : {
46
   *(.mySection1);
47
} > ps7_ddr_0_S_AXI_BASEADDR
48
49
.mySection2 MY_SECTION2_ADDRESS : {
50
   *(.mySection2);
51
} > ps7_ddr_0_S_AXI_BASEADDR
52
//***********************************************************
53
54
_end = .;
55
}

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.