AVR32: Heap in SDRAM und großen Datenbereich festlegen.

OP #3400457
Lesenswert?
• ▲
▼
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
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.