Gömülü CPU'larda DMA'nın anlamı nedir?


17

Yakın zamanda mbed (LPC1768) ile çeşitli dalgaların çıktısını almak için DAC kullanarak bir proje yapıyordum. Veri sayfasının bölümlerini okudum ve bir çok çevre birimi için nasıl DMA'ya sahip olduğunu anlattı. Bu yararlı olurdu gibi görünüyordu, ama daha fazla okuma, DMA cpu ile aynı veri yolu kullandığını bulundu (ki normaldir). Bu, DAC veri alırken CPU'nun herhangi bir anı ile etkileşime giremeyeceği anlamına mı geliyor? Ayrıca, DAC (anlayabildiğim kadarıyla) bir tampona sahip olmadığından ve bu nedenle DMA'ya çok sık ihtiyaç duyduğundan, DMA'nın amacı nedir? CPU bellek işlemleri yapamıyorsa, herhangi bir şey yapabilir mi?


8
İşlemcinizin özelliklerine ve belleğe erişmekten başka bir şey yapıp yapamayacağınıza bakmanızı öneririm. Kararlar veya hesaplamalar gibi şeyler yapabilen bazı CPU'ları duydum, bunun yaygın olup olmadığından emin değilim ..
PlasmaHH

CPU, zamanı bir G / Ç bağlantı noktasına aktarmak veya görevi özel bir aygıta devretmek için zaman harcamalı mı?
StainlessSteelRat

Evet, CPU başka şeyler yapabilir, ancak gömülü bir sistemde muhtemelen zamanının çoğunu çevre birimleriyle, özellikle G / Ç bağlantı noktaları ile arabirim oluşturarak geçiriyor. Sadece DMA için ekstra bir veri yoluna sahip olmak daha anlamlı olmaz mıydı? Yoksa bu genellikle gerekli değil mi? Ekstra bir otobüs isteyeceğiniz durum, donanımınızın sınırlarını zorlamaya çalışırken, DMA'yı ne zaman kullanmak istediğinizi varsayıyorum.
BeB00

1
Basit bir örnek, seri bağlantı noktasına çok fazla bilgi yazdırmak istediğinizi varsayalım. Oturup her bir baytın gönderilmesini bekleyebilir (yavaş), bir arabelleğe kopyalayabilir ve ardından bağlantı noktası hazır olduğunda her bir baytı göndermek için CPU'daki kesmeleri kullanabilirsiniz (birçok bağlam değiştirme = yavaş) veya kopyalayabilirsiniz. bir arabellek ve CPU başka şeyler yaparken meşgul olduğunda DMA denetleyicisinin verileri zaman aşımına uğratmasına izin verin (daha hızlı olabilir).
Tom Carpenter

2
Bir keresinde EDN'nin bir kapağını gördüm, bu da devasa, üç ayak uzunluğunda bir ayakkabı giyen bir adamın çizimini ve "Bir ayakkabıysa, giy." Mesele şuydu: Bir parça ihtiyacınız olmayan on şeyi ve ihtiyacınız olan bir şeyi yaparsa ve fiyat, ayak izi ve güç bütçesi uyuyorsa, sadece onu kullanmalı ve bir şey aramak için zamanınızı boşa harcamamalısınız. daha az özelliğe sahip.
Solomon Slow

Yanıtlar:


17

LPC1768 veri sayfası buldum aşağıdaki tırnak (vurgu benim) sahiptir:

AHB çok katmanlı matrisinde SSP, I2S-bus, UART, Analog-Dijital ve Dijital-Analog dönüştürücü çevre birimleri, zamanlayıcı eşleşme sinyalleri ve bellek-bellek için kullanılabilen sekiz kanallı Genel Amaçlı DMA denetleyici (GPDMA) -hafıza aktarımları.

Bölünmüş APB veri yolu, CPU ve DMA arasında birkaç durakla yüksek verim sağlar

Sayfa 6'daki blok şemada AHB matrisi ile aşağıdaki alıntı arasında birden fazla kanal bulunan SRAM gösterilmektedir:

LPC17xx, toplam 64 kB çip üzerinde statik RAM belleği içerir. Buna, daha yüksek hızlı bir veriyolunda CPU ve DMA denetleyicisi tarafından erişilebilen ana 32 kB SRAM ve AHB çok katmanlı matrisinde ayrı bir bağımlı bağlantı noktasında bulunan her bir SRAM bloğunda iki ek 16 kB bulunur. Bu mimari, CPU ve DMA erişimlerinin aynı anda erişilebilen üç ayrı RAM üzerine yayılmasını sağlar

Ve bu aşağıdaki alıntı ile güçlendirilmiştir:

GPDMA, çevresel bellekten belleğe, bellekten çevreye, çevreselden çevreye ve bellekten belleğe işlemler sağlar.

Bu nedenle, DAC'ınıza ayrı SRAM bloklarından birinden veya farklı bir çevre biriminden veri akışı sağlarken, diğer fonksiyonlar için ana SRAM'ı kullanabilirsiniz.

Bu tür bir çevresel-çevresel DMA, bellek arayüzünün oldukça basit olduğu daha küçük parçalarda yaygındır (modern bir Intel işlemci ile karşılaştırıldığında).


Ahh, teşekkürler, bunun mümkün olduğunu fark etmedim, DMA için biraz yeniyim. Bu, DAC'nin ayrı SRAM'a erişirken cpu'nun çevre birimlerine erişebileceği anlamına mı geliyor?
BeB00

1
Evet - AHB matrisi tam olarak bunun için. Farklı denetleyicilerin (CPU, DMA, ethernet ve USB gibi bazı çevre birimleri) aynı anda farklı şeylere erişmesini sağlar. Bu yüzden SRAM için birden fazla 'bağlantı noktası' vardır.
David

Evet, bu ucuz küçük yaratıklardaki AHB, paralel bellek bankaları nedeniyle deli bellek bant genişlikleri sunuyor: ethernet, USB2'ye sahip olabilirsiniz ve her şey maksimum
verimde

Ayrıca başparmak kodu bir 32-bit kelime 2 talimat koyabilirsiniz, bu yüzden cpu matematik veya çoğunlukla kayıt içeren işlemleri yaparken sık sık otobüse erişmek zorunda olmayabilir ... Öte yandan, M3 ve M4 olabilir düşünüyorum birden fazla veriyolu olması nedeniyle saat başına birkaç bellek erişimi (talimat ve veri) yapın.
peufeu

30

Uzun ve kısa, DMA'nın CPU'nun doğal hızında etkili bir şekilde davranmasına izin vermesi, çevre birimleri ise doğal hızlarında etkili bir şekilde davranabilmesidir. Örnekteki sayıların çoğu oluşur.

Bir ADC'den düzenli olarak veri toplamak için iki seçeneği karşılaştıralım:

  1. ADC'yi kesintinin bir parçası olarak ayarlayabilirsiniz (periyodik veya başka türlü)
  2. Bir arabellek oluşturabilir ve DMA'ya ADC okumalarını arabelleğe aktarmasını söyleyebilirsiniz.

1000 örneği ADC'den RAM'e aktaralım.

Seçenek 1'i kullanma: Her örnek için

  • Araya girmek için 12 döngü harcanır
  • adc (ları) oku
  • koç içinde saklamak
  • Kesme işleminden çıkmak için 12 döngü harcanır

Bu kesme fonksiyonunun 76 komut olduğunu varsayalım, tüm rutin 100 komut uzunluğunda, tek döngü yürütme (en iyi durumda) varsayılarak. Bu, seçenek 1'in 100.000 döngü CPU zamanının yürütülmesini harcayacağı anlamına gelir.

Seçenek 2: DMA, 1000 ADC örneği alacak şekilde yapılandırılmıştır. Diyelim ki ADC'nin bir zamanlayıcı sayacından bir donanım tetikleyicisi var.

  • ADC ve DMA 1000 örnek veriyi ram'a aktarır
  • DMA, 1000 örnekten sonra CPU'nuzu keser
  • Araya girmek için 12 döngü harcanır
  • Kod olur (DMA'ya RAM'in üzerine yazmasını söyleyelim)
  • Kesme işleminden çıkmak için 12 döngü harcanır

Tüm kesmeyi (giriş ve çıkış ek yükü ile) taklit etmek 100 tek döngü talimatıdır. DMA kullanarak, aynı 1000 örneği kaydetmek için sadece 100 döngü harcarsınız.

Şimdi, DMA veri yoluna her eriştiğinde, evet, CPU ve DMA arasında bir anlaşmazlık olabilir. CPU, DMA'nın bitmesini beklemek zorunda kalabilir. Ancak DMA'nın bitmesini beklemek, CPU'yu ADC'ye servis yapmak için kilitlemekten çok daha kısadır. CPU çekirdek saati 2x Bus saatiyse, CPU DMA'nın bitmesini bekleyen birkaç çekirdek döngüyü boşa harcayabilir. Bu, aktarımın etkin yürütme sürenizin 1000 (CPU'nun hiç beklemediği varsayılarak) ile 9000 döngü arasında olduğu anlamına gelir. Hala 100.000 döngüden daha iyi.


2
CPU'nun veri depolayabileceği tek yer RAM olmadığını unutmamak önemlidir. Genel olarak CPU, üzerinde çalışmadan önce verileri RAM'dan kayıtlara yükler.
Aron

Yah, kesinlikle doğru. Örneğim tamamen kaba bir taslak.
pgvoorhees

Birçok mikrodenetleyici aynı zamanda çok katmanlı bir veriyoluna sahiptir, böylece eşzamanlı işlemler mümkündür. Örneğin: adc-> ram ve flash-> aynı anda kayıt olun. Ayrıca, birçok talimat 1 saatten daha uzundur, bu nedenle DMA için bolca zaman vardır.
Jeroen3

9

Belirli bir döngüde işlemci ve bir DMA denetleyicisinin aynı veriyoluna erişmesi gerekiyorsa, birinin veya diğerinin beklemesi gerekir. Bununla birlikte, pek çok sistem, DMA denetleyicisi diğerine erişirken CPU'nun bir belleğe erişmesini sağlayan bir veri yolu "köprüsü" ile birlikte ayrı veri yollarına sahip birden çok bellek alanı içerir.

Ayrıca, birçok CPU'nun her döngüde bir bellek cihazına erişmesi gerekmeyebilir. Bir CPU'nun normalde yalnızca üç döngüden ikisinde belleğe erişmesi gerekiyorsa, düşük öncelikli bir DMA cihazı, bellek veriyolu başka türlü boşta olduğunda döngüden yararlanabilir.

Her DMA döngüsünün CPU'nun bir döngü için durmasına neden olacağı durumlarda bile, veriler CPU'nun gelen veri öğeleri arasında başka şeyler yapabilmesi için yeterince yavaş bir hıza ulaşması durumunda DMA yine de çok yardımcı olabilir. , ancak öğe başına ek yükün en aza indirilmesi gereken kadar hızlı. Bir SPI bağlantı noktası bir cihaza her 16 CPU döngüsünde bir bayt hızında veri besliyorsa, örneğin, her aktarım için CPU'nun kesilmesi, neredeyse tüm zamanını kesme hizmeti rutinine girip geri dönmesine neden olur ve hiçbiri herhangi bir gerçek iş yapmak. Bununla birlikte, her DMA transferi CPU'nun iki döngü boyunca durmasına neden olsa bile, DMA kullanılarak ek yük% 13'e düşürülebilir.

Son olarak, bazı CPU'lar işlemci uykudayken DMA'nın yapılmasına izin verir. Kesme tabanlı aktarım kullanmak, sistemin aktarılan her veri birimi için tamamen uyanmasını gerektirir. Bununla birlikte, DMA kullanarak uyku kontrolörünün bir bayt her girdiğinde bellek kontrolörüne birkaç saat beslemesi mümkün olabilir, ancak her şeyin uykuda kalmasına izin vererek güç tüketimini azaltır.


1
LPC1768 gibi Cortex-M parçaları, flaştan talimat kod çözücüye kadar farklı bir bellek yoluna sahiptir, bu nedenle aslında kayıttan kayda geçir işlemleri, CPU'nun veri belleğine erişmesi gerektiğinde zamanlar arasında birden fazla talimat yürütebileceği anlamına gelebilir.
Chris Stratton

5

Bir programcı olarak DMA, onu destekleyen çevre birimlerine veri aktarma seçeneğidir. Büyük bir arabelleği SPI veya UART gibi bir seri çevre birimine kaydırmanın veya bir ADC'den birkaç örnek toplamanın klasik örneği için, bu verileri taşımak için üç yönteminiz vardır:

  1. Yoklama yöntemi. Bu, bir sonraki bayta girip çıkabilmeniz için kayıt bayraklarını beklediğiniz yerdir. Sorun, bunu beklerken CPU'nun tüm yürütülmesini beklemenizdir. Veya, bir işletim sisteminde CPU saatini paylaşmanız gerekiyorsa, aktarımınız büyük ölçüde yavaşlayacaktır.

  2. Kesme yöntemi. Burası, her bayt aktarımı ile çalışan bir kesme hizmeti rutini (ISR) yazdığınız ve aktarımı yöneten ISR'ye kodu yazdığınız yerdir. CPU daha verimli çalışır çünkü CPU yalnızca gerektiğinde ISR'nize hizmet verir. ISR dışında diğer tüm zamanlarda kullanım için ücretsizdir. ISR ayrıca aktarım hızı açısından aktarım yapmak için daha hızlı seçeneklerden biridir.

  3. DMA. DMA'yı kaynak / hedef işaretçileri, aktarım sayısı ve kapalı olacak şekilde yapılandırırsınız. Aktarımı gerçekleştirmek için veri yolu döngülerini ve CPU zamanını çalacak ve CPU bu sırada başka şeyler yapmakta serbesttir. Aktarımın ne zaman yapıldığını belirtmek için bir bayrak veya kesinti yapılandırabilirsiniz. Genellikle ISR'den daha hızlı bir dokunuş ve genellikle en hızlı aktarım seçeneğinizdir.

Bir programcı olarak, DMA'yı tercih ediyorum çünkü kodlaması en kolay ve transfer yapmak için en hızlı teknik. Tipik olarak, kaynak / hedef işaretçileri ve bunu yapmak ve kapatmak için transfer sayısı için birkaç kayıt yapılandırmanız yeterlidir. ISR kodu, DMA hızlandırılmış kodda yaptığımdan çok daha fazla saat harcıyorum çünkü ISR kodu kritik tasarım becerileri gerektiriyor ve kodlanması, test edilmesi, doğrulanması vb. Gerekiyor. DMA kodu çok daha küçük ve kod kendim yazmak zorundayım nispeten önemsiz ve pazarlık içinde maksimum aktarım hızı alıyorum.

Deneyimlerime göre, son zamanlarda Atmel SAM3 / 4 işlemcilerle, DMA kendi işçiliğimin verimli bir ISR'sinden daha hızlı bir dokunuş yapıyor. Her 5 ms'de bir SPI bayt yığını okuyacak bir uygulama vardı. Kayan nokta matematik bir sürü arka plan görevlerinde meydana geliyordu, bu yüzden CPU bu görevler için mümkün olduğunca ücretsiz olmasını istedim. İlk uygulama ISR idi ve daha sonra karşılaştırmak ve örnekler arasında biraz daha fazla CPU zamanı satın almak için DMA'ya taşındım. Aktarım hızı kazancı biraz geliştirildi, ancak sadece biraz arttı. O-kapsamda zar zor ölçülebilirdi.

Çünkü son gördüğüm mikroişlemcilerde ISR ve DMA neredeyse aynı şekilde çalışıyorlar - CPU döngülerini gerektiği gibi alıyorlar ve DMA aslında CPU ile verimli bir ISR'de kodlayacağımla aynı işlemleri yapıyor .

Nadir durumlarda, SADECE DMA tarafından erişilebilen kendi RAM alanına sahip çevre birimleri gördüm. Bu Ethernet MAC'lerinde veya USB'lerde idi.


3

DMA büyük olasılıkla burada kullanılır, böylece DAC bazı düzenli zamanlamaya sahip olabilir, bilinen bir aralıkta analog çıkışı değiştirerek bir dalga formu oluşturabilir.

Evet, eğer paylaşılan bir otobüsse ... paylaşmanız gerekir.

CPU her zaman otobüsü kullanmıyor, bu nedenle bazen bir dma motoruyla paylaşmak iyi bir fikirdir. Ve elbette bu, önceliklerin dahil olduğu anlamına gelir, bazen ilk önce oraya kim gelir (örneğin, kaynağın önünde bir fifo komutu ve fifo up istekleri, geldikleri sırayla, evet, zorunlu olarak deterministik olmayacaktır) ). Böyle bir durumda, dma'nın CPU'ya göre önceliğe sahip olmasını isteyebilirsiniz, böylece DAC'ler veya ADC'ler gibi zamana duyarlı şeyler deterministik zamanlamaya sahip olur. Nasıl uygulamayı seçtiklerine bağlıdır.

Millet bazen dma'nın özgür olduğu yönündeki yanlış varsayımlara sahiptir. Cpu ile paylaşılıyorsa (nihayetinde cpu'nun konuşabileceği bir kaynakla konuştuğu gibi) hala otobüs süresini tüketmez, o zaman cpu ve / veya dma kapalı tutulur, bu yüzden cpu hala beklemek zorundadır zaman, bazı uygulamalarda (muhtemelen mikrodenetleyiciniz değil) dma tamamlanana kadar cpu tamamen kapalı tutulur, cpu süre boyunca durdurulur. Sadece uygulamaya bağlıdır. Bunun ücretsiz kısmı, cpu'nun sürekli olarak kesintiye uğraması veya bazı olayların veri beslemesi için nefesini yoklaması veya nefesini tutması gerekmemesidir. Üzerinde dma yapılacak bir sonraki arabelleğin oluşturulması zaman alabilir. Dma aktarımının bunu tamamlamasını ve bununla başa çıkmasını izlemek zorundadır, ancak her bayt yerine artık çok bayt, bir miktar veri bloğu olduğunu söylemektedir.

Evrensel bir cevap yok. "Bu bağlıdır" ... kullandığınız şeyin özel tasarımına bağlıdır. Tek bir yonga / kart / sistem tasarımı içinde bile birden fazla dma motoru olabilir ve hepsinin aynı şekilde çalıştığını varsaymak için bir neden yoktur. Her örnek için bunu anlamanız gerekir ve ne yazık ki, çoğu zaman bunu belgelemez veya yeterince iyi belgelemezler. Dolayısıyla, bu bir endişe kaynağıysa, bazı deneyler oluşturmanız gerekebilir.


Gömülü notun bununla hiçbir ilgisi yoktur. dma'nın amacı, muhtemelen cpu için iş yaparak performans elde etmek ve böylece koda sahip olmak zorunda kalmamak ve normalde kullanılmayan otobüs döngülerinden yararlanmak ve orada çalışmaktır. Ayrıca cpu yükü olmadan ideal veri doğru zamanda besleme soru gibi şeyler için. bu avantajlar gömülü olsun ya da olmasın yararlıdır.
old_timer

1

Şimdiye kadar verilen yanıtlar CPU'nun çalışabileceği “hız” ve DMA'nın bundan nasıl fayda sağladığı hakkında konuşuyor. Ancak başka bir husus daha var, güç .

CPU yavaş bir bağlantıda bir veri paketi göndermek isterse, yoklama veya kesmeler kullanılıyorsa çoğu zaman uyanık olması gerekir, ancak DMA yapılırken ana CPU uyku durumunda olabilir .


0

STM32H7 serisi gibi bazı işlemciler çok fazla RAM seçeneğine ve birleştirilmiş yakın RAM yığınlarına sahiptir. Ayrı RAM bankalarına sahip olmak, DMA'nın çok fazla RAM çekmesine izin verirken, işlemci, önbellek gerektirmeyen ve DMA tarafından dövülmeyen yakın bağlantılı ram'da veri işlerken. Verileri hareket ettirmek için MDMA'yı kullanabilirsiniz. Bunlardan birini kullanarak bir FMCW radar seti oluşturdum. ADC'ler IQ verilerini iki girişten bir SRAM'a alır. Daha sonra verileri ölçeklendirir ve dtcm ram'da kayan nokta 256 bin karmaşık fft gerçekleştiririm. Daha sonra sonucu MDMA kullanarak AXI ram içinde 2d diziye FIFO.

Hız vektörü için fifo boyunca ikinci bir fft 64 bölmesi alıyorum. Daha sonra karmaşık verilerin büyüklüğünü yaparım ve elde edilen veri 128 ve 64 kayan nokta değerlerini, algılama için 12.5 MHz'de SPI kullanarak başka bir H7'ye gönderirim. Bunların hepsini 4 ms'de yapıyorum.

ADC'nin örnekleme oranı 84 kHz'dir ve aşırı örnekleme kullanarak yaklaşık 18 bit çözünürlük elde ediyorum.

Sadece MHz aralığında çalışan ve harici RAM olmadan genel amaçlı bir işlemci için fena değil.

Ayrıca bu cihazın geniş önbellek performansı gelişmiş dtcm dışındaki kireçler için de yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.