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
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.
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 )
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.