Mặc dù DMA làm giảm CPU và do đó có thể giảm độ trễ của các ứng dụng điều khiển ngắt khác chạy trên cùng lõi, có các chi phí liên quan đến nó:
Chỉ có một số lượng hạn chế các kênh DMA và có những hạn chế về cách các kênh đó có thể tương tác với các thiết bị ngoại vi khác nhau. Một thiết bị ngoại vi khác trên cùng một kênh có thể phù hợp hơn cho việc sử dụng DMA.
Ví dụ: nếu bạn có chuyển I2C số lượng lớn cứ sau 5ms, thì đây có vẻ là ứng cử viên tốt hơn cho DMA so với lệnh gỡ lỗi không thường xuyên đến trên UART2.
Thiết lập và duy trì DMA là một chi phí của chính nó. . dù sao, xem bên dưới.)
DMA có thể sử dụng năng lượng bổ sung , vì nó là một miền khác của lõi cần được đặt xung nhịp. Mặt khác, bạn có thể tạm dừng CPU trong khi quá trình chuyển DMA đang diễn ra, nếu lõi hỗ trợ điều đó.
DMA yêu cầu bộ đệm hoạt động với (trừ khi bạn đang thực hiện DMA ngoại vi đến ngoại vi), do đó, có một số chi phí bộ nhớ liên quan đến nó.
(Chi phí bộ nhớ có thể cũng có mặt ở đó khi sử dụng ngắt mỗi nhân vật, nhưng nó cũng có thể tôi nhỏ hơn nhiều hoặc biến mất ở tất cả nếu các thông điệp được giải thích ngay lập tức bên trong ngắt.)
DMA tạo độ trễ vì CPU chỉ được thông báo khi quá trình truyền hoàn thành / hoàn thành một nửa (xem các câu trả lời khác).
Ngoại trừ khi truyền dữ liệu vào / từ bộ đệm vòng, bạn cần biết trước số lượng dữ liệu bạn sẽ nhận / gửi.
Điều này có thể có nghĩa là cần xử lý các ký tự đầu tiên của tin nhắn bằng cách sử dụng các ngắt cho mỗi ký tự: ví dụ: khi giao tiếp với XBee, trước tiên bạn sẽ đọc loại và kích thước gói và sau đó kích hoạt chuyển DMA vào bộ đệm được phân bổ.
Đối với các giao thức khác, điều này có thể hoàn toàn không thể, nếu chúng chỉ sử dụng các dấu phân cách cuối tin nhắn: ví dụ: các giao thức dựa trên văn bản sử dụng '\n'
làm dấu phân cách. (Trừ khi thiết bị ngoại vi DMA hỗ trợ khớp trên một ký tự.)
Như bạn có thể thấy, có rất nhiều sự đánh đổi để xem xét ở đây. Một số có liên quan đến các giới hạn phần cứng (số lượng kênh, xung đột với các thiết bị ngoại vi khác, khớp trên các ký tự), một số dựa trên giao thức được sử dụng (dấu phân cách, độ dài đã biết, bộ đệm).
Để thêm một số bằng chứng giai thoại, tôi đã phải đối mặt với tất cả những sự đánh đổi này trong một dự án sở thích sử dụng nhiều thiết bị ngoại vi khác nhau với các giao thức rất khác nhau. Có một số sự đánh đổi để thực hiện, chủ yếu dựa trên câu hỏi "tôi chuyển bao nhiêu dữ liệu và tôi có thường xuyên làm điều đó không?". Điều này về cơ bản cung cấp cho bạn một ước tính sơ bộ về tác động của chuyển giao điều khiển ngắt đơn giản trên CPU. Do đó, tôi đã ưu tiên chuyển I2C đã nói ở trên cứ sau 5 giây so với chuyển UART cứ sau vài giây sử dụng cùng một kênh DMA. Một lần chuyển UART khác xảy ra thường xuyên hơn và mặt khác có nhiều dữ liệu hơn được ưu tiên hơn một lần chuyển I2C khác, điều này hiếm khi xảy ra hơn. Đó là tất cả sự đánh đổi.
Tất nhiên, sử dụng DMA cũng có những lợi thế, nhưng đó không phải là điều bạn yêu cầu.