Forum: Compiler & IDEs STM32F7 GCC Speicherzugriff Optimierung


von Paul (Gast)


Lesenswert?

Hallo,
Ich spiele grade an einem einfachen Ringbuffer auf einem STM32F7 rum.
Hierbei habe ich festgestellt das der Mikrocontroller ein enorm hohen 
Teil (ca 50%) meiner "Rechenzeit" mit dem auslesen aus dem Buffer 
beschäftigt ist.
Die aufzurufende Funktion gibt einen wert aus mit einem delay zurück und 
sieht folgendermaßen aus:

#define BUFFER_SIZE 11499

float RingBufferDelay(int delay)
{
  int offset = 0;
  if (delay< 0)
    offset = buffer.write + delay- 1;
  else
    offset = buffer.write - delay- 1;

  while (offset < 0) offset += BUFFER_SIZE;
  return data[channel][offset];
}


buffer ist ein Struct mit "read" und "write" für die entsprechenden 
Counter.

Die Funktion wird pro Rechenzyklus 3 mal (direkt hintereinander) mit 
unterschiedlichen delay angaben aufgerufen.

Den Daten cache vom chip habe ich bereits aktiviert.

Beste Grüße
Paul

von Dr. Sommer (Gast)


Lesenswert?

Du hast da halt eine relativ komplexe Funktion geschrieben. Die braucht 
halt Zeit. Die while-Schleife kannst du durch modulo einsparen. Benutzt 
du die FPU? Sind die Daten wenigstens im DTCM?
Mach dir besser mal Gedanken ob du die Funktion seltener aufrufen 
kannst. Wenn du zB die Funktion 10x hintereinander mit ähnlichen delays 
aufrufst, brauchst du nicht jedes Mal die ganze Rechnung zu machen. 
Kommt halt drauf an wie die Funktion genutzt wird.

von hust (Gast)


Lesenswert?

der M7 ist da etwas komplizierter
siehe memoryinterface


versuch zeitkritische daten ( Stack usw) im DTCM abzuladen
das ist der schnellste im system

die buffer funktionen sofern sie oft aufgerufen werden in den ITCM RAM 
ablegen
( 16k section im linker file , zuweisen mit _attribute_section
und in der Systeminit()  die daten vorher in den ITCM laden
( abgucken vm BSS segment )

dann dauert alles nur wenige takte


wenn der buffer auf dem 240kb SRAM liegt ... dauern selbst hier nrmale 
zugriffe mehrere takte

der M7 ist ein rechenschwein.. möchte es aber auch gut serviert bekommen



Ich habe mit RTOS zB
16Kb SRAM2   für ethernet
240K Ram für statischen RAM und buffer
64KB DTCM  für glbalen Stack und RTOS Stack/ dynamic heap
16kb ITCM  RAM für funktionen die rechenpower brauchen ( audio/video 
verarbeitung )

von Eric B. (beric)


Lesenswert?

Paul schrieb:
> float RingBufferDelay(int delay)
> {
>   int offset = 0;
>   if (delay< 0)
>     offset = buffer.write + delay- 1;
>   else
>     offset = buffer.write - delay- 1;
>
>   while (offset < 0) offset += BUFFER_SIZE;
>   return data[channel][offset];
> }

Paul schrieb:
> Die Funktion wird pro Rechenzyklus 3 mal (direkt hintereinander) mit
> unterschiedlichen delay angaben aufgerufen.

Sind diese delays konstant oder variabel? Wenn konstant könntest du dich 
überlegen einfach 3 extra Indices anzulegen.
Wie groß sind die delays im Verhältniss zu BUFFER_SIZE? (oder anders 
gefragt: wie oft wird die while-schleife durchlaufen?)

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.