Forum: Mikrocontroller und Digitale Elektronik LED (Spiel-)Würfel Code zu groß?


von Fer T. (fer_t)


Angehängte Dateien:

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

: Bearbeitet durch User
von jmp (Gast)


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

von Fer T. (fer_t)


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 ;)

: Bearbeitet durch User
von jmp (Gast)


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

von Fer T. (fer_t)


Lesenswert?

jmp schrieb:
> Mit der ersten rand()-Funktion erhalte ich:

Ok Danke :D

Dann scheint bei dir der Compilier nur etwas anders zu arbeiten :)
Die Warnung denke ich kann ich dann mal "übersehen" ;)

MfG,
Fer_T

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.