STM32F4 SDRAM Geschwindigkeit

OP (Firma: HEGRO GmbH) #4477282
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
Gast #4477299
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.
Gast #4477485
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.
OP (Firma: HEGRO GmbH) #4477505
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?
#4477518
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.
Gast #4477628
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren