Forum: Compiler & IDEs Probleme beim Ptr Zugriff in C


von Fragender in C (Gast)


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
}

von (prx) A. K. (prx)


Lesenswert?

Der komplette innere Schleifencode wird durch die äussere Schleife bis 
zu 3x durchlaufen. Der Index s fängt immer bei 0 an. Der Pointer jedoch 
nicht.

: Bearbeitet durch User
von Fragender in C (Gast)


Lesenswert?

Danke! Das Problem saß wie immer vor dem Bildschirm. Dummer 
Programmierfehler...

von (prx) A. K. (prx)


Lesenswert?

NB: Die Zeiten als *p++ effizienter als p[i++] war sind lange vorbei. 
Index-Schleifen sind Routine für gute Compiler und werden passend 
optimiert.

von Fragender in C (Gast)


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.!

von Fragender in C (Gast)


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++!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.