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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.