Apa gunanya DMA di CPU tertanam?

17

Saya sedang melakukan proyek baru-baru ini dengan mbed (LPC1768), menggunakan DAC untuk menghasilkan berbagai gelombang. Saya membaca bagian dari lembar data, dan berbicara tentang bagaimana ia memiliki DMA untuk banyak perangkat. Ini sepertinya akan berguna, tetapi pada bacaan lebih lanjut, saya menemukan bahwa DMA menggunakan bus data yang sama dengan cpu (yang saya kira normal). Apakah ini berarti CPU tidak dapat berinteraksi dengan semua memori saat DAC mendapatkan data? Juga, karena DAC tidak memiliki buffer (sejauh yang saya tahu) dan karena itu harus sering ke DMA, apa gunanya DMA? Jika CPU tidak dapat melakukan transaksi memori, dapatkah ia melakukan apa saja?

BeB00
sumber
8
Saya sarankan Anda melihat fitur-fitur CPU Anda dan jika itu dapat melakukan hal lain selain mengakses memori. Saya telah mendengar tentang beberapa CPU yang dapat melakukan hal-hal seperti keputusan atau perhitungan, tidak yakin apakah ini sama sekali ..
PlasmaHH
Haruskah CPU menghabiskan waktu mentransfer data ke port I / O atau mendelegasikan tugas ke perangkat khusus?
StainlessSteelRat
Ya CPU dapat melakukan hal-hal lain, tetapi dalam sistem tertanam mungkin menghabiskan banyak waktunya berinteraksi dengan periferal, terutama port I / O. Bukankah lebih masuk akal untuk memiliki bus data tambahan hanya untuk DMA? Atau apakah itu biasanya tidak perlu? Situasi di mana Anda ingin bus tambahan adalah ketika Anda mencoba untuk mendorong batas-batas perangkat keras Anda, yang saya asumsikan adalah ketika Anda ingin menggunakan DMA?
BeB00
1
Contoh sederhana, misalkan Anda ingin melakukan banyak pencetakan informasi ke port serial. Anda dapat duduk dan menunggu setiap byte dikirim (lambat), menyalinnya ke buffer dan kemudian menggunakan interupsi pada CPU untuk mengirim setiap byte ketika port sudah siap (banyak pergantian konteks = lambat), atau salin ke buffer dan biarkan pengontrol DMA mengatur waktu data keluar saat CPU sibuk melakukan hal-hal lain (bisa lebih cepat).
Tom Carpenter
2
Melihat sampul EDN sekali yang menunjukkan gambar seorang pria mengenakan sepatu besar, tiga kaki panjang, dan judul, "Jika itu sepatu, pakai itu." Intinya adalah, Jika suatu bagian melakukan sepuluh hal yang tidak Anda butuhkan, dan satu hal yang Anda butuhkan, dan harga, jejak, dan anggaran daya semuanya sesuai, maka Anda hanya perlu menggunakannya, dan tidak membuang waktu Anda mencari sesuatu dengan lebih sedikit fitur.
Solomon Lambat

Jawaban:

17

The LPC1768 datasheet saya menemukan memiliki kutipan berikut (penekanan):

Pengontrol DMA Tujuan Umum (GPDMA) delapan saluran pada matriks multilayer AHB yang dapat digunakan dengan SSP, I2S-bus, UART, peripheral konverter Analog-ke-Digital dan Digital-ke-Analog, sinyal pencocokan waktu, dan untuk memori-ke -pemindahan memori.

Split APB bus memungkinkan throughput tinggi dengan beberapa kios antara CPU dan DMA

Diagram blok pada halaman 6 menunjukkan SRAM dengan beberapa saluran antara matriks AHB dan kutipan berikut mendukung ini:

LPC17xx mengandung total memori statis statis 64-kb 64 kB. Ini termasuk SRAM 32 kB utama, dapat diakses oleh pengontrol CPU dan DMA pada bus berkecepatan lebih tinggi, dan dua tambahan 16 kB setiap blok SRAM yang terletak pada port slave terpisah pada matriks multilayer AHB. Arsitektur ini memungkinkan akses CPU dan DMA tersebar di tiga RAM terpisah yang dapat diakses secara bersamaan

Dan ini diperkuat oleh kutipan berikut:

GPDMA memungkinkan transaksi perangkat-ke-memori, memori-ke-perangkat, perangkat-ke-perangkat, dan memori-ke-memori.

Oleh karena itu Anda dapat mengalirkan data ke DAC Anda dari salah satu blok SRAM yang terpisah atau dari perangkat yang berbeda, sambil menggunakan SRAM utama untuk fungsi lainnya.

Jenis DMA periferal-periferal ini biasa terjadi di bagian yang lebih kecil di mana antarmuka memori cukup sederhana (dibandingkan dengan yang dikatakan prosesor Intel modern).

David
sumber
Ahh, terima kasih, aku tidak menyadari itu mungkin, aku agak baru di DMA. Apakah itu menyiratkan bahwa cpu dapat mengakses perangkat sementara DAC mengakses SRAM yang terpisah?
BeB00
1
Ya - inilah tepatnya untuk matriks AHB. Ini memungkinkan pengontrol yang berbeda (CPU, DMA, periferal tertentu seperti ethernet dan USB) untuk mengakses hal-hal yang berbeda secara bersamaan. Inilah sebabnya mengapa ada beberapa 'port' ke SRAM.
David
Ya, AHB di makhluk kecil murah ini memberikan bandwidth memori gila karena bank memori paralel: Anda dapat memiliki ethernet, USB2 dan semuanya berjalan pada throughput maks dan cpu bahkan tidak memperhatikan ...
peufeu
Juga kode ibu jari dapat memasukkan 2 instruksi dalam satu kata 32-bit, sehingga cpu mungkin tidak perlu mengakses bus yang sering ketika melakukan matematika atau operasi yang sebagian besar melibatkan register ... Di sisi lain, saya pikir M3 dan M4 dapat lakukan beberapa akses memori per jam (instruksi dan data) karena memiliki beberapa bus.
peufeu
30

Yang panjang dan pendek adalah bahwa DMA memungkinkan CPU untuk berperilaku efektif pada kecepatan aslinya, sedangkan periferal dapat secara efektif berperilaku pada kecepatan asli mereka. Sebagian besar angka dalam contoh dibuat.

Mari kita bandingkan dua opsi untuk mengumpulkan data secara berkala dari ADC:

  1. Anda dapat mengatur ADC sebagai bagian dari interupsi (periodik atau lainnya)
  2. Anda dapat membuat buffer, dan memberi tahu DMA untuk mentransfer pembacaan ADC ke buffer.

Mari mentransfer 1000 sampel dari ADC ke RAM.

Menggunakan opsi 1: Untuk setiap sampel ada

  • 12 siklus dihabiskan untuk memasuki interupsi
  • baca adc
  • simpan di ram
  • 12 siklus dihabiskan untuk keluar dari interupsi

Mari kita berpura-pura bahwa fungsi interupsi ini adalah 76 instruksi, keseluruhan rutin adalah 100 instruksi panjang, dengan asumsi eksekusi siklus tunggal (kasus terbaik). Itu berarti opsi 1 akan menghabiskan 100.000 siklus waktu pelaksanaan CPU.

Opsi 2: DMA dikonfigurasikan untuk mengumpulkan 1000 sampel ADC. Mari kita asumsikan ADC memiliki pemicu perangkat keras dari penghitung waktu.

  • ADC dan DMA mentransfer 1000 sampel data ke ram
  • DMA mengganggu CPU Anda setelah 1000 sampel
  • 12 siklus dihabiskan untuk memasuki interupsi
  • Kode terjadi (misalkan memberitahu DMA untuk menimpa RAM)
  • 12 siklus dihabiskan untuk keluar dari interupsi

Berpura-pura seluruh gangguan (dengan masuk dan keluar overhead) adalah 100 instruksi satu siklus. Dengan menggunakan DMA, Anda hanya menghabiskan 100 siklus untuk menyimpan 1000 sampel yang sama.

Sekarang, setiap kali DMA mengakses bus, ya, mungkin ada perselisihan antara CPU dan DMA. CPU bahkan mungkin terpaksa menunggu sampai DMA selesai. Tetapi menunggu DMA selesai jauh lebih pendek daripada mengunci CPU untuk melayani ADC. Jika clock core CPU adalah 2x Bus clock, maka CPU mungkin membuang beberapa siklus core menunggu DMA selesai. Ini berarti bahwa waktu eksekusi transfer Anda yang efektif adalah antara 1000 (dengan asumsi CPU tidak pernah menunggu) dan 9000 siklus. Masih WAY lebih baik dari 100.000 siklus.

pgvoorhees
sumber
2
Penting untuk dicatat bahwa RAM bukan satu-satunya tempat CPU dapat menyimpan data. Secara umum CPU memuat data dari RAM ke dalam register sebelum mengerjakannya.
Aron
Yah, benar sekali. Contoh saya murni sketsa kasar.
pgvoorhees
Banyak mikrokontroler juga memiliki bus multilayer sehingga operasi bersamaan dimungkinkan. Misalnya: adc-> ram dan flash-> daftar pada saat bersamaan. Juga, banyak instruksi lebih panjang dari 1 jam, jadi ada banyak waktu untuk DMA.
Jeroen3
9

Jika pada siklus tertentu prosesor dan pengontrol DMA perlu mengakses bus yang sama, satu atau yang lain harus menunggu. Banyak sistem, bagaimanapun, mengandung banyak area memori dengan bus terpisah bersama dengan "jembatan" bus yang akan memungkinkan CPU untuk mengakses satu memori sementara pengontrol DMA mengakses yang lain.

Lebih lanjut, banyak CPU mungkin tidak perlu mengakses perangkat memori pada setiap siklus. Jika CPU biasanya hanya perlu mengakses memori pada dua dari tiga siklus, perangkat DMA prioritas rendah mungkin dapat mengeksploitasi siklus ketika bus memori idle.

Bahkan dalam kasus di mana setiap siklus DMA akan menyebabkan CPU terhenti untuk suatu siklus, bagaimanapun, DMA mungkin masih sangat membantu jika data tiba pada tingkat yang cukup lambat sehingga CPU harus dapat melakukan hal-hal lain antara item data yang masuk , tetapi cukup cepat sehingga overhead per item perlu diminimalkan. Jika port SPI mengumpankan data ke perangkat dengan kecepatan satu byte setiap 16 siklus CPU, misalnya, menginterupsi CPU untuk setiap transfer kemungkinan akan menyebabkannya menghabiskan hampir seluruh waktunya untuk masuk dan kembali dari rutinitas layanan interupsi dan tidak ada. melakukan pekerjaan yang sebenarnya. Namun, menggunakan DMA, overhead dapat dikurangi hingga 13% bahkan jika setiap transfer DMA menyebabkan CPU macet selama dua siklus.

Akhirnya, beberapa CPU memungkinkan DMA untuk dilakukan saat CPU tertidur. Menggunakan transfer berbasis interupsi akan mensyaratkan bahwa sistem bangun sepenuhnya untuk setiap unit data yang ditransfer. Namun, menggunakan DMA, pengontrol tidur dapat memberi makan pengontrol memori beberapa jam setiap kali byte masuk tetapi membiarkan yang lainnya tetap tidur, sehingga mengurangi konsumsi daya.

supercat
sumber
1
Bagian Cortex-M seperti LPC1768 memiliki jalur memori yang berbeda dari flash ke decoder instruksi, jadi pada kenyataannya operasi register-to-register dapat berarti CPU dapat menjalankan banyak instruksi antara waktu ketika membutuhkan akses ke memori data.
Chris Stratton
5

Sebagai seorang programmer, DMA adalah opsi untuk mentransfer data ke dan dari periferal yang mendukungnya. Untuk contoh klasik dari memindahkan buffer besar melalui perangkat serial seperti SPI atau UART, atau mengumpulkan sejumlah sampel dari ADC, Anda memiliki tiga metode untuk memindahkan data tersebut:

  1. Metode pemungutan suara. Di sinilah Anda menunggu pada flag register untuk memungkinkan Anda menggeser masuk / keluar byte berikutnya. Masalahnya adalah Anda menahan semua eksekusi CPU sambil menunggu ini. Atau, jika Anda harus berbagi waktu CPU dalam sistem operasi, maka transfer Anda akan melambat secara drastis.

  2. Metode interupsi. Di sinilah Anda menulis layanan interupsi rutin (ISR) yang dijalankan dengan setiap transfer byte dan Anda menulis kode dalam ISR yang mengelola transfer. Ini lebih hemat CPU karena CPU hanya akan melayani ISR ​​Anda saat diperlukan. Ini gratis untuk digunakan setiap saat kecuali di ISR. ISR juga merupakan salah satu opsi yang lebih cepat untuk melakukan transfer dalam hal kecepatan transfer.

  3. DMA. Anda mengkonfigurasi DMA dengan pointer sumber / tujuan, jumlah transfer dan segera pergi. Ini akan mencuri siklus bus dan waktu CPU untuk menyelesaikan transfer, dan CPU bebas untuk melakukan hal-hal lain dalam waktu yang berarti. Anda dapat mengonfigurasi bendera atau menyela untuk menunjukkan kapan transfer dilakukan. Ini biasanya sentuhan lebih cepat dari ISR ​​dan biasanya opsi transfer tercepat Anda.

Sebagai seorang programmer, saya lebih suka DMA karena ini adalah kode yang paling mudah dan pada dasarnya adalah teknik tercepat untuk melakukan transfer. Biasanya, Anda hanya perlu mengkonfigurasi register pasangan untuk pointer sumber / tujuan dan jumlah transfer untuk membuat dan menonaktifkannya. Saya menghabiskan lebih banyak jam bekerja dalam kode ISR daripada yang saya lakukan dalam kode akselerasi DMA karena kode ISR memerlukan keterampilan desain kritis dan harus dikodekan, diuji, diverifikasi, dll. Kode DMA jauh lebih kecil dan kode yang harus saya tulis sendiri relatif sepele, dan saya mendapatkan kecepatan transfer maksimum dalam tawar-menawar.

Dalam pengalaman saya, akhir-akhir ini dengan prosesor Atmel SAM3 / 4, DMA menjalankan sentuhan lebih cepat daripada ISR efisien dari kerajinan saya sendiri. Saya punya aplikasi yang akan membaca setumpuk byte dari SPI setiap 5 msec. Banyak matematika floating point terjadi dalam tugas latar belakang jadi saya ingin CPU menjadi sebebas mungkin untuk tugas-tugas itu. Implementasi awalnya adalah ISR, dan saya kemudian pindah ke DMA untuk membandingkan dan mencoba membeli lebih banyak waktu CPU di antara sampel. Gain kecepatan transfer sedikit ditingkatkan, tetapi hanya sedikit. Itu nyaris tidak terukur pada o-scope.

Itu karena pada mikroprosesor baru-baru ini yang pernah saya lihat, ISR dan DMA beroperasi dengan cara yang hampir sama - mereka mengambil siklus CPU seperti yang diperlukan dan DMA pada dasarnya melakukan operasi yang sama dengan CPU seperti yang saya lakukan pada ISR yang efisien. .

Dalam kasus yang jarang terjadi, saya telah melihat peripheral yang memiliki area RAM sendiri yang HANYA dapat diakses oleh DMA. Ini pada MAC Ethernet atau USB.

Smith
sumber
3

DMA kemungkinan besar digunakan di sini sehingga DAC dapat memiliki waktu yang teratur, menghasilkan bentuk gelombang dengan mengubah output analog pada beberapa interval yang diketahui.

Ya jika itu adalah bus bersama maka ... Anda harus berbagi.

CPU tidak selalu menggunakan bus, sehingga terkadang ide yang baik untuk berbagi dengan mesin dma. Dan tentu saja itu berarti prioritas terlibat, kadang-kadang hanya siapa yang sampai di sana lebih dulu (misalnya memiliki perintah fifo di depan sumber daya, dan memenuhi permintaan, dalam urutan mereka tiba, ya itu belum tentu deterministik ). Dalam kasus seperti ini, Anda mungkin ingin dma memiliki prioritas di atas cpu sehingga hal-hal yang sensitif waktu seperti DAC atau ADC memiliki penentuan waktu yang pasti. Tergantung pada bagaimana mereka memilih untuk mengimplementasikannya.

Orang-orang kadang-kadang memiliki asumsi yang sering salah bahwa dma gratis. Bukannya masih menghabiskan waktu bus, jika dibagikan dengan cpu (yang akhirnya adalah saat ia berbicara dengan sumber daya cpu dapat berbicara dengan) maka cpu dan / atau dma ditahan, sehingga cpu masih harus menunggu beberapa waktu, dalam beberapa implementasi (mungkin bukan mikrokontroler Anda) cpu benar-benar tertunda sampai dma selesai, cpu dihentikan selama durasi. Tergantung dari implementasinya saja. Bagian bebasnya adalah bahwa cpu tidak harus terus-menerus terganggu atau polling atau menahan napas untuk beberapa peristiwa untuk memberi makan data. Butuh waktu untuk membuat buffer berikutnya ke dma. Memang harus memperhatikan transfer dma untuk menyelesaikan dan menangani itu tetapi alih-alih mengatakan setiap byte sekarang banyak byte, beberapa blok data.

Tidak ada satu jawaban universal. "Itu tergantung" ... pada desain spesifik dari hal spesifik yang Anda gunakan. Bahkan dalam satu chip / board / desain sistem mungkin ada beberapa mesin dma dan tidak ada alasan untuk menganggap mereka semua bekerja dengan cara yang sama. Untuk setiap contoh Anda harus mencari tahu, dan sayangnya, mereka sering tidak mendokumentasikannya atau mendokumentasikannya dengan cukup baik. Jadi, Anda mungkin harus membuat beberapa percobaan jika itu menjadi masalah.

old_timer
sumber
note tertanam tidak ada hubungannya dengan itu. titik dma adalah untuk mendapatkan kinerja dengan melakukan pekerjaan untuk CPU sehingga tidak harus memiliki kode, dan untuk mengambil keuntungan dari siklus bus yang biasanya tidak digunakan dan melakukan pekerjaan di sana. Juga untuk hal-hal seperti dalam pertanyaan Anda tentang memberi makan data pada waktu yang tepat idealnya tanpa biaya tambahan CPU. kelebihan ini bermanfaat tertanam atau tidak.
old_timer
1

Jawaban sejauh ini berbicara tentang "kecepatan" yang dapat dilakukan CPU dan bagaimana DMA menguntungkannya. Namun ada pertimbangan lain, kekuatan .

Jika CPU ingin mengirim paket data pada tautan lambat, ia harus tetap terjaga untuk sebagian besar waktu jika menggunakan polling atau interupsi, namun CPU utama mungkin bisa dalam kondisi tidur ketika DMA sedang dilakukan .

Ian Ringrose
sumber
0

Beberapa prosesor seperti seri STM32H7 memiliki banyak opsi RAM dan banyak RAM yang ditambah erat. Memiliki bank RAM yang terpisah memungkinkan DMA memalu satu banyak RAM sementara prosesor memproses data dalam ram dekat yang tidak memerlukan caching dan tidak dipalu oleh DMA. Untuk memindahkan data, Anda dapat menggunakan MDMA. Saya membangun satu set radar FMCW menggunakan salah satunya. ADC mendapatkan data IQ dari dua input menjadi satu SRAM. Saya kemudian skala data dan melakukan floating point 256 bin fft kompleks di dtcm ram. Kemudian FIFO hasilnya menjadi array 2d di AXI ram menggunakan MDMA.

Saya mengambil fft 64 bin kedua melintasi fifo untuk vektor kecepatan. Saya kemudian melakukan besarnya data kompleks dan mengirimkan data 128 & 64 nilai floating point yang dihasilkan ke H7 lain menggunakan SPI pada 12,5 MHz untuk deteksi. Saya melakukan semua ini dalam 4 ms.

Laju pengambilan sampel ADC adalah 84 kHz dan menggunakan oversampling saya mendapatkan resolusi sekitar 18 bit.

Lumayan untuk keperluan umum prosesor hanya berjalan di kisaran MHz dan tanpa RAM eksternal.

Juga cache besar pada perangkat ini telah meningkatkan kinerja untuk calc di luar dtcm juga.

Rob Garnett
sumber