www.mikrocontroller.net

Forum: Compiler & IDEs AVR GCC und eigene Struktur


Autor: Anton Wert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Anton Wert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Anton Wert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Anton Wert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.