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 | }
|