Det långa och korta är att DMA tillåter CPU: n att effektivt uppträda vid sin ursprungliga hastighet, medan kringutrustningen effektivt kan bete sig med sin ursprungliga hastighet. De flesta siffrorna i exemplet består.
Låt oss jämföra två alternativ för att periodiskt samla in data från en ADC:
- Du kan ställa in ADC som en del av ett avbrott (periodiskt eller på annat sätt)
- Du kan skapa en buffert och be DMA att överföra ADC-avläsningar till bufferten.
Låt oss överföra 1000 prover från ADC till RAM.
Använda alternativ 1: För varje prov finns det
- 12 cykler är spenderat på att avbryta
- läs adc (er)
- lagra i ram
- 12 cykler spenderas på att avbryta avbrott
Låt oss låtsas att denna avbrottsfunktion är 76 instruktioner, hela rutinen är 100 instruktioner lång, förutsatt att en cykel exekveras (i bästa fall). Det betyder att alternativ 1 kommer att spendera 100 000 cykler av CPU-tid på att köras.
Alternativ 2: DMA är konfigurerad för att samla in 1000 prover av ADC. Låt oss anta att ADC har en hårdvarutlösare från en timerräknare.
- ADC och DMA överför 1000 samplingsdata till ram
- DMA avbryter din CPU efter 1000 sampel
- 12 cykler spenderas på att avbryta
- Kod händer (låt oss säga att det säger till DMA att skriva över RAM)
- 12 cykler spenderas på att avbryta avbrott
Att låtsas att hela avbrottet (med in- och utgångskostnader) är 100 encykelinstruktioner. Med DMA spenderar du bara 100 cykler för att spara samma 1000 prover.
Nu, varje gång DMA går in på bussen, ja, kan det finnas en tvist mellan CPU och DMA.Processorn kan till och med tvingas vänta på att DMA ska slutföras.Men att vänta på att DMA ska avslutas är mycket mycket kortare än att låsa CPU: n för att serva ADC.Om CPU-kärnklockan är 2x bussklocka kan CPU slösa bort några kärncykler och vänta på att DMA ska slutföras.Det betyder att din effektiva exekveringstid för överföringen är mellan 1000 (förutsatt att CPU aldrig väntar) och 9000 cykler.ÄR fortfarande bättre än 100 000 cykler.