www.mikrocontroller.net

Forum: Compiler & IDEs Anzahl Möglicher Variablen


Autor: Martin Ulman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hieronymus Bosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin Ulman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.