AVR GCC und eigene Struktur

Gast #238713
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?
Gast #238714
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.
Gast #238715
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?!?
Gast #238716
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.
Gast #238717
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
Gast #238719
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)
Gast #238720
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.