Anzahl Möglicher Variablen

Gast #182745
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
Gast
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?
Gast
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.
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.