mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32F4 24bit :>


Autor: Reginald L. (Firma: HS Ulm) (reggie)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: dasrotemopped (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jim M. (turboj)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Reginald L. (Firma: HS Ulm) (reggie)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: dasrotemopped (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.