LED (Spiel-)Würfel Code zu groß?

OP #3445583
Lesenswert?

N'abend,

Ich hab gerade mal ein paar Bauteile beim Aufräumen gefunden, unter 
anderem einen Haufen LEDs und nen kleinen Tiny13.
Nun wollte ich einen kleinen Würfel bauen (also einen Spielwürfel) und 
dachte mir das sollte man wohl packen...
Aber anscheinend habe ich entweder so eine Sauklaue beim Programmieren 
oder ich mache sonst was falsch, weil meine Hex ist leider über 2,8 KiB 
groß (verschiedene Optimierungseinstellungen)...

Wäre jemand so nett meinen Code sich anzugucken? Ist lange her das ich 
auf 8-Bit gearbeitet habe (in letzter Zeit nur am PC und da mit C++)...
Danke!

Mein Code siehe Anhang.

Übersetzt mit angepasstem Beispiel Makefile und dann nochmal hier mit:

avr-gcc -mmcu=attiny13 -Os -Wall -std=gnu99 -DF_OSC=4800000 
-F_CPU=4800000 -o wuerfel.elf wuerfel.c
avr-objcopy -j .text -j .data -O ihex wuerfel.elf wuerfel.hex


MfG,
Fer_t

Kleines Update, aber immer noch nicht klein genug:

Wenn ich die stdlib raus nehme (für rand()) und mein eigenes definiere 
(hier im Forum gefunden), schaffe ich 2,4 KiB:
1
#define RAND_MAX  65535 // The value of which is the maximum value
2

3
uint32_t _Randseed = 1;
4

5
uint16_t rand(void)
6
{
7
   _Randseed = _Randseed * 1103515245 + 12345;
8
   return ((uint16_t)(_Randseed >> 16) % RAND_MAX);
9
}
10

11
void srand(uint32_t seed)
12
{
13
   _Randseed = seed;
14
}

Hab den auch gerade noch einmal modifiziert, damit komme ich auf 1,6 KiB 
das scheint mir dann aber auch das Minimum zu sein (durch ändern dieser 
Funktion). Auch weiß ich nicht ob die "Güte" der Pseudozufallszahlen 
dabei erhalten bleibt...
1
#define RAND_MAX  255 // The value of which is the maximum value
2

3
uint16_t _Randseed = 1;
4

5
uint8_t rand(void)
6
{
7
   _Randseed = _Randseed * 48653 + 1234;
8
   return ((uint8_t)(_Randseed >> 8) % RAND_MAX);
9
}
10

11
void srand(uint16_t seed)
12
{
13
   _Randseed = seed;
14
}

MfG,
Fer_T
Angehängte Dateien:
Gast #3445609
Lesenswert?

Hi Fer_t

die .hex-Datei ist wesentlich größer, als das Progamm tatsächliche Bytes 
im Ram benötigt - die Datei ist ja auch im Intel-Hex-Format.

Ich hab das Programm mal schnell mit AVR-Studio übersetzt und das sagt 
mir (mit Optimierung O1), dass die Progam Memory Usage mit 876 bytes bei 
85,5% liegt.

--jmp
OP #3445648
Lesenswert?

jmp schrieb:
> Ich hab das Programm mal schnell mit AVR-Studio übersetzt und das sagt
> mir (mit Optimierung O1), dass die Progam Memory Usage mit 876 bytes bei
> 85,5% liegt.

Vielen Dank!


Dank dir hab ich auch mal nach Möglichkeiten unter Linux geguckt und bin 
auf folgendes gestoßen:
Beitrag "avr-gcc Speicherbelegung anzeigen lassen"

Da wird mit angezeigt:
1
AVR Memory Usage:
2
-----------------
3
Device: attiny13
4

5
Program:     554 bytes (54.1% Full)
6
(.text + .data + .bootloader)
7

8
Data:         11 bytes (17.2% Full)
9
(.data + .bss + .noinit)

Kommt das hin? Also Aufruf mit meiner zuletzt genannten Variante 
(eigenes rand() mit uint16 und uint8).


Der Code schein sonst keine Probleme zu machen... Oder sieht noch jemand 
einen Fehler? ;)

MFG,
Fer_T



PS:
Was bedeutet diese Warnung?
/usr/bin/avr-ld: warning: -z relro ignored.

Danke ;)
Gast #3445675
Lesenswert?

Hi,

Mit der ersten rand()-Funktion erhalte ich:

Program Memory Usage   :  650 bytes   63,5 % Full
Data Memory Usage  :  13 bytes   20,3 % Full

Mit der zweiten komme ich auf:
Program Memory Usage   :  550 bytes   53,7 % Full
Data Memory Usage  :  11 bytes   17,2 % Full

Die Warnung gibt's bei mir nicht, keine Ahnung was die bedeutet.

--jmp

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren