Forum: Compiler & IDEs AVR GCC: "restliches RAM" für Array abschätzen


von kxr (Gast)


Lesenswert?

uint8_t ramlog[RESTRAMSIZE - 64];

Das Program wächst und wächst ...
Wie kann man die Größe des restliche RAM RESTRAMSIZE (minus etwas 
Stack)im AVR GCC Preprocessor auto bestimmen/abschätzen?

Grüße

von g457 (Gast)


Lesenswert?

> [..] im AVR GCC Preprocessor [..]
                  ^^^^^^^^^^^^
Dieses Problem ist in dieser allgemeinen Version zu diesem Zeitpunkt 
mindestens NP-schwer -> lass es bleiben und such Dir eine andere Lösung 
zum hier nicht näher beschriebenen eigentlichen Problem.

HTH

von Karl H. (kbuchegg)


Lesenswert?

kxr schrieb:
> uint8_t ramlog[RESTRAMSIZE - 64];
>
> Das Program wächst und wächst ...
> Wie kann man die Größe des restliche RAM RESTRAMSIZE (minus etwas
> Stack)im AVR GCC Preprocessor auto bestimmen/abschätzen?

gar nicht.

Wieviel SRAM durch Variablen belegt ist, weißt du erst, nachdem der 
Linker das komplette Programm zusammengebaut hat.

von Stefan P. (form)


Lesenswert?

Man könnte das makefile umstricken (oder ein Script drumherum bauen), so 
das er 2x kompiliert.
Das erste mal um zu sehen wieviel RAM frei bleibt.
Das zweite mal um auch den gesamten RAM (mit Reserve) zu benutzen.

von kxr (Gast)


Lesenswert?

Stefan P. schrieb:
> Man könnte das makefile umstricken (oder ein Script drumherum bauen), so
> das er 2x kompiliert.

die iterations-methode mittels Skript funktioniert.

Was mich noch stört, ist daß der GCC/Linker dieses (uninitialisierte) 
Array an eine recht zufällige Position ins RAM legt (COMMON abschnitt). 
und überhaupt nicht in übereinstimmung mit der Definitionsreihenfolge in 
C.

(die DATA und explizit null-initialsierten BSS Variablen scheinen 
ordentlicher gereiht zu sein)

Ich hätte das Array am liebsten aber am Ende als letztes vor dem Stack - 
aus gewissen Sicherheits/Debug-Gründen und überhaupt...   wie kann man 
das erzwingen?

und/alternativ: wie kann man im C-Code einen Pointer auf das Ende der 
Daten (__bss_end im map file) erhalten?

von Stefan E. (sternst)


Lesenswert?

kxr schrieb:
> Was mich noch stört, ist daß der GCC/Linker dieses (uninitialisierte)
> Array an eine recht zufällige Position ins RAM legt (COMMON abschnitt).
> und überhaupt nicht in übereinstimmung mit der Definitionsreihenfolge in
> C.
>
> (die DATA und explizit null-initialsierten BSS Variablen scheinen
> ordentlicher gereiht zu sein)

Hä? Das Array ist offensichtlich nicht uninitialisiert, sondern liegt in 
bss, sonst könnte es nicht "mittendrin" liegen. Übrigens liegen in bss 
auch die implizit null-initialisierten Variablen.

kxr schrieb:
> Ich hätte das Array am liebsten aber am Ende als letztes vor dem Stack

Dann mache daraus tatsächlich eine uninitialisierte globale Variable, 
denn die noinit Section liegt hinter data und bss.

kxr schrieb:
> und/alternativ: wie kann man im C-Code einen Pointer auf das Ende der
> Daten (__bss_end im map file) erhalten?

Da (wie gesagt) nach bss noch noinit kommt, nimmst du als Anfang des 
ungenutzten Bereichs besser __heap_start.
1
extern uint8_t __heap_start;
2
3
uint8_t *ptr = &__heap_start;


PS: Was ist überhaupt der Hintergrund?

von Karl H. (kbuchegg)


Lesenswert?

Da frag ich mich schön langsam, ob nicht ein einzelner malloc am 
Programmstart, der sich den restlich verbliebenen Speicher (ohne Array) 
krallt, nicht die einfachere Variante wäre.

von kxr (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Da frag ich mich schön langsam, ob nicht ein einzelner malloc am
> Programmstart, der sich den restlich verbliebenen Speicher (ohne Array)
> krallt, nicht die einfachere Variante wäre.

da sonst kein heap verwendet wird, ists ähnlich. nur kosten die malloc 
Funktionen an die 500Byte und vom RAM auch noch was..
für freien Speicher ermitteln seh ich jetzt auch keine dynamische 
Funktion.

verwende ich also besser direkt __heap_start  ... RAMEND - stacksize

von holger (Gast)


Lesenswert?

>verwende ich also besser direkt __heap_start  ... RAMEND - stacksize

stacksize ist aber unbekannt und hängt vom Programm ab.

Damit ist dein Konzept fürn Arsch.

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.