Fråga:
Vad är poängen med DMA i inbäddade CPU: er?
BeB00
2016-06-14 20:23:03 UTC
view on stackexchange narkive permalink

Jag gjorde nyligen ett projekt med mbed (LPC1768) och använde DAC för att mata ut olika vågor.Jag läste delar av databladet och det pratade om hur det hade DMA för många kringutrustning.Det verkade som om det skulle vara användbart, men vid vidare läsning fann jag att DMA använde samma databuss som CPU (vilket jag antar är normalt).Betyder detta att CPU inte kan interagera med något av minnena medan DAC får data?Eftersom DAC inte hade en buffert (så vitt jag kunde säga) och därför måste DMA mycket ofta, vad är poängen med DMA?Om processorn inte kan göra minnetransaktioner, kan den göra något?

Jag föreslår att du tittar på funktionerna i din CPU och om den kan göra något annat än att komma åt minne.Jag har hört talas om några processorer som kan göra saker som beslut eller beräkningar, inte säker på om det här är vanligt alls.
Ska CPU spendera sin tid på att överföra data till en I / O-port eller delegera uppgiften till en dedikerad enhet?
Ja, CPU: n kan göra andra saker, men i ett inbäddat system spenderar det förmodligen mycket tid på gränssnitt med kringutrustning, särskilt I / O-portar.Skulle det inte vara vettigare att ha en extra databuss bara för DMA?Eller är det vanligtvis inte nödvändigt?Situationen där du vill ha en extra buss är när du försöker skjuta gränserna för din hårdvara, vilket jag antar är när du ändå vill använda DMA?
Enkelt exempel, säg att du vill skriva ut mycket information till en seriell port.Du kan antingen sitta och vänta på att varje byte ska skickas (långsam), kopiera den till en buffert och sedan använda avbrott på processorn för att skicka varje byte när porten är klar (massor av kontextbyte = långsam) eller kopiera den tillen buffert och låt DMA-styrenheten stänga av data medan processorn är upptagen med att göra andra saker (kan vara snabbare).
Såg en omslag av EDN en gång som visade en teckning av en man som hade en enorm, tre fot lång sko och en rubrik, "Om det är en sko, bära den."Poängen var, om en del gör tio saker du inte behöver, och en sak du behöver, och pris, fotavtryck och kraftbudget passar, så ska du bara använda den och inte slösa bort din tid på att leta efter någotmed färre funktioner.
till exempel om CPU vill läsa data från hårddisken, istället för att slösa bort tid för att läsa byte-för-byte, kan CPU bara lämna arbetet för DMA och göra mer användbara saker medan man väntar på att data ska kopieras till RAM
Sju svar:
pgvoorhees
2016-06-14 21:24:36 UTC
view on stackexchange narkive permalink

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:

  1. Du kan ställa in ADC som en del av ett avbrott (periodiskt eller på annat sätt)
  2. 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.

Viktigt att notera att RAM inte är den enda plats där CPU: n kan lagra data.I allmänhet laddar processorn data från RAM i register innan de arbetar med den.
Yah, helt korrekt.Mitt exempel är en grov skiss.
Många mikrokontroller har också en flerskiktsbuss så att samverkan är möjlig.Exempel: adc-> ram och flash-> registrera samtidigt.Många instruktioner är också längre än en klocka, så det finns gott om tid för DMA.
David
2016-06-14 20:54:36 UTC
view on stackexchange narkive permalink

LPC1768-databladet jag hittade har följande citat (betoning min):

Åtta kanaler DMA-styrenhet för allmänt ändamål (GPDMA) på AHB-flerskiktsmatrisen som kan kan användas med SSP-, I2S-buss-, UART-, Analog-till-Digital- och Digital-till-Analog-kringutrustning, timermatchningssignaler och för minne-till-minne-överföringar.

Split APB-buss möjliggör hög genomströmning med få stånd mellan CPU och DMA

Blockdiagrammet på sidan 6 visar SRAM med flera kanaler mellan AHB-matrisen och följande citat säkerhetskopierar detta:

LPC17xx innehåller totalt 64 kB statiskt RAM-minne på chipet. Detta inkluderar de viktigaste 32 kB SRAM, tillgängliga med CPU och DMA-styrenhet på en höghastighetsbuss, och två ytterligare 16 kB vardera SRAM-block ligger på en separat slavport på AHB-flerskiktsmatrisen. Denna arkitektur gör att CPU- och DMA-åtkomst kan spridas över tre separata RAM-minne som kan nås samtidigt

Och detta förstärks av följande citat:

The GPDMA möjliggör perifer-till-minne, minne-till-perifer, perifer-till-perifer och minne-till-minne-transaktioner.

Därför kan du strömma data till din DAC från ett av de separata SRAM-blocken eller från en annan kringutrustning, medan du använder huvud-SRAM för andra funktioner.

Denna typ av perifer perifer DMA är vanligt i mindre delar där minnesgränssnittet är ganska enkelt (jämfört med att säga en modern Intel-processor).

Ahh, tack, jag förstod inte att det var möjligt, jag är ganska ny på DMA.Innebär det att cpu kan komma åt kringutrustning medan DAC har åtkomst till den separata SRAM?
Ja - det här är exakt vad AHB-matrisen är för.Det gör att olika styrenheter (CPU, DMA, vissa kringutrustning som Ethernet och USB) kan komma åt olika saker samtidigt.Det är därför det finns flera "portar" till SRAM.
Ja, AHB i dessa billiga små skapare levererar vansinniga minnesbandbredder på grund av de parallella minnesbankerna: du kan ha ethernet, USB2 och allt går med maximal genomströmning och CPUn märker inte ens ...
Också tumkod kan sätta 2 instruktioner i ett 32-bitars ord, så cpu kanske inte behöver komma åt bussen så ofta när man gör matte eller operationer som oftast involverar register ... På andra sidan tror jag att M3 och M4 kangör flera minnesåtkomster per klocka (instruktion och data) på grund av att du har flera bussar.
supercat
2016-06-14 23:21:29 UTC
view on stackexchange narkive permalink

Om processorn och en DMA-styrenhet skulle behöva komma åt samma buss under en viss cykel, måste den ena eller den andra vänta. Många system innehåller emellertid flera minnesområden med separata bussar tillsammans med en buss "brygga" som gör att CPU: n kan komma åt ett minne medan DMA-styrenheten har åtkomst till ett annat.

Vidare kanske många processorer inte behöver för att komma åt en minnesenhet i varje cykel. Om en CPU normalt bara behöver komma åt minne på två av tre cykler, kan en DMA-enhet med låg prioritet kunna utnyttja cykler när minnesbussen annars skulle vara inaktiv.

Även i de fall där varje DMA-cykel skulle leda till att processorn stannade under en cykel, men DMA kan fortfarande vara till stor hjälp om data kommer till en hastighet som är tillräckligt långsam för att CPU ska kunna göra andra saker mellan inkommande dataposter, men tillräckligt snabbt för att kostnaden per artikel måste minimeras. Om en SPI-port matade data till en enhet med en byte var 16: e CPU-cykel, till exempel skulle avbryta CPU för varje överföring sannolikt få den att spendera nästan all sin tid på att komma in och återvända från avbrottstjänstrutinen och ingen gör något verkligt arbete. Med DMA kunde dock omkostnaderna minskas till 13% även om varje DMA-överföring fick CPU att stanna i två cykler.

Slutligen tillåter vissa CPU: er att DMA utförs medan CPU: n sover. Att använda en avbrottsbaserad överföring kräver att systemet vaknar helt för varje dataenhet som överförs. Med DMA kan det emellertid vara möjligt för sömnkontrollen att mata minneskontrollern ett par klockor varje gång en byte kommer in men låt allt annat sova, vilket minskar strömförbrukningen.

Cortex-M-delarna som LPC1768 har distinkt minnesväg från blixt till instruktionsavkodaren, så i själva verket kan register-till-register-operationer innebära att processorn kan utföra flera instruktioner mellan gånger när den behöver åtkomst till dataminnet.
Smith
2016-06-15 04:18:09 UTC
view on stackexchange narkive permalink

Som programmerare är DMA ett alternativ för att överföra data till och från kringutrustning som stöder det. För det klassiska exemplet att flytta en stor buffert genom en seriell kringutrustning som SPI eller UART, eller samla ett antal prover från en ADC, har du tre metoder för att flytta dessa data:

  1. Pollingsmetod. Det är här du väntar på registerflaggor så att du kan flytta in / ut nästa byte. Problemet är att du håller upp all körning av CPU medan du väntar på detta. Eller, om du måste dela CPU-tid i ett operativsystem, kommer din överföring att bromsas drastiskt.

  2. Avbrytningsmetod. Det är här du skriver en ISR (Interrupt Service Routine) som körs för varje byteöverföring och du skriver koden i ISR ​​som hanterar överföringen. Detta är mer CPU-effektivt eftersom CPU: n endast kommer att betjäna din ISR när det behövs. Det är gratis att använda vid alla andra tillfällen utom i ISR. ISR är också ett av de snabbare alternativen för överföring när det gäller överföringshastighet.

  3. DMA. Du konfigurerar DMA med käll- / målpekare, antal överföringar och det går. Det kommer att stjäla busscykler och CPU-tid för att genomföra överföringen, och CPU: n är fri att göra andra saker under tiden. Du kan konfigurera en flagga eller avbryta för att ange när överföringen är klar. Det är vanligtvis en touch snabbare än ISR och är vanligtvis ditt snabbaste överföringsalternativ.

Som programmerare föredrar jag DMA eftersom det är det enklaste att koda och i huvudsak är den snabbaste tekniken för att överföra. Vanligtvis behöver du bara konfigurera ett par register för käll- / destinationspekare och antalet överföringar för att göra och om det går. Jag spenderar mycket mer timmar på ISR-kod än i DMA-accelererad kod eftersom ISR-kod kräver kritiska designfärdigheter och måste kodas, testas, verifieras osv. DMA-koden är mycket mindre och koden jag måste skriva själv är relativt trivialt, och jag får maximal överföringshastighet i köpet.

Enligt min erfarenhet, nyligen med Atmel SAM3 / 4-processorer, kör DMA en touch snabbare än en effektiv ISR av mitt eget hantverk. Jag hade en applikation som skulle läsa i en hög med byte från SPI var 5: e sekund. Mycket flytande matematik inträffade i bakgrundsuppgifter så jag ville att processorn skulle vara så fri som möjligt för dessa uppgifter. Den ursprungliga implementeringen var ISR, och jag flyttade sedan till DMA för att jämföra och försöka köpa lite mer CPU-tid mellan proverna. Ökningen av överföringshastigheten förbättrades något, men bara lite. Det var knappt mätbart på o-omfånget.

Det beror på att de senaste mikroprocessorerna som jag har sett fungerar ISR och DMA på nästan samma sätt - de tar CPU-cykler efter behov och DMA är gör i princip samma operationer med processorn som jag skulle ha kodat i en effektiv ISR.

I sällsynta fall har jag sett kringutrustning som har ett eget RAM-område som ENDAST var tillgängligt för DMA. Detta var på Ethernet-MAC eller USB.

old_timer
2016-06-15 00:02:33 UTC
view on stackexchange narkive permalink

DMA används troligen här så att DAC kan ha en viss regelbunden timing, generera en vågform genom att ändra den analoga utgången vid något känt intervall.

Ja om det är en delad buss då ... du måste dela.

CPU använder inte alltid bussen, så det är ibland en bra idé att dela med en dma-motor. Och naturligtvis betyder det att prioriteringar blir involverade, ibland är det bara vem som kom dit först (till exempel har ett kommando fiveo framför resursen och fiveo up-förfrågningar, i den ordning de anländer, ja det skulle inte nödvändigtvis vara deterministiskt ). I ett sådant fall kanske du vill att dma ska ha prioritet framför CPU så att tidskänsliga saker som DAC eller ADC har deterministisk timing. Beror på hur de valde att implementera det.

Folk har ibland det här felaktiga antagandet att dma är gratis. Det förbrukar fortfarande inte busstid, om det delas med cpu (vilket det så småningom är när det pratar med en resurs som cpu kan prata med) så hålls cpu och / eller dma av, så cpu måste fortfarande vänta lite tid, i vissa implementeringar (sannolikt inte din mikrokontroller) hålls cpu helt tills dma är klar, cpu stoppas under hela tiden. Beror bara på genomförandet. Den fria delen av det är att cpu inte behöver ständigt avbrytas eller pollas eller hålla andan för att någon händelse ska mata data. Det kan ta sin tid att skapa nästa buffert till dma över. Det måste se upp för att dma-överföringen ska slutföras och hantera det, men istället för att säga varje byte är det nu flera byte, något datablock.

Det finns inget universellt svar."Det beror" ... på den specifika utformningen av det specifika du använder.Även inom ett chip / kort / systemdesign kan det finnas flera dma-motorer och det finns ingen anledning att anta att de alla fungerar på samma sätt.För varje fall måste du ta reda på det, och tyvärr dokumenterar de inte det eller dokumenterar det tillräckligt bra.Så du kan behöva skapa några experiment om det är ett problem.

note embedded har inget att göra med det.poängen med dma är att få prestanda genom att eventuellt göra arbete för cpu så att det inte behöver ha kod, och att dra nytta av normalt oanvända busscykler och göra arbete där.Också för saker som i din fråga om utfodring av data vid rätt tidpunkt, helst utan CPU-omkostnader.dessa fördelar är användbara inbäddade eller inte.
Ian Ringrose
2016-06-15 15:42:52 UTC
view on stackexchange narkive permalink

Svaren hittills talar om "hastigheten" som CPU: n kan göra och hur DMA gynnar det.Det finns emellertid en annan övervägning, kraft .

Om processorn vill skicka ut ett datapaket med en långsam länk, skulle den behöva vara vaken för det mesta ommed hjälp av polling eller avbrott, men huvud-CPU: n kan kanske vara i viloläge medan DMA görs.

Rob Garnett
2018-12-19 13:50:04 UTC
view on stackexchange narkive permalink

Vissa processorer som STM32H7-serien har många RAM-alternativ och massor av nära kopplat RAM. Att ha separata RAM-banker gör att DMA kan hamra en hel del RAM medan processorn bearbetar data i den nära kopplade RAM som inte kräver cachning och inte hamras av DMA. För att flytta data kan du använda MDMA. Jag byggde en FMCW-radarsats med en av dessa. ADC: erna får IQ-data från två ingångar till en SRAM. Jag skalar sedan data och utför flytpunkt 256 bin komplex fft i dtcm ram. FIFO sedan resultatet till en 2d-array i AXI-ram med MDMA.

Jag tar ett andra fft 64-fack över femo för hastighetsvektorn. Jag gör sedan storleken på de komplexa data och skickar de resulterande data 128 & 64 flytande värden ut till en annan H7 med SPI vid 12,5 MHz för detekteringen. Jag gör allt detta på 4 ms.

Samplingshastigheten är för ADC: erna 84 kHz och med hjälp av översampling får jag cirka 18 bitars upplösning.

Inte illa för allmänna processorer som bara körs i MHz-intervallet och utan externt RAM.

Även de stora cacherna som den här enheten har förbättrat prestanda för beräkningar utanför dtcm hjälper också.



Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...