जबकि डीएमए सीपीयू से छुटकारा दिलाता है और इस प्रकार एक ही कोर पर चल रहे अन्य बाधित-संचालित अनुप्रयोगों की विलंबता को कम कर सकता है, इसके साथ जुड़े लागतें हैं:
केवल डीएमए चैनलों की एक सीमित मात्रा है और उन सीमाओं पर सीमाएं हैं कि कैसे चैनल विभिन्न बाह्य उपकरणों के साथ बातचीत कर सकते हैं। उसी चैनल पर एक और परिधीय डीएमए उपयोग के लिए अधिक अनुकूल हो सकता है।
उदाहरण के लिए, यदि आपके पास प्रत्येक 5ms में एक थोक I2C स्थानांतरण है, तो यह UART2 पर आने वाले एक सामयिक डिबग कमांड की तुलना में डीएमए के लिए बेहतर उम्मीदवार की तरह लगता है।
डीएमए की स्थापना और रखरखाव अपने आप में एक लागत है। (आम तौर पर, DMA की स्थापना सामान्य प्रति-वर्ण व्यवधान-चालित स्थानांतरण को स्थापित करने की तुलना में अधिक जटिल मानी जाती है, स्मृति प्रबंधन के कारण, अधिक परिधीय शामिल, DMA स्वयं को बाधित करता है और संभावना है कि आपको DMA के बाहर पहले कुछ वर्णों को पार्स करने की आवश्यकता है वैसे भी, नीचे देखें।)
डीएमए अतिरिक्त शक्ति का उपयोग कर सकता है , क्योंकि यह अभी तक कोर का एक और-डोमेन है जिसे क्लॉक किए जाने की आवश्यकता है। दूसरी ओर, आप CPU को स्थगित कर सकते हैं जबकि DMA स्थानांतरण प्रगति पर है, यदि कोर उस का समर्थन करता है।
डीएमए के साथ काम करने के लिए मेमोरी बफ़र्स की आवश्यकता होती है (जब तक कि आप परिधीय-से-परिधीय डीएमए नहीं कर रहे हैं), इसलिए इसके साथ कुछ स्मृति लागत जुड़ी हुई है।
( प्रति वर्ण अवरोध का उपयोग करते समय मेमोरी लागत भी हो सकती है , लेकिन यह मुझे बहुत छोटा या गायब कर सकता है यदि संदेशों को बीच में ही सही व्याख्या की जाती है।)
डीएमए एक विलंबता पैदा करता है क्योंकि स्थानांतरण पूर्ण / आधा पूरा होने पर सीपीयू केवल सूचना देता है (अन्य उत्तर देखें)।
रिंग बफर में / से डेटा स्ट्रीमिंग करते समय, आपको पहले से पता होना चाहिए कि आपको कितना डेटा प्राप्त / भेज रहा है।
इसका मतलब यह हो सकता है कि प्रति-चरित्र अवरोधों का उपयोग करके किसी संदेश के पहले पात्रों को संसाधित करने की आवश्यकता है: उदाहरण के लिए, जब एक XBee के साथ इंटरफेस करते हैं, तो आप पहले पैकेट प्रकार और आकार पढ़ेंगे और फिर एक आवंटित बफर में डीएमए हस्तांतरण को ट्रिगर करेंगे।
अन्य प्रोटोकॉल के लिए, यह बिल्कुल भी संभव नहीं हो सकता है, यदि वे केवल एंड-ऑफ-मैसेज सीमांकक का उपयोग करते हैं: उदाहरण के लिए, पाठ-आधारित प्रोटोकॉल जो '\n'
सीमांकक के रूप में उपयोग करते हैं । (जब तक DMA परिधीय किसी वर्ण पर मिलान का समर्थन नहीं करता है।)
जैसा कि आप देख सकते हैं, यहां पर विचार करने के लिए बहुत सारे व्यापार हैं। कुछ हार्डवेयर सीमाओं (चैनलों की संख्या, अन्य बाह्य उपकरणों के साथ संघर्ष, पात्रों पर मेल) से संबंधित हैं, कुछ प्रयोग किए गए प्रोटोकॉल पर आधारित हैं (सीमांकक, ज्ञात लंबाई, मेमोरी बफ़र्स)।
कुछ वास्तविक प्रमाण जोड़ने के लिए, मैंने इन सभी व्यापार-बंदियों का सामना एक शौक परियोजना में किया है, जिसमें बहुत अलग प्रोटोकॉल के साथ कई अलग-अलग बाह्य उपकरणों का उपयोग किया गया था। बनाने के लिए कुछ ट्रेड-ऑफ थे, ज्यादातर इस सवाल पर आधारित थे कि "मैं कितना डेटा स्थानांतरित कर रहा हूं और मैं कितनी बार ऐसा करने जा रहा हूं?"। यह अनिवार्य रूप से आपको सीपीयू पर सरल बाधित-चालित हस्तांतरण के प्रभाव पर एक मोटा अनुमान देता है। मैंने इस प्रकार हर 5 सेकंड UART ट्रांसफर पर उक्त I2C ट्रांसफर को प्राथमिकता दी, जो उसी DMA चैनल का उपयोग करता था। एक और UART ट्रांसफर अधिक बार हो रहा है और दूसरी ओर अधिक डेटा के साथ एक और I2C ट्रांसफर को प्राथमिकता मिली है जो कि शायद ही कभी होता है। यह सब व्यापार-बंद है।
बेशक, डीएमए का उपयोग करने के फायदे भी हैं, लेकिन यह वह नहीं है जो आपने मांगा था।