Linker Optionen beim Mega2560 setzen zwecks ext. SRAM - Fragen

Hallo, Ich beziehe mich auf diesen Thread : http://forum.arduino.cc/index.php?topic=187096.msg1389883#msg1389883

In Verwendung dieser Hardware http://ruggedcircuits.com/html/megaram.html Mir reichen 64K aus, also kein Bank switching .

Mein Projekt habe ich mit Code::Blocks erzeugt mit diesen Linkersettings:

-Wl,--section-start,.data=0x802200,--defsym=__heap_end=0x80ffff

Im Code:

void initExtSRAM(void) __attribute__((naked, section(".init3")));
....
void initExtSRAM(void)
{
MCUCR=0x80;
    XMCRA=0x80;
    XMCRB &=~7 ;
}

void setup()
{
pinMode(42, OUTPUT);
digitalWrite(42,HIGH );  //Enabling the External Memory Interface
pinMode(38, OUTPUT); digitalWrite(38, LOW);
}

Die Pin Settings sind nötig damit das Modul enabled wird.

Nun liefert diese Funktion negative Werte für den freien Speicher zurück:

int get_free_memory()
{
    int free_memory;

    if((int)__brkval == 0)
        free_memory = ((int)&free_memory) - ((int)&__bss_end);
    else
        free_memory = ((int)&free_memory) - ((int)__brkval);

    return free_memory;
}

Schaut fast so aus als ob hier die int Variable überläuft, bei 64 k Speicher - also alles bei get_free_memory auf unsigned int umstellen ? Liege ich mit meiner Vermutung richtig ?

Schaut fast so aus als ob hier die int Variable überläuft, bei 64 k Speicher - also alles bei get_free_memory auf unsigned int umstellen ? Liege ich mit meiner Vermutung richtig ?

Sehe ich auch so. Grüße Uwe

Danke für die Bestätigung - Die funktion ist nun auf unsigned int umgestellt.
Habe nun 57483 Bytes frei ! :smiley-eek

Das bietet nun viel Platz für un­pro­fes­si­o­nellen Programmierstil :wink: :wink:

Eine kleine Frage hätte ich noch nur Berechnung des freien Speichers.

int  free_memory;   // eine normale int Variabe  

((int)&free_memory)  // int typcast der Adresse auf die free_memory zeigt.

Davon wird z.b die Adresse ((int)&__bss_end); subtrahiert. Warum funktioniert das, bzw woher weiß man wo der Compiler free_memory reserviert. Meine Überlegung: Da dies in einer Funktion deklariert wurde, sollte die free_memory auf den Top des Stack zeigen ????

Edit: Die Berechnung stimmt wohl wirklich nicht:

long tester[2000];   // dies hinzugefügt - sollte doch ram verbrauchen 


unsigned int get_free_memory()
{
    unsigned int free_memory;

    if((unsigned int)__brkval == 0)
        free_memory = ((unsigned int)&free_memory) - ((unsigned int)&__bss_end);
    else
        free_memory = ((unsigned int)&free_memory) - ((unsigned int)__brkval);

    return free_memory;
}

Die get_free_memory() errechnet hier nicht viel weniger Ram als vorher, allerdings scheint der ext Ram schon zu funktionieren ansonsten hätte sich der Sketch aufgehängt.