Bitfeld-Array zusammenfassen?

Gast #2735929
Hi,

ich bin gerade dabei einen 3x3x3 LED-Würfel zu programmieren und 
entwerfe gerade die dazugehörigen Datenstrukturen. Angefangen hatte ich 
mit einem stinknormalen 3x3 Array. Das dazugehörige Programm sieht dann 
in etwa so aus:
1
#include <avr/io.h>
2
#include <stdbool.h>
3

4
uint8_t frame1[3][3];
5
uint8_t frame2[3][3];
6
volatile uint8_t *currentFrame = &frame1[0][0];
7
volatile uint8_t *nextFrame = &frame2[0][0];
8
volatile bool frameReady = false;
9

10
int main(void) {
11
  while(1);
12
  return 0;
13
}
Folgender Platz wird benötigt:
1
avr-size --format=berkeley -t LEDCube3x3x3.elf
2
   text     data      bss      dec      hex  filename
3
    144        4       19      167       a7  LEDCube3x3x3.elf
4
    144        4       19      167       a7  (TOTALS)

Allerdings werden dabei ja 5 Bits pro Byte verschwendet. Mittlerweile 
habe ich folgendes Konstrukt:
1
#include <stdbool.h>
2

3
struct frameLayer_t {
4
  bool LED_1:1;
5
  bool LED_2:1;
6
  bool LED_3:1;
7
  bool LED_4:1;
8
  bool LED_5:1;
9
  bool LED_6:1;
10
  bool LED_7:1;
11
  bool LED_8:1;
12
  bool LED_9:1;
13
};
14

15
struct frame_t {
16
  struct frameLayer_t layer[3];
17
};
18

19
struct frame_t frame1;
20
struct frame_t frame2;
21
volatile struct frame_t *currentFrame = &frame1;
22
volatile struct frame_t *nextFrame = &frame2;
23
volatile bool frameReady = false;
24

25
int main(void) {
26
  while(1);
27
  return 0;
28
}
 Das benötigt laut avr-size folgenden Platz:
1
avr-size --format=berkeley -t LEDCube3x3x3.elf
2
   text     data      bss      dec      hex  filename
3
    144        4       13      161       a1  LEDCube3x3x3.elf
4
    144        4       13      161       a1  (TOTALS)

Das ist aber deswegen unflexibel, weil ich die Member LED1 - LED9 
benannt habe und nicht einfach darüber iterieren kann.

Daher dachte ich jetzt an Folgendes:
1
#include <stdbool.h>
2

3
struct LED_t {
4
  bool LED:1;
5
};
6

7
struct frameLayer_t {
8
  struct LED_t LED[9];
9
};
10

11
struct frame_t {
12
  struct frameLayer_t layer[3];
13
};
14

15
struct frame_t frame1;
16
struct frame_t frame2;
17
volatile struct frame_t *currentFrame = &frame1;
18
volatile struct frame_t *nextFrame = &frame2;
19
volatile bool frameReady = false;
20

21
int main(void) {
22
  while(1);
23
  return 0;
24
}
Das wiederum benötigt aber relativ viel Platz (gerade in der BSS 
Sektion):
1
avr-size --format=berkeley -t LEDCube3x3x3.elf
2
   text     data      bss      dec      hex  filename
3
    144        4       55      203       cb  LEDCube3x3x3.elf
4
    144        4       55      203       cb  (TOTALS)

Gibt es denn eine Möglichkeit das Ganze im letzten Fall irgendwie 
zusammenzufassen? Ich habe schon ein wenig mit dem Type Attribute 
"packed" herumgespielt, aber geändert hat das nichts :(. Zu welcher 
Datenstruktur würdet ihr mir raten?

Vielen Dank!
Gast #2736079
Kurzer Ausflug in Programmiertechniken:
Wie strukturiert man seine Software? Wie unterteilt man die Software? 
Wie bricht man die Komplexität herunter?
Antwort: Immer dann wenn man sich fragt, wie man was programmieren soll 
(wenn man eine sogenannte "design decision" treffen muss), dann hat man 
eine Schnittstelle gefunden, an der man sein Programm unterteilen kann.

In deinem Falle: Halte Dich nicht zu lage mit obiger Frage auf, 
vielmehr, schreibe dein Programm so, dass Du die Umsetzung später noch 
ändern kannst.
Programmiere ein Interface:

void setze_bit(uint8_t x, uint8_t y, uint8_t z, uint8_t wert);

uint8_t lese_bit(uint8_t x, uint8_t y, uint8_t z);

Hinter diesen beiden Funktionen kapselst Du dein Problem. Ich plädiere 
hier für eine einfache Lösung (uint8_t cube[3][3][3]). Wenn Du später 
merkst, dass Du zu wenig Speicher hast, ändere es.

also etwa so:
void setze_bit(uint8_t x, uint8_t y, uint8_t z, uint8_t wert)
{
  cube[x][y][z] = wert;
}
und
uint8_t lese_bit(uint8_t x, uint8_t y, uint8_t z)
{
  return cube[x][y][z];
}

Erfunden hat das übrigens der David Parnas, der damit der Begründer der 
modernen Softwareentwicklung geworden ist 
(http://en.wikipedia.org/wiki/David_Parnas)

Grüße,
Oliver
Gast #2736167
>Gibt es denn eine Möglichkeit das Ganze im letzten Fall irgendwie
>zusammenzufassen?

Theoretischer Unsinn. Schreib dein Programm mal zuende
und du wirst feststellen das Programm Nummer 1 weniger Flash braucht als
der ganze Quatsch den du danach verzapft hast. Dein uC ist rechnet am
besten mit 8Bit Werten. Pfeif auf die verlorenen 5 Bits.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 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.