STM32F7 GCC Speicherzugriff Optimierung

Gast #4743357
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
Gast #4743405
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.
Gast #4743866
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 )
#4745232
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?)

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