Forum: Mikrocontroller und Digitale Elektronik STM32F7 SDRAM Auslastung (Bandbreite) messen


von Markus K. (markus-)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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.

von m.n. (Gast)


Lesenswert?

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.

von Markus K. (markus-)


Lesenswert?

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.

von Markus K. (markus-)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@ 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

von Markus K. (markus-)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@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.

von dasrotemopped (Gast)


Lesenswert?


von Markus K. (markus-)


Lesenswert?

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