www.mikrocontroller.net

Forum: Compiler & IDEs memcpy für überlappende Speicherbereiche?


Autor: Billy __ (slowflyer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte eine soweit wie möglich speicherschonende Möglichkeit 
überlappende Speicherbereiche zu verschieben. Dabei wird immer von 
hinten nach vorne verschoben, sprich:

Speicherzelle: 0123456789...
Wert:          abcdefghij...

nach Verschiebung

Speicherzelle: 0123456789...
Wert:          efghijklmn...

Wie mache ich das jetzt am besten?

1. eigene Kopierroutine schreiben, die das kann
2. verwenden von memcpy (weil nur von hinten nach vorne kopiert wird, 
würde das funktionieren?)
3. verwenden von memmove (benötigt memmove nicht zusätzlichen Speicher 
für eine Zwischenkopie und wäre somit speicherhungriger?)

Ach ja, Controller ist ein AVR32 (32Bit) mit AVR32-Studio

Schon mal Danke für die Hinweise, die da kommen mögen

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
William K. schrieb:

> (benötigt memmove nicht zusätzlichen Speicher
> für eine Zwischenkopie und wäre somit speicherhungriger?)

Nein, memmove entscheidet anhand der Art der Überlappung die Richtung, 
in der kopiert wird.

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder ein anderes Konzept.

Irgend wie hört sich dein Thred so an, als ob Du einen Ringpuffer 
verwenden könntest.

Volker

Autor: Billy __ (slowflyer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Nein, memmove entscheidet anhand der Art der Überlappung die Richtung,
> in der kopiert wird.

Das würde die Entscheidung erleichtern: memmove

Autor: Billy __ (slowflyer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Volker Zabe schrieb:
> Irgend wie hört sich dein Thred so an, als ob Du einen Ringpuffer
> verwenden könntest.

Ne, kein Ringpuffer, es werden einfach nur Bereiche gelöscht und alles 
was dahinter liegt nach vorne verschoben

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also einen halben Ringpuffer (nur den Ausgang)?
Es ist effektiver einen Pointer hoch zusetzen als Speicher zu 
verschieben.
char buffer[200];
.
.
memmove(buffer,buffer+5,100);    // Verschieben A
.
char *ptr=buffer;
ptr += 5;                  // "Verschieben" B
.
.
x = buffer[0];    // Zugriff A
x = ptr[0]        // Zugriff B

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
William K. schrieb:
> Ne, kein Ringpuffer, es werden einfach nur Bereiche gelöscht und alles
> was dahinter liegt nach vorne verschoben
Genau das macht ein Ringpuffer auch. Nur ohne irgendwas verschieben zu 
müssen (Ausser den Zeiger auf den Anfang).
Solange immer nur 'vorne' oder 'hinten' gelöscht wird kann das also eine 
sehr effektive Art der Speicherung sein.
Ob Du jetzt ein lineares Array benutzt oder einen Ringpuffer hängt davon 
ab wie oft Du auf einen Wert der nicht am Anfang liegt zugreifst, und 
wie oft etwas gelöscht wird. Bei viel häufigeren Zugriffen auf Werte die 
nicht am Anfang oder Ende stehen, wird die Performance wegen der nötigen 
Adressberechnung mit Prüfung der hinteren Grenze langsamer.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Ringpuffer hat den Nachteil, daß er mitten im Datenfeld überlaufen 
kann.
Dann guckt z.B. ein strcmp ganz schön blöd aus der Wäsche.
Oder man schreibt sich alle Parserfunktionen selber als Wrap-Around 
fest.

Ein Verschieben des nächsten Records an den Anfang ist also ne clevere 
Idee.


Peter

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Ein Verschieben des nächsten Records an den Anfang ist also ne clevere
> Idee.

Halte ich in diesem Thred nicht für Richtig.

William schrieb ja, das er nur Entleeren möchte. So kann erstmal kein 
Wrap-Around enstehen.

Er hat auch nichts von Stringverarbeitung geschrieben,das ein Speicher 
ohne Wrap-Around erforderlich macht. Ok, sein Beispiel war mit 
Buchstaben.

Wie meist fehlen noch wichtige Information, um diese Frage 
(Zeiger/Verschiebung?) eindeutig beantworten zu können.

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Ein Ringpuffer hat den Nachteil, daß er mitten im Datenfeld überlaufen
> kann.
> Dann guckt z.B. ein strcmp ganz schön blöd aus der Wäsche.

Hmm, Peter weisst Du etwas was ich nicht weiß :-)
ich hatte geschrieben, daß es dann unvorteilhaft wird, wenn man öfter 
auf Daten zugreifen muß, die nicht am Anfang oder Ende stehen.
Wenn Stringfunktionen im Puffer benutzt werden sollen gehts natürlich 
nicht wegen wrap around, dazu müsste man sich den String erst 
rauskopieren.
Aber ich (und Volker wohl auch) hatten etwas die Vermutung, daß das eine 
Art FIFO werden soll, deshalb der Hinweis auf Ringpuffer.

Autor: Billy __ (slowflyer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Ringpuffer nützt mir nichts, da nicht nur am Anfang gelöscht wird, 
sondern auch Teile mittendrin gelöscht bzw. "ausgeschnitten" werden.

>Wie meist fehlen noch wichtige Information, um diese Frage
>(Zeiger/Verschiebung?) eindeutig beantworten zu können.

Siehe meine Eingangsfragen, da wusste ich noch nicht, dass jemand mein 
Konzept in Frage stellt. Fragt und ich antworte, genau so wie ihr 
antwortet, wenn ich frage.

Achso es sind keine Strings

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

Bewertung
0 lesenswert
nicht lesenswert
William K. schrieb:

> Siehe meine Eingangsfragen, da wusste ich noch nicht, dass jemand mein
> Konzept in Frage stellt.

Es ist sehr oft der Fall, dass es 2 Möglichkeiten gibt

* entweder man beantwortet eine Frage buchstabengemäss.
  Dann hat der Fragesteller seine Antwort

* oder aber man überlegt sich, ob hinter der Frage nicht mehr stecken
  könnte. Ob zb die Frage nur dadurch entsteht, dass ein ungeschicktes
  Konzept angewendet wird.
  In dem Fall ist dem Fragesteller dann oft besser geholfen, wenn man
  ihm zeigt, wo sein Konzept fraglich ist und wie man das besser machen
  kann

Als Analogie:
Wenn die Frage lautet: An welchem Ende greife ich eine Schaufel an?
Dann kann man natürlich sagen: Das Blech kommt nach unten und der Stil 
nach oben.
Man kann natürlich auch (aus dem schmückenden Beiwerk der Frage) 
schliessen, dass er die Baugrube für ein Haus ausheben will. Dann ist 
ihm mit 'Bestell dir einen Bagger' besser geholfen. Nur weil er bisher 
nicht wusste, dass es so etwas wie einen Bagger gibt, muss man ihn ja 
nicht mit einer Schaufel wissentlich wochenlang im Erdreich wühlen 
lassen.


Nun ist es so, dass man in der Informatik Daten nur ungerne im Speicher 
rumkopiert. Wenn irgendmöglich (und natürlich sinnvoll) vermeidet man 
das und sucht sich lieber Organisationsstrukturen bei denen das nicht 
notwendig ist. Von daher war es relativ naheliegend mal nachzufragen, 
was denn die Aufgabe von einer höheren Warte aus gesehen darstellt.

Autor: Billy __ (slowflyer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger

Ich versuch mal das Ziel zu umreissen:

Es werden Daten seriell abgeholt und in einen Speicherbereich 
geschrieben. Der User modifiziert die Daten und schickt diese zurück. 
Modifizieren heißt hier unter anderem Löschen und Einfügen von Daten und 
das an beliebiger Stelle.

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.