ATxMEGA: Probleme mit Speichererweiterung

OP #2853906
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
}
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.