Forum: Compiler & IDEs Anzahl Möglicher Variablen


von Martin Ulman (Gast)


Lesenswert?

Hallo Leute,
ich habe folgende Situation: ein AVR90S4433 mit angeschlossenem LCD und
UART. Ich habe mir die LCD-Libary selbst zusammengebaut, fürs UART nehme
ich die von Fleury.
Zum testen meiner LCD-Libary erstelle ich 8 Variablen vom Typ lcdchar
(definition siehe weiter unten) in die ich 8 Custom-Chars speichere.
Diese werden dann ans LCD geschickt. Außerdem gebe ich noch einige Text
und eben diese 8 Chars aus.
Zum testen der UART-Funktionen benutze ich den uart_test.c Code der der
Libary beiligt.

Die beiden Teile funktionieren wenn ich sie alleine Benutze problemlos.
Versuche ich aber sowohl die Zeichen an das LCD zu senden alsauch das
UART-Echo laufen zu lassen kommt es zu großen Problemen:
- Es werden nurnoch wenige Zeichen auf dem LCD ausgegeben, der MC
verschluckt also Zeichen.
- das UARRT-Echo spinnt auch rum, es wird nicht einfach der letzte
Buschstaben zurückgegeben sondern manchmal auch die letzten x getippten
Buchstaben, außerdem kommt es zu overruns.

Nach langem rumprobieren habe ich festgestellt woran es liegt:
Irgendwie scheine ich zuviel Speicher zu brauchen.
Erstelle ich nämlich nicht erst die 8 Customchars und sende sie dann an
das Display, sondern erstell ich nur eine Variable für alle 8 und
schreibe immer nach dem Setzten auf das Display, dann funktioniert es
PRoblemlos.

Code:
typedef  struct {
  uint8_t line0;
  uint8_t line1;
  uint8_t line2;
  uint8_t line3;
  uint8_t line4;
  uint8_t line5;
  uint8_t line6;
  uint8_t line7;
} lcdchar;

=============================================================
Funktioniert nicht:
lcdchar c1;
c1.line0 = 0b00000000;
c1.line1 = 0b00000000;
c1.line2 = 0b00000000;
c1.line3 = 0b00000001;
c1.line4 = 0b00000011;
c1.line5 = 0b00000111;
c1.line6 = 0b00001111;
c1.line7 = 0b00011111;

lcdchar c2;
c2.line0 = 0b00000000;
c2.line1 = 0b00000000;
c2.line2 = 0b00000000;
c2.line3 = 0b00000001;
c2.line4 = 0b00000011;
c2.line5 = 0b00000111;
c2.line6 = 0b00001111;
c2.line7 = 0b00011111;

... das gleiche bis c8 und dann
lcd_setchar(3,0,c1);
lcd_setchar(3,0,c2);
lcd_setchar(3,0,c3);
.. bis c8
=============================================================

Funktioniert:
lcdchar c1;
c1.line0 = 0b00000000;
c1.line1 = 0b00000000;
c1.line2 = 0b00000000;
c1.line3 = 0b00000001;
c1.line4 = 0b00000011;
c1.line5 = 0b00000111;
c1.line6 = 0b00001111;
c1.line7 = 0b00011111;
lcd_setchar(3,0,c1);

c1.line0 = 0b00000000;
c1.line1 = 0b00000000;
c1.line2 = 0b00000000;
c1.line3 = 0b00000001;
c1.line4 = 0b00000011;
c1.line5 = 0b00000111;
c1.line6 = 0b00001111;
c1.line7 = 0b00011111;
lcd_setchar(3,0,c1);
==========================================================


Meine Frage:
Bin ich an ein Speicherlimit gestoßen? Wieviele Variablen kann ich in C
erstellen? Gibt es da keine Meldung wenn ich zuviel Speicher brauche? Wo
liegt die Grenze? Könnte man die umgehen?

Danke für Hilfe
Martin

von Hieronymus Bosch (Gast)


Lesenswert?

sizeof (lcdchar) müsste 8 sein. Also belegt jede Variable dieses Typs
gerade mal 8 Bytes.

Welche Gültigkeit haben c1 bis c8? Sind die automatisch (also innerhalb
einer Funktion) deklariert? Dann liegen sie auf dem Stack.

Dazu kommt noch, dass beim Aufruf Deiner Funktion lcd_getchar übergibst
Du die Variablen dieses Typs als Wert, kommen nochmal 8 Bytes auf den
Stack.
Ist da genug Platz?

von Jörg Wunsch (Gast)


Lesenswert?

Variablen kannst du ,,in C'' erstmal mindestens so viele erstellen,
wie der Standard garantiert.  GCC erfüllt den Standard in dieser
Hinsicht und übererfüllt ihn nahezu beliebig.

Aber du musst natürlich genügend RAM haben, um alle Variablen zu
halten.  Typischer ,,Denkste!''-Fehler von AVR-Anfängern ist dabei,
dass sie vernachlässigen, dass auch Strinliterale (also alles, was in
doppelten Anführungszeichen steht) standardmäßig RAM benötigt.  Ich
vermute, dass auch du über sowas hier stolperst.

von Martin Ulman (Gast)


Lesenswert?

Hy,
danke für die Antworten: Klar, ich bin mir im klaren das ein AVR nicht
viel Speicher hat, deshalb meine Frage: wie kann ich feststellen was
wieviel ram braucht? Gibt es eine Art Profiler?

Danke auf jeden Fall
Martin

von Alex (Gast)


Lesenswert?

Der GCC gibt dir doch aus, wieviel er benötigt. Dort wo du auch immer
die Fehlermeldungen beim Compilieren bekommst :)

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.