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?
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.
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?!?
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.
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
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
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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.