www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Ring-Puffer Indexierung


Autor: S. Leven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag,
könnte mir jemand einen Tip geben, warum zwischen den folgenden beiden
Code-Versionen für eine Ring-Puffer-Implementierung (dsPic30F6014, C30)
ein Unterschied sein könnte:

//defines und deklarierte Variablen
..
#define rvmask 15
unsigned int rxbuf[rvmask+1];
unsigned char rxbufp=0;
unsigend int rxr;
..

//Code-Version 1:
..
rxbufp = (rxbufp++)&rvmask;
rxr = rxbuf[rxbufp];
..

//Code-Version 2:
..
rxbufp++;
rxbufp = rxbufp&rvmask;
rxr = rxbuf[rxbufp];
..

Die zweite Code-Version funktioniert einwandfrei, während bei der
ersten die Maskierung von rxbufp überhaupt nicht funktioniert und der
Ring-Puffer-Indexierung fehlschlägt. rxbufp wird nicht wieder auf Null
gebracht beim überschreiten von rvmask (erst beim char-overflow von
255->0 wird der Wert automatisch wieder Null).

Wieso das? Hat jemand eine Idee. Vielen Dank.
S. Leven

Autor: programinator (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ist nur ne Vermutung also nicht festnageln.
versuch mal: rxbufp = (++rxbufp)&rvmask;
Nicht dass dein Compiler mit dem Pre- und Postincrement durcheinander
kommt...

Autor: guelcki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso durcheinander kommt?
Es wäre doch schlimm, wenn bei beiden das gleiche passiert. Dann wäre
der Compiler durcheinander!
Das ist doch ein Postinkrement. Also ist es vollkommen klar, dass bei
beiden Codeschnippseln nicht das gleiche raus kommt.

Autor: programinator (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich könnte mir allerdings vorstellen, dass durch die Klammerung das
Inkrement vorgezogen wird, also wie ein Preincrement behandelt wird

Autor: guelcki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nö, die Klammerung beschreibt nur einen Token, der vorher auch schon nur
 ein Token war. Der Rückgabewert ist rxbuffp (vor inkrementierung).

Autor: Kleiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In den Codeschnipseln werden tatächlich zwei verschiedene Dinge
durchgeführt. In

rxbufp = (rxbufp++)&rvmask;

ist ein Postincrement von rxbufp vorgesehen. D.h. rxbufp wird erst nach
der Verwendung seines Wertes (für ... & rvmask)erhöht.

rxbufp++;
rxbufp = rxbufp&rvmask;

Aber entspricht eher einem Preincrement von rxbufp, also

rxbufp = (++rxbufp)&rvmask;

Prinzipiell wäre ich aber wegen der undefinierten
Abarbeitungsreihenfolge in C mit solchen Konstrukten (zuweisung einer
incrementierten Variablen an sich selbs) vorsichtig.
(siehe: http://de.wikibooks.org/wiki/C-Programmierung:_Operatoren unter
"Rangfolge und Assoziativität")

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, es ist eigentlich ganz einfach: Konstruktionen wie

          variable = variable++;
und
          variable = ++variable;

sind laut C-Standard schlichtweg undefiniert.

D.h. der Compiler darf dabei den größten Mist machen, wie er will. Das
Spektrum reicht von ignorieren über warnen bis zum fehlerhaften Code
erzeugen.

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso, was Du eigentlich willst, ist:

  index = (index+1) & maske;

oder:

  index++;
  index &= maske;

oder, viel flexibler:

  index = index < maximum ? index+1 : 0;

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.