Forum: Mikrocontroller und Digitale Elektronik 1kB in Atmega holen, wie am besten intern verwalten?


von g_reichert (Gast)


Lesenswert?

Hallo,

ich programmieren hin und wieder in C mit dem AVR Studio.

Im Moment arbeite ich an einer Anwendung, bei der über einen Port 
parallel Byte für Byte 1kB Daten hereingeholt werden soll.

So weit so gut.

Die Daten sollen aber temporär im Atmega (derzeit 644 aber Umzug auf 
1284 geplant) gespeichert und weiterverarbeitet werden.

z.B. so, dass immer nur jedes dritte Byte gelesen wird.

Frage - wie macht man diese 1kB am besten handhabbar?
Mit einem Variablen-Array (das geht bei 1kB wahrscheinlich gar nicht?!)?
Daten im EEPROM speichern?
Daten im SRAM ablegen?

Dabei ist zu bedenken, dass das eine kB eventuell noch umgerechnet 
werden muss, die Rohdaten sollen dabei erhalten bleiben. Dann müsste man 
also 2kB verwalten können.

Und relativ schnell soll es auch noch gehen. Eventuell wäre das EEPROM 
zu langsam.

Wie würdet ihr das lösen?

von Karl H. (kbuchegg)


Lesenswert?

g_reichert schrieb:

> Die Daten sollen aber temporär im Atmega (derzeit 644 aber Umzug auf
> 1284 geplant) gespeichert und weiterverarbeitet werden.

der 644 hat 4kB SRAM.

So weit so gut.

> Frage - wie macht man diese 1kB am besten handhabbar?
> Mit einem Variablen-Array (das geht bei 1kB wahrscheinlich gar nicht?!)?

Warum soll das nicht gehen?
Du hast 4kB SRAM, 1 kB benutzt du für das Array, in dem du die 
eingehenden Bytes speicherst. Bleiben noch 3kB für die restliche 
Programm-Benutzung. Normalerweise mehr als ausreichend.

> Daten im SRAM ablegen?

Ähm.
SRAM ist genau der Speicher, in dem Variablen vom Compiler angelegt 
werden.

> Dabei ist zu bedenken, dass das eine kB eventuell noch umgerechnet
> werden muss, die Rohdaten sollen dabei erhalten bleiben. Dann müsste man
> also 2kB verwalten können.

Kommt drauf an.
Was soll dann weiter mit den Daten passieren und vor allen Dingen wie 
schnell?

Irgendwas wird ja weiter damit passieren, zb. irgendwo ausgeben. Dann 
hängt es davon ab, wie schnell ausgegeben werden muss bzw. wie aufwändig 
die Umrechnung ist. Wenn das alles im Rahmen ist, kann man die 
Umrechnung auch direkt in die Ausgabe integrieren. Dann muss man die 
umgerechneten Werte unter Umständen überhaupt nicht speichern.

Aber selbst wenn.
Dann verbrauchst du eben 2kB für die Daten. Na und? Bei verfügbaren 4kB 
sollte das noch immer kein Problem sein, wenn du nicht anderweitig im 
Programm auch noch urrast.

> Wie würdet ihr das lösen?

Ohne das du etwas konkreter wirst, was denn diese Daten überhaupt sind, 
bzw. worum es überhaupt geht, kann man da recht wenig sagen.
'One size fits all' funktioniert bei Basballkappen, aber selten in der 
Programmierung. Daher ist es auch so wichtig, dass man im Zuge seiner 
Ausbildung x verschiedene Varianten kennen lernt, damit man im 
Einsatzfall unter einer Reihe von tauglichen Varianten wählen kann, 
während man die, die im konkreten Fall nicht Erfolg versprechend sind, 
gleich von vorne herein ausschliesst. Profis beherrschen schliesslich 
nicht nur ihre Programmiersprache, sondern haben auch einen ganzen Sack 
voll Standardverfahren jederzeit abrufbereit im Kopf parat - unter 
anderem deswegen dauert es ja auch Jahre, bis man wirklich gut wird. Wie 
beim Schachspiel, bei der die "Sprache" (welche Figur kann wie ziehen) 
den geringsten Teil eines guten Spielers ausmacht.

: Bearbeitet durch User
von g_reichert (Gast)


Lesenswert?

Danke für die schnelle Antwort!

Wie gesagt programmiere ich nur hin und wieder.

Es geht um die graphische Darstellung von Messwerten.

Karl Heinz schrieb:
> Warum soll das nicht gehen?
> Du hast 4kB SRAM, 1 kB benutzt du für das Array, in dem du die
> eingehenden Bytes speicherst. Bleiben noch 3kB für die restliche
> Programm-Benutzung. Normalerweise mehr als ausreichend.
>
>> Daten im SRAM ablegen?
>
> Ähm.
> SRAM ist genau der Speicher, in dem Variablen vom Compiler angelegt
> werden.

Das klingt ja supi!
Hätte gedacht, dass man nur eine begrenzte Anzahl an Variablen verwenden 
kann.

Dann werde ich es mit einem Array machen.

Karl Heinz schrieb:
> Wenn das alles im Rahmen ist, kann man die
> Umrechnung auch direkt in die Ausgabe integrieren.

Das ist auf jeden Fall eine Überlegung wert! Werde das mal näher 
überdenken, könnte glatt funktionieren.

Danke für den Tipp und die Idee!!!

von Karol B. (johnpatcher)


Lesenswert?

g_reichert schrieb:
> Mit einem Variablen-Array (das geht bei 1kB wahrscheinlich gar nicht?!)?

Wobei man hier unterscheiden muss zwischen Arrays fester Größe (das was 
du vermutlich meinst) und "dynamischen" Arrays, die erst zur Laufzeit 
angelegt werden und damit eine Speicherverwaltung notwendig machen.

Ansonsten lässt sich deine Frage nur bedingt sinnvoll beantworten, da 
wir nicht wissen, um was für Daten es sich handelt (interne Struktur), 
in welcher Regelmäßigkeit diese Auftreten und was mit diesen überhaupt 
geschehen soll. All das sind Kriterien, die die Wahl der Verwaltung 
massiv beeinflussen und nicht ohne Grund gibt es hier unzählige 
Möglichkeiten, die oft einen Kompromiss aus benötigtem Speicher, Zeit 
und Einfachheit darstellen.

g_reichert schrieb:
> Hätte gedacht, dass man nur eine begrenzte Anzahl an Variablen verwenden
> kann.

Das einzige Limit ist im Prinzip der zur Verfügung stehende Speicher, 
wobei man den Stack nicht vergessen sollte, der von "oben" herunter 
verläuft.

Mit freundlichen Grüßen,
Karol Babioch

: Bearbeitet durch User
von TriHexagon (Gast)


Lesenswert?

g_reichert schrieb:
> Hätte gedacht, dass man nur eine begrenzte Anzahl an Variablen verwenden
> kann.

Du scheinst eine vollkommen falsche Vorstellung davon zu haben.

Ein Array -> eine Variable (egal ob 1 Byte oder 1kB)

Es gibt keine begrenzte Anzahl von Variablen ("Variablen" kennt die CPU 
nicht einmal). Es gibt nur eine begrenzte Größe an Speicher.

von g_reichert (Gast)


Lesenswert?

danke für die Antworten!

Karol Babioch schrieb:
> Wobei man hier unterscheiden muss zwischen Arrays fester Größe (das was
> du vermutlich meinst) und "dynamischen" Arrays, die erst zur Laufzeit
> angelegt werden und damit eine Speicherverwaltung notwendig machen.

Genau, ich meine ein Array fester Größe.

Wie gesagt kommt immer mal wieder (alle paar Sekunden) ein 1kB 
(Messwertserie) rein, wird gespeichert, umgerechnet und dann graphisch 
dargestellt. Die Umrechnung selber ist ganz unkompliziert.

von Andreas B. (bitverdreher)


Lesenswert?

g_reichert schrieb:
>
> Wie gesagt kommt immer mal wieder (alle paar Sekunden) ein 1kB
> (Messwertserie) rein, wird gespeichert, umgerechnet und dann graphisch
> dargestellt. Die Umrechnung selber ist ganz unkompliziert.

Ich würde mir mal Gedanken darüber machen, wieviel Speicher Du noch zur 
graphischen Darstellung der Daten benötigst.

Gruß
Andreas

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.