Hallo, kann man bei einem STM32F746 die zeitliche Auslastung des SDRAMs irgendwie messen? Konkret geht es darum, dass ich den LCD-Controller (LTDC) benutze um ein Bild auszugeben und ab und zu einen DMA-Underrun von ihm bekomme. Bisher konnte ich das immer irgendwie lösen, aber ich finde es sehr unschön, dass ich nicht sagen kann, wie nahe ich am Limit bin. Gibt es da eine Möglichkeit? Ich hätte am liebsten ein Timingdiagramm, das mir zeigt zu wieviel Prozent die Schnittstelle zum SDRAM belegt ist. Gruß Markus
Im Normalfall sollte man das einfach ausrechnen. Messen dürfte schwierig werden, dann dann müßte man ja Signale vom DMA-Zugriff des LCD an eine IO-Pin bekommen. Das geht vielleicht mit ein paar Interrupts oder Hardware-Events wie beim ATXmega.
Markus K. schrieb: > Konkret geht es darum, dass ich den LCD-Controller > (LTDC) benutze um ein Bild auszugeben und ab und zu einen DMA-Underrun > von ihm bekomme. Die prozentuale Auslastung nutzt Dir garnichts. Selbst, wenn diese nur 50% beträgt, kann der DMA-Controller trotzdem ins Stocken kommen. Wie stellt Du einen underrun fest? Oder anders gesagt, senke die Bildfrequenz, bis keiner mehr auftritt. Alternativ kann man auch die Datenbreite des SDRAMs erhöhen.
Ich hatte gehofft, dass es irgendwelche Performance-Register oder sowas gäbe. Das mit dem Ausrechnen ist nicht so einfach. Man kann zB nicht ein Kamerabild mit 54MB/s per DMA ins SDRAM schreiben und gleichzeitig das Bild darstellen, obwohl da noch mindestens ein Faktor 2 zur Bandbreite des SDRAMs bei linearen Zugriffen ist. Natürlich mögen SDRAMs keine abwechselnden Zugriffe, aber ich kenne ja das Zugriffsmuster nicht. Ich habe schon versucht das Zugriffsverhalten des System nachzuvollziehen, aber ich finde die Doku zur Arbitrierung auf der Busmatrix nicht wirklich gelungen und ich kenne auch das Zugriffsmuster des LTDC-DMAs nicht.
m.n. schrieb: > Markus K. schrieb: >> Konkret geht es darum, dass ich den LCD-Controller >> (LTDC) benutze um ein Bild auszugeben und ab und zu einen DMA-Underrun >> von ihm bekomme. > > Die prozentuale Auslastung nutzt Dir garnichts. Selbst, wenn diese nur > 50% beträgt, kann der DMA-Controller trotzdem ins Stocken kommen. Wenn es Peakwerte und nicht Durchschnittswerte sind, dann würde das schon gehen. > Wie stellt Du einen underrun fest? Es tritt ein Underrun-Interrupt auf. > Oder anders gesagt, senke die Bildfrequenz, bis keiner mehr auftritt. Das geht nicht, die muss 25Hz betragen. > Alternativ kann man auch die Datenbreite des SDRAMs erhöhen. Das geht nicht, der Controller kann nur 32Bit.
@ Markus K. (markus-) > Natürlich mögen SDRAMs keine >abwechselnden Zugriffe, Einzelzugriffe. Aber die DMA, und gerade für die LCD-Darstellung bzw. ein Frame Capture, machen ganz sicher lange Burstzugriffe. Die meisten LCD-Controller mit DMA haben auch einen ziemlich großen Zwischenpuffer für 1 Bildzeile oder mehr, damit sie eben nicht alle paar Takte per DMA Datenholen müssen sondern in eher großen Schlucken mit relativ niedirger Frequenz die Daten aus dem SDRAM laden können. Damit können sie auch hin und wieder längere Zugriffspausen verkraften, wenn andere Module auf den SDRAM zugreifen wollen. > aber ich kenne ja das Zugriffsmuster nicht. Dort liegt dein Problem 8-0
Falk B. schrieb: > @ Markus K. (markus-) > >> Natürlich mögen SDRAMs keine >>abwechselnden Zugriffe, > > Einzelzugriffe. Aber die DMA, und gerade für die LCD-Darstellung bzw. > ein Frame Capture, machen ganz sicher lange Burstzugriffe. Die meisten > LCD-Controller mit DMA haben auch einen ziemlich großen Zwischenpuffer > für 1 Bildzeile oder mehr, damit sie eben nicht alle paar Takte per DMA > Datenholen müssen sondern in eher großen Schlucken mit relativ niedirger > Frequenz die Daten aus dem SDRAM laden können. Damit können sie auch hin > und wieder längere Zugriffspausen verkraften, wenn andere Module auf den > SDRAM zugreifen wollen. Der LCD-Controller hat 2x (wegen 2 Ebenen) 64x32bit, das sind bei 16bit per Pixel also jeweils 128 Pixel. Der DCMI (Camera-Interface) benutzt einen normalen DMA und der hat nur 4x32bit. >> aber ich kenne ja das Zugriffsmuster nicht. > > Dort liegt dein Problem 8-0 Die Doku habe ich schon gelesen. Es ist halt nicht beschrieben und gerade beim LTDC kann man da eh nicht eingreifen. Er wird ja nicht erst lesen, wenn der FIFO leer ist, sondern früher. Aber wieviel früher? Bei 25% oder bei 50%? Wenn ich die AN4031 richtig deute, dann werden bei 2 konkurrierenden DMA-Zugriffen diese auf der Busmatrix immer abwechselnd bedient (Round Robin, dabei ist das Quantum 1 AHB Zyklus). Dann würden die so auch beim FMC (SDRAM-Controller) aufschlagen. Dieser wiederum hat einen Lesecache von 6x32bit, aber anscheinend keinen Schreibcache. Insgesamt dürfte das ein recht ungünstiges Zugriffsmuster geben.
@Markus K. (markus-) >Der LCD-Controller hat 2x (wegen 2 Ebenen) 64x32bit, das sind bei 16bit >per Pixel also jeweils 128 Pixel. Schon mal ganz ordentlich. > Der DCMI (Camera-Interface) benutzt >einen normalen DMA und der hat nur 4x32bit. Eher wenig. >Die Doku habe ich schon gelesen. Es ist halt nicht beschrieben und >gerade beim LTDC kann man da eh nicht eingreifen. Wirklich? Gibt es dafür KEINERLEI Konfigurationsregister? > Er wird ja nicht erst >lesen, wenn der FIFO leer ist, sondern früher. Hoffen wir es ;-) > Aber wieviel früher? Bei 25% oder bei 50%? Keine Ahnung. >Wenn ich die AN4031 richtig deute, dann werden bei 2 konkurrierenden >DMA-Zugriffen diese auf der Busmatrix immer abwechselnd bedient (Round >Robin, dabei ist das Quantum 1 AHB Zyklus). Mag sein, aber bei DMA gibt es auch minimale Burstlängen, welche NICHT unterbrochen werden. Dort muss man suchen. Die sollten möglichst groß sein, damit der SDRAM nicht sinnlose, langsame Einzelzugriffe machen muss. > Dann würden die so auch beim >FMC (SDRAM-Controller) aufschlagen. Eben. > Dieser wiederum hat einen Lesecache >von 6x32bit, aber anscheinend keinen Schreibcache. Keine Ahnung. >Insgesamt dürfte das ein recht ungünstiges Zugriffsmuster geben. Wahrscheinlich. Aber das kann und muss man wahrscheinlich mit einer gescheiten Konfiguration der DMA abfangen. Ergo. Wo man viel einstellen kann, kann man auch viel falsch einstellen.
>Die Doku habe ich schon gelesen. AppNote AN4861 schon gelesen ? http://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwj_vJW-0I_TAhXJuxQKHQQDBM0QFggjMAA&url=http%3A%2F%2Fwww.st.com%2Fresource%2Fen%2Fapplication_note%2Fdm00287603.pdf&usg=AFQjCNFamKHyGiNbXt30KXtSuiGFJI78Lg
Falk B. schrieb: >>Die Doku habe ich schon gelesen. Es ist halt nicht beschrieben und >>gerade beim LTDC kann man da eh nicht eingreifen. > > Wirklich? Gibt es dafür KEINERLEI Konfigurationsregister? Nein. Man kann dort nur Auflösung usw. einstellen, aber nicht den DMA. @dasrotemopped Danke für den Hinweis. Das Dokument ist erst 2 Monate alt, das kannte ich noch nicht. Dort steht auch drin, dass der AHB keine Bursts über Kilobyte-Grenzen hinweg kann und wenn man das doch tut, dann splittet er das in Einzelzugriffe auf (wobei mir unklar ist ob mit Einzelzugriffen gemeint ist, dann er dann zwei Zugriffe daraus macht oder einzelne Words liest.) Eine Zeile ist bei mir 1440 bytes lang und ein LTDC-Burst 64Byte, das trifft mich also.
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.