Hallo zusammen,
mal wieder was zum Thema Microblaze: Wie funktioniert das mit SDA_BASE
und SDA2_BASE ?
Im Linker Script wird SDA2_BASE wie folgt definiert:
1 | .sdata2 : {
|
2 | . = ALIGN(8);
|
3 | __sdata2_start = .;
|
4 | *(.sdata2)
|
5 | *(.sdata2.*)
|
6 | *(.gnu.linkonce.s2.*)
|
7 | . = ALIGN(8);
|
8 | __sdata2_end = .;
|
9 | } > DDR2_SDRAM_MPMC_BASEADDR
|
10 |
|
11 | .sbss2 : {
|
12 | __sbss2_start = .;
|
13 | *(.sbss2)
|
14 | *(.sbss2.*)
|
15 | *(.gnu.linkonce.sb2.*)
|
16 | __sbss2_end = .;
|
17 | } > DDR2_SDRAM_MPMC_BASEADDR
|
18 |
|
19 | _SDA2_BASE_ = __sdata2_start + ((__sbss2_end - __sdata2_start) / 2 );
|
...und SDA_BASE so:
1 | .sdata : {
|
2 | . = ALIGN(8);
|
3 | __sdata_start = .;
|
4 | *(.sdata)
|
5 | *(.sdata.*)
|
6 | *(.gnu.linkonce.s.*)
|
7 | __sdata_end = .;
|
8 | } > DDR2_SDRAM_MPMC_BASEADDR
|
9 |
|
10 | .sbss : {
|
11 | . = ALIGN(4);
|
12 | __sbss_start = .;
|
13 | *(.sbss)
|
14 | *(.sbss.*)
|
15 | *(.gnu.linkonce.sb.*)
|
16 | . = ALIGN(8);
|
17 | __sbss_end = .;
|
18 | } > DDR2_SDRAM_MPMC_BASEADDR
|
19 |
|
20 | _SDA_BASE_ = __sdata_start + ((__sbss_end - __sdata_start) / 2 );
|
Im Startup-Code steht dann sowas:
1 | la r13, r0, _SDA_BASE_
|
2 | la r2, r0, _SDA2_BASE_
|
Jetzt entdecke ich insbesondere in der Berechnung der Symbole nicht den
Sinn. Wo beabsichtigt man dann damit hinzuzeigen ? Einfach "irgendwo" in
den Bereich zwischen .sdata und .sbss ?