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:
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.
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.
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.