Probleme beim Ptr Zugriff in C

Gast #4273584
Lesenswert?
• ▲
▼
Hallo,

ich habe ein Problem mit einem Ptr Zugriff. Das ganze stammt aus einem
Code um Audio Samples auf einem STM32F4 mit Codec abzuspielen.
Es werden drei Samples ausgelesen und aufaddiert.

Das Problem ist nun, dass der Zugriff mittels Array (also der
nicht auskommentierte "audiobuf[s] += ..." funktioniert, die Samples
werden sauber gespielt. Verwende ich aber den Ptr Zugriff, also
"*audiobuf++ = ...", dann werden die Samples verzerrt. Funktional sehe 
ich zwischen beiden Varianten keinen Unterschied, also muss ich etwas 
übersehen. Aber was?
Ebenso bringt ein
1
  *audiobuf = *audiobuf + (int16_t) sample;
2
  audiobuf++;
nichts. Ist eh m.E. funktional identisch mit "*audiobuf++ += ..."

Ja, der Optimierer ist an. arm-gcc, -O2. Aber auch ein -O0 macht keinen
Unterschied. Was übersehe ich?
1
static void PlaySamples(int16_t *audiobuf)
2
{
3
  for (int i=0; i<3; i++) 
4
  {
5
    if (inst[i].running == 1) 
6
    {
7
      for (int s=0; s < AUDIO_BLOCK_SAMPLES; s += 2) 
8
      {
9
        int32_t sample = ((int32_t) inst[i].samples[inst[i].pos++] * inst[i].volume/255 / 2 );
10
        
11
        // Frist Sample is left channel
12
        audiobuf[s] += (int16_t) sample;
13
        //*audiobuf++ += (int16_t) sample;
14

15
        // Second Sample is right channel
16
        audiobuf[s+1] += (int16_t) sample;
17
        //*audiobuf++ += (int16_t) sample;
18

19
        if (inst[i].pos >= inst[i].length) {
20
          inst[i].running = 0;
21
          inst[i].pos = 0;
22
          break;
23
        }    
24
      }
25
    }    
26
  }
27
}
Gast #4273998
Lesenswert?
• ▲
▼
Trotz -O2 ist die Ptr Variante ein bisschen schneller als die Index 
Variante. Da das Programm noch mehr machen soll (Softsynth) kann ich 
jeden freien Taktzyklus noch gebrauchen...

Danke nochmal an A.K.!
Gast #4274010
Lesenswert?
• ▲
▼
A. K. schrieb:
> Die Zeiten als *p++ effizienter als p[i++] war sind lange vorbei.

Ja, das glaube ich auch. Aber ich mache ja zwei Array Zugriffe. Einmal 
buf[s] und dann buf[s+1]. Da sind dann zwei *buf++ etwas schneller.
Aber: Ich probiere mal 2xbuf[s++] und nehme das s +=2 aus der for 
Schleife raus. Das müsste dann an die Ptr Variante rankommen.

[Moment...]

Nee, ist immer noch langsamer. Muss mir bei Gelegenheit mal den 
Assemblercode anschauen. Also bleibe ich erstmal bei *buf++!

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.