mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mega32 & große Arrays Probleme & undefinierter Absturz


Autor: Jörn A. (joern_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich versucche mit einem Mega32 in Messschleifen Werte von einem 
AD-Wandler einzulesen und dann per qsort den Median zu berechnen.

Die Werte sind unsigned int (0-65535).

Bei einem unsigned int Array[300] geht das wunderbar. Ab 450 Werten 
macht der Prozessor undefinierte Sachen...

Komme ich da an die Grenze des RAM? Ist doch beim Mega32 2kB oder? Beim 
kompilieren sagt er mir nur 7% Data belegt und 500x2Byte =1kb?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieh Dir vom Linker die Liste an, wie der RAM Speicher verwendet wird. 
Im RAM befinden sich ja auch der Stack und andere Variablen (weitere 
arrays).

Autor: Jörn A. (joern_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist das mit den 2kb richtig? hab grad gesehen, das der Array 2x im 
Programm vorkommt und dann wär ich doch bei 2kB... mit noch reslichen 
Variablen macht es dann Sinn, wenn er zwischen 450 -500 Probleme macht.

Kann man sich davor nicht durch den Compiler schützen lassen? Bzw kann 
ich das ganze intelligenter lösen?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Bzw kann ich das ganze intelligenter lösen?

Dazu kenne ich Dich zu wenig :-)

Es ginge ein anderer µC mit mehr RAM (mega644 o.ä.) oder Du verwendest 
nur ein Array, daß dynamisch belegt wird.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörn Ahrens schrieb:
> ist das mit den 2kb richtig?

Steht alles im Datenblatt

> Kann man sich davor nicht durch den Compiler schützen lassen? Bzw kann
> ich das ganze intelligenter lösen?

Dazu müsste man dein Programm sehen.
Wenn deine Memory Belegung allerdings meint du hättest nur 7% belegt und 
das kommt selbst dir spanisch vor, dann sollte man sich mal das Programm 
ansehen.

Autor: Jörn A. (joern_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also die 7% enstehen durch die globalen Variablen. der Array war aber in 
einem anderen c-file jeweils in der Funktion deklariert und 
initialisiert worden.... Sofern ich diesen als Global einführe, komme 
ich dann auch auf die 103% Data auslastung...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörn Ahrens schrieb:
> also die 7% enstehen durch die globalen Variablen. der Array war aber in
> einem anderen c-file jeweils in der Funktion deklariert und
> initialisiert worden....

Ah. Also eine funktionslokale Variable

> Sofern ich diesen als Global einführe, komme
> ich dann auch auf die 103% Data auslastung...

Und damit weißt du dann auch, was das Problem ist.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Kann man sich davor nicht durch den Compiler schützen lassen?

Nein.
Der Compiler weiß ja nicht in welcher Reihenfolge welche Funktionen wie 
aufgerufen werden. Dazu müsste er einen Testlauf simulieren um 
rausfinden zu können, wieviel Speicher das Programm dann letztendlich 
zur Laufzeit belegt.

Solange diese künstliche Intelligenz aber nicht vorhanden ist, kannst du 
nach der Heuristik vorgehen: Größere Speicherallokierungen nicht als 
funktionslokale Variablen ausführen, sondern modulglobal (also mit 
static im File) oder überhaupt global (auch wenn das Zähneknirschen 
verursacht). Nur dann hast du eine Chance, dass die Memory-Statistik zum 
Schluss wenigstens in etwa dem tatsächlichen Speicherverbrauch 
entspricht.

Autor: Jörn A. (joern_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok vielen Dank. werde ich testen

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.