Ich habe einige Probleme mit einem Projekt, das ich mache. Ich kenne die Theorie des Zeigers/Arrays/Referenzen und sollte wissen, wie das geht. Trotzdem habe ich jetzt zwei Tage ohne Fortschritte verbracht. Ich wäre sehr dankbar. Ich erhalte die Daten über SPI. Die Daten werden dann in einem Puffer gespeichert (INT32_T -Puffer [1024 oder 2048]). Es gibt einen Zähler, der von 0 bis zur Puffergröße 1 zählt und die Stelle bestimmt, an der der Datenpunkt gespeichert ist. Derzeit erhalte ich ein Testsignal, das intern vom UC < /p>
generiert wird//ch1: receive 24 bit data in 8 bit chunks -> store in an int32_t
ch1=ch1|(SPI.transfer(PIN_CS, 0x00, SPI_CONTINUE)8;
ch1=ch1|(SPI.transfer(PIN_CS, 0x00, SPI_CONTINUE)8;
ch1=ch1|(SPI.transfer(PIN_CS, 0x00, SPI_CONTINUE)8;
if(Not Important){
_ch1Buffer[_ch1SampleCount] = ch1;
_ch1SampleCount++;
if(_ch1SampleCount>SAMPLE_BUFFER_SIZE-1) _ch1SampleCount=0;
}
< /code>
Dies ist ständig aktiv. Da ich Rohdaten für die Signalverarbeitung benötige und der Puffer von der ISR geändert wird, wenn ein neuer Datenpunkt verfügbar ist, möchte ich Teile des Puffer in einen temporären "Speicher" kopieren. In der Mainloop erhalte ich, wenn der Zähler eine bestimmte Größe erreicht, einige der Pufferdaten (ca. 30 Proben). < /P>
Die Methode erfasst die aktuelle Position im Puffer:'int ch1Pos = _ch1SampleCount;'
< /code>
Und dann versuche ich, Memcpy zu verwenden, um meine Samples zu erhalten. Abhängig von der Position im Puffer muss es einen "Wrap-Around" geben, um den vollständigen Satz von Proben zu erhalten: < /p>
if(ch1Pos>=(RAW_BLOCK_SIZE-1)){
memcpy(&ch1[0],&_ch1Buffer[ch1Pos-(RAW_BLOCK_SIZE-1)] , RAW_BLOCK_SIZE*sizeof(int32_t));
}else{
memcpy(&ch1[RAW_BLOCK_SIZE-1 - ch1Pos],&_ch1Buffer[0],(ch1Pos)*sizeof(int32_t));
memcpy(&ch1[0],&_ch1Buffer[SAMPLE_BUFFER_SIZE-1-(RAW_BLOCK_SIZE- ch1Pos)],(RAW_BLOCK_SIZE-ch1Pos)*sizeof(int32_t));
}
< /code>
_ch1buffer ist der Puffer, der die Rohdaten enthält. /> ch1pos ist die Position des letzten Datenpunkts, das aus dem ISR zum Zeitpunkt geschrieben wurde, wo diese Methode < /li>
< /ul>
Technisch gesehen wird. Technisch bin ich mir der Anforderungen bewusst, aber anscheinend ist das nicht genug. Das Problem ist, dass dies bei den extrahierten Proben nicht der Fall ist. Es gibt viele Spikes in den Daten, die darauf hinweisen, dass ich etwas gelesen habe, das ich nicht lesen sollte. Das obige Code -Beispiel ist eine Version von vielen, und während Sie dies lesen, bin ich sicher, dass ich alles wieder geändert habe. Dies ist der aktualisierte Code für den MemcPy -Teil: < /p>
if(ch1Pos>=(RAW_BLOCK_SIZE-1)){
memcpy(&ch1[0],&_ch1Buffer[ch1Pos-(RAW_BLOCK_SIZE-1)] , RAW_BLOCK_SIZE*sizeof(int32_t));
}else{
memcpy(&ch1[RAW_BLOCK_SIZE-1-ch1Pos],&_ch1Buffer[0],(ch1Pos+1)*sizeof(int32_t));
memcpy(&ch1[0],&_ch1Buffer[SAMPLE_BUFFER_SIZE-(RAW_BLOCK_SIZE-1-ch1Pos)],(RAW_BLOCK_SIZE-1-ch1Pos)*sizeof(int32_t));
}
}
< /code>
Dies hat es bereits viel besser gemacht. Aus all den Veränderungen wurde alles irgendwie durcheinander. Jetzt gibt es nur einen Fehler.
Es gibt eine periodische Spitze. Ich werde versuchen, mehr Informationen zu erhalten, aber ich denke, es ist ein falscher Zugriff, während ich mich umwickelte. /> Bearbeiten II < /strong>
, um die Fragen von @David Schwartz zu beantworten: < /p>
spi.Transfer gibt ein einzelnes Byte zurück < /li>
Der Puffer wird einmal bei Startup initialisiert: memset (_ch1buffer, 0, sizeof (int32_t)*sample_buffer_size); < /code> < /li>
< /ul>
Bearbeiten III < /strong>
sorry. CH1POS: 'int ch1pos = _ch1sampleCount;'
Jetzt gibt es nur einen periodischen "Spike" (falscher Wert). Es muss etwas mit dem Befehl geteiltem memcpy sein. Ich werde weiter suchen. Wenn jemand eine Idee hat ...
Richtige Verwendung von Memcpy ⇐ C++
-
- Similar Topics
- Replies
- Views
- Last post