Forum: Mikrocontroller und Digitale Elektronik RAM zu klein, gibt es Programmiertricks


von Hannes (Gast)


Lesenswert?

Hallo zusammen,

ich bekomme von einen Sensor Messdaten, 2x 300ter-BYTE-Array, diese will 
ich verarbeiten. Habe einen 1KB - RAM µC. Die Arrays müssen leider so 
groß sein. Ich speichere die Messdaten, verarbeite sie (aus diesen 
Messdaten 2 x 50-BYTE-Array) und verwerfe sie.
Kann ich irgendwie mit malloc, free arbeiten?

Habe ja eigentlich schon 700 Byte verbraten durch
BYTE Messdaten[300]
BYTE Timer[300]
BYTE Messdaten_weitere_Analyse[50]
BYTE Timer_weitere_Analyse[50]

Vielen Dank im voraus!!

Gruß

von Frank B. (f-baer)


Lesenswert?

Kannst du die Daten für die weitere Analyse möglicherweise im selben 
Array speichern? Damit sparst du schonmal 100 Byte.

von MaWin (Gast)


Lesenswert?

> Kann ich irgendwie mit malloc, free arbeiten?

Ungünstig, da kann es klemmen obwohl noch genug Speicher da ist.

Da deine Maximalgrössen bekannt sind, kannst du statisch allokieren
(Variablenarrays static definieren).

Da ein einzelner Datensatz nicht zu gross ist, es passen sogar 2 rein,
geht es nur um den passenden Algorithmus, die Reihenfolge der 
Verarbeitung.

Da lernt man verschiedene Lösungsmöglichkeiten im Informatikstudium. Du 
kannst jetzt nicht erwarten, daß andere dir in einem Satz sagen, was sie 
in jahren lernen.

von Johann (Gast)


Lesenswert?

Reichlich konfus und unvollständig, was Du da schreibst. Mit solchen 
Angaben kann man nicht viel anfangen. Aber eine Frage sei erlaubt: wie 
kann man mit den Timerwerten, die ja 300 Stück sind, etwas anfangen, 
wenn sie nur 1 Byte groß sind, d.h. Wertebereich 0-255? Andere Frage: 
warum ordnest Du nicht einfach die 50 Werte, die Du brauchst, im 300er 
Array um? Dann brauchst Du die 50er Arrays nicht anlegen.

von Frank B. (f-baer)


Lesenswert?

Johann schrieb:
>  Wertebereich 0-255?

8-Bit-Float? SCNR...

von Uwe (Gast)


Lesenswert?

Wie werden die Messdaten denn Verarbeitet ? Vieleicht sind dort 
Optimierungen möglich. Ich nehme z.B. mal an das NICHT der 1. und letzte 
Messwert verrechnet werden müssen ? oder doch ? vile sachen kann mann 
wärend der Messwertaufnahme machen bzw. zwischen den einzelnen 
Messpunkten wenn man dvon ausgeht das du auch später das Array Punkt für 
Punkt Sequentiel verarbeitest. doof wirds nur wenn du tatsächlich den 
z.B. den ersten und den Letzten aufgenommen Wert verrechnen mußt.
Mehr infos wären hilfreich.

von Nepthamuk (Gast)


Lesenswert?

Wenn es einen "Programmiertrick" gibt, hängt er sehr stark von dem 
Verarbeitungsalgorithmus und der Art und Weise wie die Daten 
hereinkommen und wie sie ausgegeben werden ab.

Ein Ansatzpunkt wäre sich den Verarbeitungsweg mal Schritt für Schritt 
anzuschauen und den frühesten Zeitpunkt festzustellen, an dem ein 
Ausgabewert fertig ist und verworfen werden kann. Dabei auch 
durchdenken, ob Eingabe und Verarbeitung miteinander verwoben werden 
können.

Falls Du das selbst nicht hinbekommst, musst Du hier wohl den Ein-, und 
Ausgabeprozoess und die Verarbeitung dazwischen im Detail beschreiben.

von Tip (Gast)


Lesenswert?

@Hannes
Wenn alles so wie in deinem Start-Post beschrieben festliegt, hilft nur 
ein größerer uC. Wenn du verrätst, was du für Daten hast, wie schnell 
die eingelesen werden und was am Ende herauskommen soll, ließe sich über 
eine alternative Lösung Nachdenken.

von Peter D. (peda)


Lesenswert?

Hannes schrieb:
> Habe ja eigentlich schon 700 Byte verbraten durch
> BYTE Messdaten[300]
> BYTE Timer[300]
> BYTE Messdaten_weitere_Analyse[50]
> BYTE Timer_weitere_Analyse[50]

Entweder mach die Felder kürzer oder nimm mehr RAM (z.B. ATmega328: 2kB, 
ATmega1284: 16kB).


Hannes schrieb:
> Kann ich irgendwie mit malloc, free arbeiten?

Nö, das braucht sogar noch mehr Speicher für seine Verwaltung.


Peter

von Vlad T. (vlad_tepesch)


Lesenswert?

brauchst du die Timerwerte wirklich?
Meist ist die Auslesefrequenz doch fix

Je nach Entropie der Messwerte könnte man diese auch live komprimieren.
Huffman mit dynamischen Baum.
Wobei die Frage ist, ob sich dass für die paar Byte lohnt.

Halt der übliche Trade-Off: Rechenzeit <-> Speicher

von Thomas E. (thomase)


Lesenswert?

Hannes schrieb:
> Habe ja eigentlich schon 700 Byte verbraten durch

Wo ist denn jetzt bei 1K das Problem? Sind doch immer noch 324 Byte 
frei.
Das ist mehr als mancher Controller insgesamt hat.

Bei 980 Byte würde ich langsam einen Kopf machen, aber...

Aber beschreib' mal genau, was du vorhast. Meistens lässt sich da schon 
was optimieren oder mit geringen, nicht relevanten, Verlusten 
verringern.

mfg.

von Vlad T. (vlad_tepesch)


Lesenswert?

Vlad Tepesch schrieb:
> Wobei die Frage ist, ob sich dass für die paar Byte lohnt.

Hab nochmal nachgedacht:
bei 300 eher nicht, dass ist ja nur geringfüg mehr, als du mögliche 
Eingabewörter hast. das lohnt sich dann nur, wenn die Zahl der 
tatsächlichen verschiedenen Werte sehr gering ist und die auch nicht 
gleichverteilt sind
Aus dem Bauch geschätzt max 64

von Vlad T. (vlad_tepesch)


Lesenswert?

Thomas Eckmann schrieb:
> Wo ist denn jetzt bei 1K das Problem? Sind doch immer noch 324 Byte
> frei.

vielleicht braucht die Berechnung ja auch noch etliches an Platz auf dem 
Stack.
Wobei 300 freie Byte schon recht viel sind. Aber spätestens bei 150Byte 
würde ich mir Sorgen machen und die Programmpfade mit dem größten Stack 
ermitteln

von Thomas E. (thomase)


Lesenswert?

Vlad Tepesch schrieb:
> vielleicht braucht die Berechnung ja auch noch etliches an Platz auf dem
>
> Stack.

Bringt nichts, hier zu theoretisieren oder die RAM-Alarmschwelle zu 
verschieben. Ohne konkrete Aufgabenstellung bleibt das 
Kaffeesatzleserei.

mfg.

von Falk B. (falk)


Lesenswert?

@  Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)

>verschieben. Ohne konkrete Aufgabenstellung bleibt das
>Kaffeesatzleserei.

Das ist doch die Lieblingsbeschäftigung des Forums . . .

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Thomas Eckmann schrieb:
> Kaffeesatzleserei
Wobei 'Kaffeesatzleserei' immerhin noch etwa 17mal reinpassen würde in 
die verbliebenen 300 bytes;)

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.