Forum: Compiler & IDEs AVR GCC und eigene Struktur


von Anton Wert (Gast)


Lesenswert?

Hallo,
bin noch etwas neu mit dem AVR-GCC und wollte nun eine etwas komplexere
Sache einbauen, aber leider ist der entstandene Code praktisch
genausogroß wie ohne, und das macht mich eben stutzig.
Verwenden will ich eine Struktur mit Bitfeld wie im Tutorial auch schön
erklärt, hier mal der Auszug:

typedef struct
{
unsigned char Name[15];
uint64_t Personen1:7;
uint64_t Zeit:17;
uint64_t Dauer1:11;
uint64_t Dauer2:13;
uint64_t Personen2:8;
} einfahrt;

später dann:

einfahrt e;

e.Personen1 = 5;


geht das überhaupt?

von A.K. (Gast)


Lesenswert?

Geht schon, nur sorgt der Umgang mit Bitfeldern für reichlich Code.
Wenn's unbedingt sein muss, dann sollten die Zugriffe darauf in
Zugriffsfunktionen verkapselt werden, d.h. für jedes Feld 2 Funktionen,
eine setzt, eine liest, und der Rest arbeitet über diese Funktionen.

von Anton Wert (Gast)


Lesenswert?

Das isses ja eben, ich erwarte reichlich Code, aber es passiert eben
garxichts, durch das char-Array müsste er doch auf's SRAM des AVR's
ausweichen, aber dessen Belegung liegt angeblich bei 1 Byte, was ja
nicht sein kann?!?

von A.K. (Gast)


Lesenswert?

Hab es grad ausprobiert - ist genau so wie es sein soll. "e" wird in
voller Länge abgelegt (22 Bytes). Woraus erschliesst Du die Belgung mit
1 Byte?

Ansonsten: Auch in Bitfeldern Typen nur so gross definieren wie nötig.
Dein uint64_t produziert mehr Code als nötig.

von Anton Wert (Gast)


Lesenswert?

hier die Ausgabe des Compilers:


AVR Memory Usage:
-----------------
Device: atmega128

Program:     428 bytes (0.3% Full)
(.text + .data + .bootloader)

Data:          1 bytes (0.0% Full)
(.data + .bss + .noinit)



das eine Byte kommt noch von einer char Variable die ich aber nicht
verwende

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

wo legst du die Variable vom Typ einfahrt denn an? Innerhalb einer
Funktion? Dann wird sie auf dem Stack angelegt und avr-size kann dir
nichts darüber berichten.

Matthias

von Anton Wert (Gast)


Lesenswert?

autsch ! mein Fehler !

Danke für die Hilfe.

BTW: Hab ich eigentlich die Möglichkeit irgendwie über die maximale
Größe des Stacks informiert zu werden? (Also so als Schutz dass er
nicht in meine Daten hinein wächst)

von A.K. (Gast)


Lesenswert?

Ich bin in WinAVR bislang keiner Stack-Abschätzung begegnet. Gibt es in
manchen auf Controller spezialisierten Compilern, aber wohl nicht in
GCC.

Wenn man weiss, welcher Pfad die maximale Tiefe erreich, kann man per
JTAG ins RAM reinschauen. Ansonsten bleibt beispielsweise die etwas
unbefriedigende Lösung, ans Ende vom RAM irgendwelchen bekannten
Blödsinn reinzuschreiben und regelmässig nachzusehen ob er dort noch
genauso drinsteht.

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.