mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bitfields: Speicherplatzoptimierung


Autor: matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin dabei mein kleines Programm für einen ATtiny zu optimieren, was 
den Speicherbedarf angeht. Dabei ist mir folgendes Aufgefallen:
typedef struct MyStruct
{
  char a : 1;
  char b : 1;
  char c : 1;
  char d : 3;

} MyStruct;
MyStruct myStruct;


void myFunction()
{
    myStruct.a ^= 1;    // Diese Anweisung benötigt 14 Byte
}

Ich möchte oben markierte Anweisung gerne verwenden, aber nicht für den 
Preis von 14 Byte!

Wie kann ich das günstiger realisieren?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> mein kleines Programm für einen ATtiny zu optimieren, was
> den Speicherbedarf angeht
Welchen Speicherbedarf?
Den vom RAM oder dem vom Flash oder dem vom EEPROM?

Autor: matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Flash!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann nimm besser für jedes Flag ein einzelnes Byte. Sonst muß der 
Compiler jedes Bit aus dem Byte herauspfriemlen, es manipulieren und 
wieder hineinbiegen...
Das braucht etliche Assemblerzeilen und Platz im Flash  :-o

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kannst du uns auch mal den ASM code zeigen, das man sieht warum das 
ganze 14byte braucht?

Autor: matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok,

der Vorteil der Bitfields ist also nur der, dass weniger RAM verbraucht 
wird, aber auf kosten von mehr Flash und Prozessorzyklen?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jep

Autor: matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok,

wenn ich ein Byte pro Flag verwende, also in etwa so:
unsigned char a;

void myFunction()
{
    a = 0;
    while(1)
    {
        a ^= 1;    // Diese Anweisung benötigt 10 Byte!
    }
}

dann braucht die Anweisung leider immernoch 10 Byte!

Geht das nicht billiger?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eher nicht. Laden = 4 Bytes, XOR = 2 Bytes, speichern = 4 Bytes. Kürzer 
gibt's das beispielsweise auf 8051.

Autor: matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, dann finde ich mich damit ab, dass das 10 Byte kostet...

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define FLAG_A 0x01
#define FLAG_B 0x02
#define FLAG_C 0x04

unsigned char Flags;

void myFunction()
{
    Flags ^= FLAG_A;
}

Autor: Bernhard R. (barnyhh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ matze

Muß diese Variable tatsächlich global sein?

Funktionsinterne Variable liegen vielfach in Registern, so daß eine 
Bitinversion nur 2 Bytes (1 Instruktion) kostet.

Bernhard

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für besonders platz/zeitkritische Flags gibt es bei manchen AVRs ein 
paar freie Bytes im bitadressierbaren I/O-Raum, GPIORA-C oder so. Die 
sind effizienter, wenn auch eher beim Setzen und Löschen (2 Bytes), 
nicht ganz so sehr beim XOR (6 Bytes).

Autor: matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm... ok. Dann werde ich mal versuchen, die Flags (zumindest einen Teil 
davon) in die Funktion zu verschieben.

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.