Kysymys:
Kuinka nopea GPIO + DMA on? Multi I2S -tulo
adiblol
2013-09-18 07:56:44 UTC
view on stackexchange narkive permalink

Haluan liittää useita I2S-ADC: itä RaspberryPiin ja tallentaa monikanavaista ääntä. Laskin, että se vaatii GPIO-tuloportin kopioimisen RAM-muistiin 3072 kHz: n välein (tai 0,33 µs välein). Haluan tehdä sen DMA: lla.

Tiedän, että PiBlaster (PWM) ja PiFM (radiolähetin) käyttävät DMA: ta, mutta pienin näytteenottojakso oli noin 4µs.

Onko GPIO: n lukeminen 3072 kHz: ssä mahdollista DMA: n avulla?

Yksityiskohtaiset laskelmat, miksi tarvitsen 3072 kHz: n, ovat RaspberryPi-foorumilla: http://www.raspberrypi.org /phpBB3/viewtopic.php?f=44&t=55799. Kysyn tässä vain GPIO- ja DMA-suorituksista.

Ehdotan tämän kysymyksen esittämistä elektroniikkapinoiden vaihdossa. Siellä on joitain kokeneita kavereita, jotka voivat auttaa sinua.
Kuuluu elektroniikan vaihtoon
Kolme vastused:
Philip Ashmore
2013-10-24 03:20:56 UTC
view on stackexchange narkive permalink

Kirjoitin C ++ -kirjaston nimeltä v3c-raspi. Voit ladata sen osoitteesta SourceForge.

Kirjoitin esimerkkiohjelman, joka yrittää tehdä juuri haluamasi, nimeltään " i2s ".

Valitettavasti se kokee" ohjelma-anomalian "missä tahansa hetkessä muutamaan sekuntiin sen alkamisen jälkeen - näyttää siltä, ​​että jokin muu käyttää dma-kanavaa 0 ja jättää roskat lohkon osoiterekisteriin.

Voisin saada Raspberry Pi: n käsittelemään noin 16 miljoonaa DMA-ohjauslohkoa sekunnissa (toisessa testissä).

i2s-mikrofonit, joita aion käyttää, ovat analogiset laitteet ADMP441, jotka tuottaa 24-bittistä ääntä.

48 kHz: n bittikellotaajuus on 48000 x 32 = 1,536 MHz. Koodi vaihtaa kelloa myös dma: n avulla, joten kaksinkertaistamme taajuuden 3,072 MHz: iin.

Lisää PWM-taukoja ja kaksinkertaistat ohjauslohkojen lukumäärän uudelleen 6,144 miljoonaan, silti selvästi 16 miljoonan sisällä, jonka voisin päästä ulos RPI: stä.

Ilmoitin virheestä juuri tästä asiasta Raspbianille, mutta ei vastauksia y et.

Olen ratkaissut suurimman osan ongelmista - katso linux-rpi-ytimen postituslista 2013-marraskuu, viesti 000734.

Se on rajoitettu noin 2 miljoonaan näytteeseen sekunnissa, joten sinä pystyi sieppaamaan 22,1 kHz: n näytteitä 8 stereoparista.

On luettelo GPU: n käyttämistä DMA-kanavista. Olen melko varma, että kanavaa 0 käytetään näytössä.
Määritä cmdline.txt-tiedostossa, mitä DMA-kanavia ydin (ja sen moduulit) voivat käyttää. Vain Google "dma.dmachans = 0x7f35" lisää.In v3c-raspi / v3c / esimerkit / i2s.cpp kirjoitin muistiin testatut dma-kanavat - etsi "anna käyttäjätilan ohjelmien käyttää DMA 0, 4, 5" Muistan yrittäneeni DMA-kanavaa 0 menestyksekkäästi, mutta olen pimeässä siitä, miten video-kernel-module / GPU / binary-blob hoitaa tämän.
Voimme määritellä mitä haluamme. Kuitenkin, jos käytämme DMA-kanavia 0, 1, 2, 3, 6 tai 7, meillä on ristiriitoja ytimen ja / tai GPU: n kanssa.
Ytimessä tämä välimiesmenettely tapahtuu.
Hender
2015-05-01 20:28:35 UTC
view on stackexchange narkive permalink

Katso vain tämä.

Vadelma-Pi-DMA-esimerkki

https://github.com/Wallacoloo/Raspberry-Pi-DMA-Example

Linkissä selitetään, kuinka DMA: ta käytetään GPIO-lähtöön, OP kysyy syötteestä.
Olet täysin oikeassa, minun vikani. Mutta paljon tietoa DMA: sta.
Nielsvh
2013-10-18 21:41:04 UTC
view on stackexchange narkive permalink

GPIO-nastat eivät pysty käsittelemään tällaisia ​​nopeuksia. Olen havainnut, että GPIO-otsikon suurin lukunopeus on noin 1 kHz. Maksimi, jonka UART pystyy käsittelemään, on noin 1 Mbaud vakaan viestinnän kannalta ja 4 Mbaud on suurin, jonka ydin pystyy käsittelemään. Kaikki yli 1 Mbaud vaatii USB: n tai Ethernet: n. Asiakirjojen mukaan voit käyttää DMA: ta, jonka nopeus on huomattavasti nopeampi kuin UART. Se ohittaa myös suorittimen, mikä tekee toiminnasta halvempaa pitkällä aikavälillä.

Kuinka testasit sen? Oletko kokeillut käyttää mmap-pohjaista käyttöliittymää?
Minulla oli signaaligeneraattori, joka lähetti 'a' 1MBaud: lla ja käytin [täältä] löytyvää mmap-koodia (http://elinux.org/RPi_Low-level_peripherals#C_2) ja luin tiedot hetken silmukassa gcc: n O3-lipulla, joka koodin optimointi, jonka voisin ajatella, ja käynnissä ilman käyttöliittymää. Nopein, mitä se pystyy käsittelemään, on 4Mbaud (ytimen tuki pysähtyy 4Mbaud: lla) -viestit. Jatkuva viestien suoratoisto oli _todella_ hajanaista ja rikkoutunut 1Mbaudin ohi.
SPI pystyy käsittelemään 32Mbps, jos olet varovainen signaalinsiirron suhteen. GPIO-otsikon enimmäisnopeus on luokkaa 10Mbps. En ymmärrä, mikä kirjoitusvirhe olisi voinut johtaa 1 kHz viestiisi.
No, tässä keskustelu koskee DMA: ta. No, joka on selvästi yli 1 kHz.


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...