Mega32 & große Arrays Probleme & undefinierter Absturz

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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.