Forum: Mikrocontroller und Digitale Elektronik ATxMEGA: Probleme mit Speichererweiterung


von Alois N. (alois)


Angehängte Dateien:

Lesenswert?

Ich habe hier ein ATxMEGA128A1 mit 512kB-SRAM.
Den HEAP habe ich auf 0x4000-0xFFFF verschoben (-D__heap_start=0x804000 
-D__heap_end=0x80ffff)

Die Abfrage des Speichers zeigt aber immer 0 Bytes frei an. Warum?


Interface für externen Speicher aktivieren:
1
void __attribute__ ((naked, section(".init3"))) init_xram (void)
2
{      
3
  PORTH_OUT = 0xF3;  // enable pullups
4
  PORTH_DIR = 0xFF;  // set port H to output - control & address
5
  PORTK_DIR = 0xFF;  // set port K to output - address lines
6
7
  /* 3 Port Mode, SRAM 8-Bit ALE 1+2 */
8
  EBI_CTRL     = EBI_SDDATAW_8BIT_gc | EBI_LPCMODE_ALE1_gc | EBI_SRMODE_ALE12_gc | EBI_IFMODE_3PORT_gc; 
9
  /* SRAM Mode, 512kB */
10
  EBI_CS2_CTRLA   = EBI_CS_ASIZE_512KB_gc | EBI_CS_MODE_SRAM_gc; 
11
  /* SRAM IS61LV5128AL 512K x 8 10ns */
12
  EBI_CS2_CTRLB   = EBI_CS_SRWS_2CLK_gc;
13
  /* SRAM Start Adresse ( 512kB belegt : 0x00004000 - 0x0007FFFF ) */
14
  EBI_CS2_BASEADDR = 0x0000;
15
16
  EBI_CS0_CTRLA = EBI_CS_MODE_DISABLED_gc;
17
  EBI_CS1_CTRLA= EBI_CS_MODE_DISABLED_gc;
18
  EBI_CS3_CTRLA= EBI_CS_MODE_DISABLED_gc;
19
}

Speicher initialisieren (wird mit 0xAA gefüllt):
1
// !!! Never call this function, it is part of .init-Code
2
void __attribute__ ((naked, used, section(".init8"))) init_mem (void);
3
void init_mem (void)
4
{
5
  //  Use inline assembler so it works even with optimization turned off
6
  __asm volatile (
7
  "ldi r30, lo8 (__heap_start)"  "\n\t"
8
  "ldi r31, hi8 (__heap_start)"  "\n\t"
9
  "ldi r24, %0"                  "\n\t"
10
  "ldi r25, hi8 (%1)"            "\n"
11
  "0:"                           "\n\t"
12
  "st  Z+,  r24"                 "\n\t"
13
  "cpi r30, lo8 (%1)"            "\n\t"
14
  "cpc r31, r25"                 "\n\t"
15
  "brlo 0b"
16
  :
17
  : "i" (MASK), "i" (__heap_end+1)
18
  );
19
}

Freien Speicher anzeigen:
1
//  Get minimum of free memory (in bytes) up to now.
2
unsigned short get_mem_unused (void)
3
{
4
  unsigned short unused = 0;
5
  unsigned char *p = __heap_start;
6
7
  do
8
  {
9
    if (*p++ != MASK)
10
    break;
11
12
    unused++;
13
  } while (p <= (unsigned char*) __heap_end);
14
15
  return unused;
16
}

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.