AVR GCC: "restliches RAM" für Array abschätzen

Gast #2323817
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
Gast #2325743
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?
#2325863
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?
Gast #2326103
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren