Forum: Mikrocontroller und Digitale Elektronik AVR32: Heap in SDRAM und großen Datenbereich festlegen.


von Godi S. (godi22)


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
}

: Bearbeitet durch User
von Peter M. (skybiker)


Lesenswert?

Hallo godi S
ich habe auch das gleiche Problem mit dem Memory overflow,
aber nur mit dem Atmel Studio 6.0 und 6.1
mit dem AVR32 Studio klappt es richtig.
Welche oberfläche benutzt du zum entwickeln ?
Siehe dazu Beitrag "AT32UC3C mit Ateml Studio 6.1 Program memory usage memory overflow"
Gruß von Peter

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