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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren