Sementara DMA mengurangi CPU dan dengan demikian dapat mengurangi latensi aplikasi-aplikasi berbasis-interupsi yang berjalan pada inti yang sama, ada biaya yang terkait dengannya:
Hanya ada jumlah saluran DMA yang terbatas dan ada batasan tentang bagaimana saluran-saluran itu dapat berinteraksi dengan periferal yang berbeda. Perangkat lain pada saluran yang sama mungkin lebih cocok untuk penggunaan DMA.
Misalnya, jika Anda memiliki transfer I2C massal setiap 5ms, ini sepertinya kandidat yang lebih baik untuk DMA daripada perintah debug sesekali yang tiba di UART2.
Menyiapkan dan memelihara DMA adalah biaya dengan sendirinya. (Biasanya, pengaturan DMA dianggap lebih kompleks daripada pengaturan transfer antar-drive normal per-karakter, karena manajemen memori, lebih banyak periferal yang terlibat, DMA menggunakan interupsi sendiri dan kemungkinan Anda perlu mengurai beberapa karakter pertama di luar DMA Bagaimanapun, lihat di bawah.)
DMA dapat menggunakan daya tambahan , karena itu adalah domain lain dari inti yang perlu di-clock. Di sisi lain, Anda dapat menangguhkan CPU saat transfer DMA sedang berlangsung, jika inti mendukungnya.
DMA membutuhkan buffer memori untuk bekerja dengan (kecuali Anda melakukan DMA periferal), sehingga ada beberapa biaya memori yang terkait dengannya.
(Biaya memori mungkin juga ada ketika menggunakan interupsi per karakter, tetapi mungkin juga saya jauh lebih kecil atau lenyap sama sekali jika pesan ditafsirkan langsung di dalam interupsi.)
DMA menghasilkan latensi karena CPU hanya akan diberitahukan ketika transfer selesai / setengah selesai (lihat jawaban lainnya).
Kecuali saat mengalirkan data ke / dari buffer cincin, Anda harus tahu sebelumnya berapa banyak data yang akan Anda terima / kirim.
Ini mungkin berarti bahwa diperlukan untuk memproses karakter pertama dari pesan menggunakan interupsi per karakter: misalnya, ketika berinteraksi dengan XBee, Anda pertama-tama akan membaca jenis dan ukuran paket dan kemudian memicu transfer DMA ke buffer yang dialokasikan.
Untuk protokol lain, ini mungkin tidak mungkin sama sekali, jika mereka hanya menggunakan pembatas akhir pesan: misalnya, protokol berbasis teks yang digunakan '\n'
sebagai pembatas. (Kecuali jika perangkat DMA mendukung pencocokan pada karakter.)
Seperti yang Anda lihat, ada banyak pertukaran untuk dipertimbangkan di sini. Beberapa terkait dengan keterbatasan perangkat keras (jumlah saluran, konflik dengan periferal lain, pencocokan karakter), beberapa didasarkan pada protokol yang digunakan (pembatas, panjang yang diketahui, buffer memori).
Untuk menambahkan beberapa bukti anekdotal, saya telah menghadapi semua pertukaran ini dalam sebuah proyek hobi yang menggunakan banyak perangkat berbeda dengan protokol yang sangat berbeda. Ada beberapa trade-off yang harus dibuat, sebagian besar didasarkan pada pertanyaan "berapa banyak data yang saya transfer dan seberapa sering saya akan melakukan itu?". Ini pada dasarnya memberi Anda perkiraan kasar tentang dampak transfer interrupt-driven sederhana pada CPU. Dengan demikian saya memberikan prioritas pada transfer I2C tersebut di atas setiap 5ms selama transfer UART setiap beberapa detik yang menggunakan saluran DMA yang sama. Transfer UART lain terjadi lebih sering dan dengan lebih banyak data di sisi lain mendapat prioritas daripada transfer I2C lain yang lebih jarang terjadi. Ini semua kompromi.
Tentu saja, menggunakan DMA juga memiliki kelebihan, tapi bukan itu yang Anda minta.