Forum: Mikrocontroller und Digitale Elektronik Bitfeld-Array zusammenfassen?


von C-Fragensteller (Gast)


Lesenswert?

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!

von Oliver (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>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.

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
Noch kein Account? Hier anmelden.