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

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.