Forum: Mikrocontroller und Digitale Elektronik DMA bei AT91SAM SAM3X sehr langsam


von Relikt (Gast)


Lesenswert?

Hallo liebe Forengemeinde,

für eine Zeitkritische Anwendung versuche ich das DMA Modul meines 
Sam3x8e zu verwenden. Da verschiedene Addressen angesprochen werden, 
verwende ich Linked Lists.
1
PMC->PMC_PCER1 = 1 << (ID_DMAC -32);
2
  DMAC->DMAC_EBCISR;
3
4
  DMAC->DMAC_CH_NUM[5].DMAC_CFG = DMAC_CFG_SOD_ENABLE|
5
                  DMAC_CFG_DST_PER(15)|
6
                  DMAC_CFG_DST_H2SEL_HW|
7
                  DMAC_CFG_FIFOCFG_ALAP_CFG|
8
                  DMAC_CFG_AHB_PROT(2)|
9
                  DMAC_CFG_LOCK_IF;
10
                  
11
          
12
  
13
                
14
  DMAC->DMAC_GCFG = DMAC_GCFG_ARB_CFG_ROUND_ROBIN;
15
  DMAC->DMAC_EN = DMAC_EN_ENABLE;
16
17
18
19
IIL[0].ul_ctrlA = DMAC_CTRLA_BTSIZE(2)|
20
    DMAC_CTRLA_SRC_WIDTH_WORD|
21
    DMAC_CTRLA_DST_WIDTH_WORD;
22
          
23
IIL[0].ul_ctrlB = DMAC_CTRLB_FC_MEM2MEM_DMA_FC|
24
          DMAC_CTRLB_SRC_DSCR_FETCH_FROM_MEM|
25
          DMAC_CTRLB_DST_DSCR_FETCH_FROM_MEM|
26
          DMAC_CTRLB_SRC_INCR_INCREMENTING|
27
          DMAC_CTRLB_DST_INCR_INCREMENTING;
28
  IIL[0].ul_destination_addr = (uint32_t)  &(PIOD->PIO_ODSR);
29
  IIL[0].ul_source_addr = (uint32_t) array;
30
  IIL[0].ul_descriptor_addr = (uint32_t)&IIL[1];
31
  
32
  
33
  
34
  
35
  IIL[1].ul_ctrlA = DMAC_CTRLA_BTSIZE(2)|
36
          DMAC_CTRLA_SRC_WIDTH_WORD|
37
          DMAC_CTRLA_DST_WIDTH_WORD|
38
          DMAC_CTRLA_SCSIZE_CHK_4;
39
  IIL[1].ul_ctrlB = DMAC_CTRLB_FC_MEM2MEM_DMA_FC|
40
          DMAC_CTRLB_SRC_DSCR_FETCH_FROM_MEM|
41
          DMAC_CTRLB_DST_DSCR_FETCH_FROM_MEM|
42
          DMAC_CTRLB_SRC_INCR_INCREMENTING|
43
          DMAC_CTRLB_DST_INCR_FIXED;
44
  IIL[1].ul_destination_addr = (uint32_t) &(PIOC->PIO_ODSR);
45
  IIL[1].ul_source_addr = (uint32_t) array1;
46
  IIL[1].ul_descriptor_addr = (uint32_t) 0;
47
48
49
50
DMAC->DMAC_CH_NUM[5].DMAC_DSCR= (uint32_t) &IIL[0];
51
DMAC->DMAC_CHER = DMAC_CHER_ENA5;


Wie man sieht verwende ich Mem2Mem Transfer.
Mit einem Oszi an den Beiden Ausgängen die nacheinander geschaltet 
werden, wird die Zeit zwischen den beiden LLI transfers gemessen.

Der SAM3x8e ist mit 84 MHz getaktet. Die Zeit zwischen den beiden 
Transfers beträgt jedoch fast 500ns (ca. 2Mhz) oder anders gesagt fast 
40!!! Clockzyklen.

Ist das ein Programmierfehler meinerseits oder geht es einfach nicht 
schneller?


Mit freundlichen Grüßen

von ghl (Gast)


Lesenswert?

Hallo,

Ich habe mit dem genannten Controller noch nicht gearbeitet. Nach meiner 
Erfahrung ist Scatter-Gather-DMA aber zu vermeiden. Bei Infiniband gibt 
es ähnliches und dort ist es so, dass SG wesentlich langsamer ist.

Aus dem (SAM3X8E) Manual:
1
Figure 24-4.
2
In this case, the DMAC re-programs the channel registers prior to the start of each buffer by fetching the buffer descriptor for that buffer from system memory. This is known as an LLI update.

Du musst also alle Register neu laden. Wo liegt denn deine Linked List? 
Im SRAM? Sind dafür nicht auch AHB-Zyklen notwendig? Wie schnell ist 
denn dein AHB? Auch 84MHz, damit du single-cycle-access hast oder 
langsamer?

von Relikt (Gast)


Lesenswert?

Wenn ich es ohne LLI mache, also am gleichen Port (gleiche Addresse) und 
dann dem Sourcepointer ein Array übergebe (mit DMA-Einstellung Increment 
Source after Transfer) wird der Port innerhalb 42 MHz also 2 clk-cycle 
geschaltet.
Am AHB denke ich liegt es nicht. Die linked list liegt im SRAM denke 
ich.

Bin nur etwas verwundert dass es ohne LLI funktioniert und mit LLI doch 
um einiges länger braucht. 4-5 zyklen wären noch akzeptabel, aber so...

von ghl (Gast)


Lesenswert?

Naja, abschalten ist ja wohl kaum das gleiche wie ein neues LLI laden.

- DMAC_CTRLAx muss in den Speicher geschrieben werden.
- DMAC_SADDRx, DMAC_DADDRx, DMAC_DSCRx, DMAC_CTRLAx und DMAC_CTRLBx 
müssen vom Speicher gelesen werden.

Du kannst ja mal in PMC_PCR [29.2.15.26 im Manual] schauen mit welcher 
Clock der DMA Controller läuft.

Weiter kann ich aber nicht helfen. Ich denke mit der speziellen Frage 
solltest du dich direkt an Atmel wenden.

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.