Huhu! Ich mal wieder :) Diesmal suche ich nach der günstigsten Methode um einen mit 16-bit angebundenen SDRAM per Software zu beschreiben. Die Daten schnappt sich dann der LTDC welcher im 888-Farbmodus läuft. Wie setze ich am effektivsten einen einzigen Pixel? Bisher mache ich zwei Schreibvorgänge ala 1x2Byte und 1x1Byte. Gibt es eine Möglichkeit die CPU zu entlasten und 1x3Byte zu übertragen? Dass am SDRAM trotzdem zwei Schreibvorgänge ankommen ist mir schon klar, aber ich habe schon mal ein paar Speedtests gemacht und am fixesten gehen 4Byte auf einmal rüber. Oder vllt gibt es noch eine bessere Möglichkeit? Und noch eine Frage hinterher: Könnte ich, wenn SetPixel() öfter ausgeführt werden muss, an Performance gewinnen, wenn ich die Daten erstmal in den SRAM zwischenschiebe und dann per DMA2D in den SDRAM schicke? PS: Die floating-point-unit ist ja mal affenscharf :D
MEM2MEM DMA 3x8bit für ein einzelnes Pixel. Besser eine Bildzeile im internen SRAM vorberechnen und dann mit DMA(2D) mit 16bit Datenworten verschieben. Gruß, dasrotemopped.
Reginald L. schrieb: > Könnte ich, wenn SetPixel() öfter ausgeführt werden muss, an Performance > gewinnen, wenn ich die Daten erstmal in den SRAM zwischenschiebe und > dann per DMA2D in den SDRAM schicke? Wenn der SRAM weniger Latenz als der SDRAM hat: Ja. Oft hat der interne SRAM auch mehr Bandbreite. Und Du könntest da auch mit 4 Byte Zugriffen arbeiten - bei streng aufsteigenen Addressen natürlich. Kostet aber ein paar Straftakte wegen unaligned Access.
dasrotemopped schrieb: > MEM2MEM DMA 3x8bit für ein einzelnes Pixel. > Besser eine Bildzeile im internen SRAM vorberechnen und dann mit DMA(2D) > mit 16bit Datenworten verschieben. Stimmt eigentlich, die Berechnung eines einzelnen Pixels sind schon einige Zeilen Code, da könnte ich einfach jedes mal den DMA starten. Also sozusagen anstatt SetPixel() eine SetPixelwithDMA(), das müsste schon ordentlich helfen. Danke für den Tipp. Ich vermute, bei längeren Berechnungen rentiert sich da die Zwischenpufferung im SRAM nicht, oder? Bzw. dir geht es darum, dass der DMA fertig ist, bevor die nächste Berechnung fertig ist, oder? Jim M. schrieb: > Und Du könntest da auch mit 4 Byte Zugriffen arbeiten - bei streng > aufsteigenen Addressen natürlich. Kostet aber ein paar Straftakte wegen > unaligned Access. Der LTDC ist auf 3Bytes eingestellt, ich muss also auf 3Bytes alignen.
:
Bearbeitet durch User
>Bzw. dir geht es darum, dass der DMA fertig ist, bevor die nächste Berechnung
fertig ist, oder?
Der DMA Controller (der STM32F4 hat 2) kann, wenn der keine weiteren
konkurierenden DMA Transfers aktiv sind, mit der vollen
Speicherbandbreite des SDRAMs transferieren.
(CPUTakt/2)*Busbreite = (180MHz/2)*16bit= 180MB/s.
Der DMA Controller ist also sehr schnell beim Datenschaufeln, viel
schneller als die CPU. Man darf allerdings nicht in dem Speicherbereich
rumrechnen, während die Daten transferiert werden. Also Doppelpuffer
einrichten ! Und vor dem Start eines neuen DMA Transfers auf die
erfolgreiche Beendigung des vorherigen prüfen ! Dafür sind die CallBacks
der HAL gedacht. So kann der uC nur für Berechnungen benutzt werden und
das Datenschieben der DMA übernehmen. Das entlastet die CPU und
beschleunigt das Datenschieben.
Zum Test einfach mal mehrere Bilder im Flash der CPU als Array speichern
und per DMA nacheinander in den Bildpuffer schreiben.
Gruß,
dasrotemopped.
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.