Hallo,
ich habe den heap in den SDRAM verschoben,
damit freeRTOS den stack für die Tasks aus dem SDRAM zugewiesen bekommt.
Dies funktioniert auch.
Mein SDRAM hat 256MBit = 32MB.
2MiB möchte ich für den Heap verwenden.
Der Rest soll für's Datenloggen zur Verfügung stehen.
Mein Probleme sind:
Wie lege ich den Speicherbereich für das Datenloggen im linker richtig
an?
Im linker script bezeichnet als SDRAM_SAVE_DATA.
Stimmt das so wie in dem zum Schluss stehenden Skript?
Wie greife ich auf die Startadresse von .save_data im C-Programm zu?
Mein Versuch:
1 | __attribute__((__section__(".save_data"))) static unsigned long test;
|
2 | static unsigned long *sdram = &test;
|
Jedoch bricht mir dann der Compiler mit den folgenden 2 Fehlern ab:
Error MotorControl.elf: warning: allocated section `.save_data' not in
segment
Error Program Memory Usage : 30012098 bytes 5724,4 % Full (Memory
Overflow)
Wobei ich zu dem ersten Fehler im Handbuch AVR32795 Seite 18 einen
Hinweis gefunden habe das dieses Warning (bei mir Fehler?) ignoriert
werden kann.
Den zweiten Fehler kann ich mir nicht erklären.
Wäre super wenn mir da wer weiterhelfen kann und mich ein wenig darüber
aufklären kann! :)
Meine Änderungen im Linker Script: (link_uc3a0512.lds)
1 | MEMORY
|
2 | {
|
3 | FLASH (rxai!w) : ORIGIN = 0x80000000, LENGTH = 0x00080000
|
4 | INTRAM (wxa!ri) : ORIGIN = 0x00000004, LENGTH = 0x0000FFFC
|
5 | /*SDRAM total size = 256MBit = 32MB => length = 0x01E84800; start = 0xD0000000; end = 0xD1E84800 */
|
6 | SDRAM_HEAP (wxa!ri) : ORIGIN = 0xD0000000, LENGTH = 0x00200000 /*2MiB*/
|
7 | SDRAM_SAVE_DATA (wxa!ri) : ORIGIN = 0xD0200000, LENGTH = 0x01C84800 /*32MB - 2MiB*/
|
8 | USERPAGE : ORIGIN = 0x80800000, LENGTH = 0x00000200
|
9 | }
|
10 |
|
11 | PHDRS
|
12 | {
|
13 | FLASH PT_LOAD;
|
14 | INTRAM_ALIGN PT_NULL;
|
15 | INTRAM_AT_FLASH PT_LOAD;
|
16 | INTRAM PT_NULL;
|
17 | SDRAM_HEAP_AT_FLASH PT_LOAD;
|
18 | SDRAM_HEAP PT_NULL;
|
19 | SDRAM_SAVE_DATA_AT_FLASH PT_LOAD;
|
20 | SDRAM_SAVE_DATA PT_NULL;
|
21 | USERPAGE PT_LOAD;
|
22 | }
|
23 |
|
24 | SECTIONS /* Nur die veränderten hinzugefügten Zeilen*/
|
25 | {
|
26 |
|
27 |
|
28 | /* Use a default heap size if heap size was not defined. */
|
29 | __heap_size__ = DEFINED(__heap_size__) ? __heap_size__ : LENGTH(SDRAM_HEAP);
|
30 |
|
31 | /* Use a default save data size if save data size was not defined. */
|
32 | __save_data_size__ = DEFINED(__save_data_size__) ? __save_data_size__ : LENGTH(SDRAM_SAVE_DATA);
|
33 |
|
34 |
|
35 | /* Hier stehen jede Menge andere Anweisungen */
|
36 |
|
37 |
|
38 | . = ORIGIN(SDRAM_HEAP);
|
39 | .heap :
|
40 | {
|
41 | __heap_start__ = .;
|
42 | *(.heap)
|
43 | . = __heap_size__;
|
44 | __heap_end__ = .;
|
45 | } >SDRAM_HEAP AT>SDRAM_HEAP :SDRAM_HEAP
|
46 |
|
47 | . = ORIGIN(SDRAM_SAVE_DATA);
|
48 | .save_data :
|
49 | {
|
50 | __save_data_start__ = .;
|
51 | *(.save_data)
|
52 | . = __save_data_size__;
|
53 | __save_data_end__ = .;
|
54 | } >SDRAM_SAVE_DATA AT>SDRAM_SAVE_DATA :SDRAM_SAVE_DATA
|
55 |
|
56 |
|
57 | /*.userpage... */
|
58 | }
|