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!