Forum: Mikrocontroller und Digitale Elektronik STM32F4 SDRAM Geschwindigkeit


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


Lesenswert?

Hallihallohallöle!

Habe mit folgender Schleife Zeitmessungen gemacht, wie lange es braucht, 
bis das externe SD-Ram komplett beschrieben wurde:
1
  uint32_t a = GetTick();
2
  for (int i = 0; i < SDRAM_SIZE; i += 4)
3
  {
4
    // 501ms -> 16.743.729b/s
5
    //*(uint8_t*)(0xD0000000 + i) = 0xBB;
6
    //*(uint8_t*)(0xD0000000 + i + 1) = 0xBB;
7
    //*(uint8_t*)(0xD0000000 + i + 2) = 0xBB;
8
    //*(uint8_t*)(0xD0000000 + i + 3) = 0xBB;
9
  
10
    // 314ms -> 26.715.312b/s
11
    //*(uint16_t*)(0xD0000000 + i) = 0xBBBB;
12
    //*(uint16_t*)(0xD0000000 + i + 2) = 0xBBBB;
13
14
    // 233 ms -> 36.002.609b/s
15
    //*(uint32_t*)(0xD0000000 + i) = 0xBBBBBBBB;
16
17
    // 407 ms -> 20.610.830b/s
18
    //*(uint16_t*)(0xD0000000 + i) = 0xBBBB;
19
    //*(uint8_t*)(0xD0000000 + i + 2) = 0xBB;
20
    //*(uint8_t*)(0xD0000000 + i + 3) = 0xBB;
21
  }
22
  uint32_t b = GetTick() - a;

Es handelt sich um den STM32F429IGT6 µC auf einem Waveshare-Core-Board 
mit 8MB SD-Ram. Ansich sind die Werte ja plausibel (?), was mich 
wundert, ist die Geschwindigkeit, wenn ich mit 32bit schreibe. Der 
Speicher ist doch elektrisch nur mit 16bit angebunden, also muss er doch 
zwei Schreiboperationen ausführen.

Kann mir jemand eine Erklärung hierfür liefern? Ich würde auch gerne ein 
paar Zeilen lesen, wenn ihr einen guten Link für mich habt. Vor allem 
würde mich interessieren, wie ich das beste, in Bezug auf das Tempo, aus 
dem Speicher heraushole. Die Größe spielt für mich keine Rolle, ich 
komme auch mit 2MB aus.


Grüße
Reggie

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

Reginald L. schrieb:
> was mich
> wundert, ist die Geschwindigkeit, wenn ich mit 32bit schreibe
Das siehst du doch sogar schon am C-Code. 2x 16bit schreiben sind 2 
Instruktionen, und 1x 32bit schreiben ist 1 Instruktion. Unabhängig 
davon wie der SDRAM angebunden ist, ändert sich somit wie viel die CPU 
zu tun hat.

Reginald L. schrieb:
> Ich würde auch gerne ein
> paar Zeilen lesen, wenn ihr einen guten Link für mich habt
ARMv7M Architecture Reference Manual
Cortex-M4 Technical Reference Manual

Reginald L. schrieb:
> Vor allem
> würde mich interessieren, wie ich das beste, in Bezug auf das Tempo, aus
> dem Speicher heraushole.
Versuch auch mal uint64_t, oder noch mehr Words auf einmal mittels "stm" 
Instruktion. Am schnellsten dürfte DMA sein. Dabei sollte man den CCM 
geschickt nutzen, damit der DMA den AHB mehr nutzen kann.

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


Lesenswert?

Also bin ich mit reinem C-Code hier sozusagen am Ende der Fahnenstange?

von Falk B. (falk)


Lesenswert?

Nimm DMA!

von m.n. (Gast)


Lesenswert?

... oder zumindest einen Schreibzeiger mit Postinkrement (ptr++). Dabei 
können auch mehrere int-Werte nacheinander geschrieben werden, um die 
Schleifendurchläufe zu reduzieren.

Das FSMC sorgt dafür, daß 32 Bit Zugriffe zwischengespeichert auf 16 Bit 
reduziert ausgegeben werden.

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


Lesenswert?

m.n. schrieb:
> ... oder zumindest einen Schreibzeiger mit Postinkrement (ptr++). Dabei
> können auch mehrere int-Werte nacheinander geschrieben werden, um die
> Schleifendurchläufe zu reduzieren.

Ich habe auch irgendwo gelesen, dass eine Schleife mit i-- schneller 
durchlaufen wird? Wo stehen diese Infos? Wohl kaum im Reference Manual?

von Falk B. (falk)


Lesenswert?

@Reginald Leonczuk (Firma: HS Ulm) (reggie)

>Ich habe auch irgendwo gelesen, dass eine Schleife mit i-- schneller
>durchlaufen wird? Wo stehen diese Infos? Wohl kaum im Reference Manual?

Legenden. Heutige Compiler sind schlau genug, auch Indexzugriffe passend 
zu optimieren. Da gibt es im ASM-Code keinen Unterschied mehr zwischen
1
  data =*ptr++;
2
  data = field[i++];

Wer es genau wissen will, muss ins generierte ASM-File des Compiler 
schauen. Spekulationen am C-Code sind sinnlos.

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

Erheblichen Einfluß auf die Geschwindigkeit hat auch, wie das Timing vom 
SDRAM aussieht. Sieh ins Datenblatt (RM0090, Rev5) unter FMC und 
vergleiche die Einstellungen mit denen, wie sie bei Dir aussehen.
Der FMC hat ein Fifo, weshalb es durchaus Sinn ergibt, mehrere Werte 
direkt nacheinander auszugeben (DMA macht das ganz alleine), und er 
unterstützt einen Burst-Modus fürs Schreiben mit maximal 90 MHz.

Wenn ich das nach oberflächlicher Durchsicht richtig verstehe, könnte 
die Schreibrate mit optimalem Timing auf rund 170 MB/s bei 16 Bit 
Busbreite kommen (Figure 475).

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


Lesenswert?

m.n. schrieb:
> Wenn ich das nach oberflächlicher Durchsicht richtig verstehe, könnte
> die Schreibrate mit optimalem Timing auf rund 170 MB/s bei 16 Bit
> Busbreite kommen (Figure 475).

Tatsache, 170 un paar Zerquetschte, habe den Versuch mit DMA2D dazu 
durchgeführt. :)

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.