Forum: Mikrocontroller und Digitale Elektronik STM32F4 24bit :>


von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

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

von dasrotemopped (Gast)


Lesenswert?

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.

von Jim M. (turboj)


Lesenswert?

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.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

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
von dasrotemopped (Gast)


Lesenswert?

>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
Noch kein Account? Hier anmelden.