Das ist ja wirklich knifflig.
So hab jetzt ein paar Berechnungen gemacht.
Bin die .map Datei durchgegangen und habe folgendes zusammen gezählt:
Es werden momentan (THEORETISCH) 22217 Bytes gebraucht, bei 32 kB RAM
sind also noch 10551 Bytes frei. Dabei habe ich die Sektoren .data,
.bss, .heap, .stack und .iap zusammengezählt, plus alles, was so an
padding betrieben wird.
Dann habe ich im Code einen Array erzeugt, um die fen freien RAM
auszutesten.
Dabei kam heraus, dass 10436 Bytes frei sind. Das sind 131 Bytes
weniger! Von wo kommen die?
An den 16kB kanns nicht liegen, da 10436 Bytes < 16kB.
Ich habe dann probiert, den Speicher vom USB und Ethernet zu benutzen,
also die Kommentarzeichen zu entfernen, kriege beim kompilieren immer
noch denselben Fehler. Dann habe ich mir das Script für den Linker
angeschaut, und entdeckt, dass sowas z.B. drinnen steht:
1 | MEMORY
|
2 | {
|
3 | /* bootloader (rx) : ORIGIN = 0x00000000, LENGTH = 60K */
|
4 | rom (rx) : ORIGIN = 0x00000000, LENGTH = 60K
|
5 | ram (rwx) : ORIGIN = 0x10000000, LENGTH = 32K
|
6 | /* USE USB RAM */
|
7 | ram1 (rwx) : ORIGIN = 0x2007C000, LENGTH = 16k
|
8 | /* USE ETH RAM */
|
9 | ram2 (rwx) : ORIGIN = 0x20080000, LENGTH = 16k
|
10 | config (rx): ORIGIN = 0x0000F000, LENGTH = 4K
|
11 | }
|
12 |
|
13 | ... /*blablabla*/
|
14 |
|
15 | .data :
|
16 | {
|
17 | _sdata = .;
|
18 | __cs3_region_start_ram = .;
|
19 | *(.cs3.region-head.ram)
|
20 | KEEP(*(.jcr))
|
21 | *(.got.plt) *(.got)
|
22 | *(.shdata)
|
23 | *(.data .data.* .gnu.linkonce.d.*)
|
24 | *(.ram)
|
25 | . = ALIGN (8);
|
26 | _edata = .;
|
27 | } >ram AT>rom
|
28 |
|
29 | .bss :
|
30 | {
|
31 | . = ALIGN (8);
|
32 | _sbss = .;
|
33 | *(.shbss)
|
34 | *(.bss .bss.* .gnu.linkonce.b.*)
|
35 | *(COMMON)
|
36 | _ebss = .;
|
37 | *(.ram.b)
|
38 | . = ALIGN (8);
|
39 | end = .;
|
40 | _end = .;
|
41 | __end = .;
|
42 | } >ram AT>rom
|
Bedeutet das denn nicht, dass der Linker dann versucht alles von .data
und .bss NUR in ram rein zu tun? ram1 und ram2 scheint er
offentsichtlich ausser Acht zu lassen. Muss man denn dem Linker sagen
dass ram1 und ram2 auch RAM sind und er da Variablen reinpacken kann?
Oder erkennt er das automatisch mittels (rwx) in MEMORY{...}?
Und wenn ich den arm-none-eabi-size verwende (Input: elf-Datei des
kompilierten Programms), sagt er mir das hier:
1 | text data bss dec hex filename
|
2 | 54912 2120 24348 81380 13de4 /xxx...
|
.data stimmt mit meiner Berechnung überein, aber wieso ist .bss so viel
größer als meine Berechnung?