हमेशा DMA का उपयोग STM32 पर UART के साथ व्यवधान के पक्ष में क्यों नहीं किया जाता है? [बन्द है]


9

मैं पिछले महीने बहुत समय बिता रहा हूं UART (MIDI के लिए) एक STM (STM32F103C8T6) के साथ काम करने के लिए, बहुत अधिक सफलता के बिना, इंटरप्ट का उपयोग करते हुए।

हालांकि, डीएमए का उपयोग करते हुए इस शाम ने काफी तेजी से काम किया।

जहां तक ​​मैंने डीएमए पढ़ा है तेज है और सीपीयू से छुटकारा दिलाता है, तो हमेशा डीएमए का उपयोग इंटरप्ट के पक्ष में क्यों नहीं किया जाता है? विशेष रूप से एसटीएम 32 पर कुछ समस्याएं हैं।

मैं STM32CubeMx / HAL का उपयोग कर रहा हूं।


2
क्यों नहीं? यह या तो एक सवाल है, एक अनुमान लगाने के लिए जो संभव तकनीकी कारण के रूप में, या उसी तरह बहुत व्यापक है, और इसलिए यह एक प्रश्न नहीं है जो यहाँ है। एक यादृच्छिक उदाहरण का नाम देने के लिए, डीएमए का अर्थ होगा डेटा का दावा करने में अधिक विलंबता, खासकर जब तक कि आपको कोई वास्तविक लाभ नहीं मिलता है जब तक आप इसे कई वर्णों को इकट्ठा करने की अनुमति नहीं देते हैं। अक्सर यह ठीक हो सकता है, कभी-कभी यह नहीं हो सकता है।
क्रिस स्ट्रैटन

6
अगर काम में व्यवधान आने में हफ्तों लग गए, तो यह इसलिए है क्योंकि आपने कार्य को गलत तरीके से किया है; डीएमए काम करने में अच्छी तरह से अधिक समय ले सकता है - यह वास्तव में एक अधिक जटिल कार्य है, इसलिए एक से अधिक सरलता से अधिक जटिल कार्य का स्पष्ट रूप से प्रत्येक के साथ मार्गदर्शन के लिए आपके द्वारा उपयोग किए जाने वाले संसाधनों के लिए नीचे आता है, तंत्र ही नहीं।
क्रिस स्ट्रैटन

5
कभी यह मत मानिए कि डीएमए सीपीयू को मुक्त कर देता है, कभी-कभी सीपीयू चलता रहता है, कभी-कभी कोई प्रोसेसर डीएमए इंजन के लिए बस को पकड़ने के लिए जमे हुए नहीं होता है। एक हाथ के कार्यान्वयन के साथ यह करने के लिए तुच्छ, इसलिए कठबोली केवल यह कहती है कि सभी हथियार इस तरह से हैं और सभी x86s इस तरह से या जो भी हैं, यह इतना आसान नहीं है, आपको हमेशा सिस्टम डिज़ाइन की जांच करनी होगी और शायद थोड़ी हैकिंग करनी होगी। आपके पास चिप कोर कोर बहुत अच्छी तरह से मुक्त हो सकती है, यह सिर्फ डीएमए पर एक टिप्पणी है। जहाँ तक आपका सवाल है, समझ में नहीं आता कि आप ऊपर रख सकते हैं और dma + int पूर्ण समाधान की संभावना है यदि आप सिर्फ चुनाव नहीं कर सकते।
old_timer

5
STM32F सीरियल पोर्ट पर इंटरप्ट बहुत मामूली हैं। आप अपने कोड के साथ एक प्रश्न क्यों नहीं पोस्ट करते हैं, इसलिए हम में से कुछ यह जानने की कोशिश कर सकते हैं कि आप गलत कहाँ जा रहे हैं? जब तक यह अंतर्निहित समस्या क्या थी यह समझे बिना काम करता है तो कोड हैक करना कभी भी अच्छा विचार नहीं है।
जॉन

7
मेरी (इतनी नहीं) विनम्र राय में, यह भयानक, प्रफुल्लित घन का उपयोग करने के लिए नीचे की ओर से एक है। सॉफ्टवेयर को स्क्रैच से लिखें, आप वास्तव में सीखेंगे कि UART कैसे काम करता है (क्योंकि आपके पास), आप परिधीय को बेहतर तरीके से समझेंगे और लंबे समय में यह आपको इतना समय बचाएगा।
डायबोस्को

जवाबों:


24

जबकि डीएमए सीपीयू से छुटकारा दिलाता है और इस प्रकार एक ही कोर पर चल रहे अन्य बाधित-संचालित अनुप्रयोगों की विलंबता को कम कर सकता है, इसके साथ जुड़े लागतें हैं:

  • केवल डीएमए चैनलों की एक सीमित मात्रा है और उन सीमाओं पर सीमाएं हैं कि कैसे चैनल विभिन्न बाह्य उपकरणों के साथ बातचीत कर सकते हैं। उसी चैनल पर एक और परिधीय डीएमए उपयोग के लिए अधिक अनुकूल हो सकता है।

    उदाहरण के लिए, यदि आपके पास प्रत्येक 5ms में एक थोक I2C स्थानांतरण है, तो यह UART2 पर आने वाले एक सामयिक डिबग कमांड की तुलना में डीएमए के लिए बेहतर उम्मीदवार की तरह लगता है।

  • डीएमए की स्थापना और रखरखाव अपने आप में एक लागत है। (आम तौर पर, DMA की स्थापना सामान्य प्रति-वर्ण व्यवधान-चालित स्थानांतरण को स्थापित करने की तुलना में अधिक जटिल मानी जाती है, स्मृति प्रबंधन के कारण, अधिक परिधीय शामिल, DMA स्वयं को बाधित करता है और संभावना है कि आपको DMA के बाहर पहले कुछ वर्णों को पार्स करने की आवश्यकता है वैसे भी, नीचे देखें।)

  • डीएमए अतिरिक्त शक्ति का उपयोग कर सकता है , क्योंकि यह अभी तक कोर का एक और-डोमेन है जिसे क्लॉक किए जाने की आवश्यकता है। दूसरी ओर, आप CPU को स्थगित कर सकते हैं जबकि DMA स्थानांतरण प्रगति पर है, यदि कोर उस का समर्थन करता है।

  • डीएमए के साथ काम करने के लिए मेमोरी बफ़र्स की आवश्यकता होती है (जब तक कि आप परिधीय-से-परिधीय डीएमए नहीं कर रहे हैं), इसलिए इसके साथ कुछ स्मृति लागत जुड़ी हुई है।

    ( प्रति वर्ण अवरोध का उपयोग करते समय मेमोरी लागत भी हो सकती है , लेकिन यह मुझे बहुत छोटा या गायब कर सकता है यदि संदेशों को बीच में ही सही व्याख्या की जाती है।)

  • डीएमए एक विलंबता पैदा करता है क्योंकि स्थानांतरण पूर्ण / आधा पूरा होने पर सीपीयू केवल सूचना देता है (अन्य उत्तर देखें)।

  • रिंग बफर में / से डेटा स्ट्रीमिंग करते समय, आपको पहले से पता होना चाहिए कि आपको कितना डेटा प्राप्त / भेज रहा है।

    • इसका मतलब यह हो सकता है कि प्रति-चरित्र अवरोधों का उपयोग करके किसी संदेश के पहले पात्रों को संसाधित करने की आवश्यकता है: उदाहरण के लिए, जब एक XBee के साथ इंटरफेस करते हैं, तो आप पहले पैकेट प्रकार और आकार पढ़ेंगे और फिर एक आवंटित बफर में डीएमए हस्तांतरण को ट्रिगर करेंगे।

    • अन्य प्रोटोकॉल के लिए, यह बिल्कुल भी संभव नहीं हो सकता है, यदि वे केवल एंड-ऑफ-मैसेज सीमांकक का उपयोग करते हैं: उदाहरण के लिए, पाठ-आधारित प्रोटोकॉल जो '\n'सीमांकक के रूप में उपयोग करते हैं । (जब तक DMA परिधीय किसी वर्ण पर मिलान का समर्थन नहीं करता है।)

जैसा कि आप देख सकते हैं, यहां पर विचार करने के लिए बहुत सारे व्यापार हैं। कुछ हार्डवेयर सीमाओं (चैनलों की संख्या, अन्य बाह्य उपकरणों के साथ संघर्ष, पात्रों पर मेल) से संबंधित हैं, कुछ प्रयोग किए गए प्रोटोकॉल पर आधारित हैं (सीमांकक, ज्ञात लंबाई, मेमोरी बफ़र्स)।

कुछ वास्तविक प्रमाण जोड़ने के लिए, मैंने इन सभी व्यापार-बंदियों का सामना एक शौक परियोजना में किया है, जिसमें बहुत अलग प्रोटोकॉल के साथ कई अलग-अलग बाह्य उपकरणों का उपयोग किया गया था। बनाने के लिए कुछ ट्रेड-ऑफ थे, ज्यादातर इस सवाल पर आधारित थे कि "मैं कितना डेटा स्थानांतरित कर रहा हूं और मैं कितनी बार ऐसा करने जा रहा हूं?"। यह अनिवार्य रूप से आपको सीपीयू पर सरल बाधित-चालित हस्तांतरण के प्रभाव पर एक मोटा अनुमान देता है। मैंने इस प्रकार हर 5 सेकंड UART ट्रांसफर पर उक्त I2C ट्रांसफर को प्राथमिकता दी, जो उसी DMA चैनल का उपयोग करता था। एक और UART ट्रांसफर अधिक बार हो रहा है और दूसरी ओर अधिक डेटा के साथ एक और I2C ट्रांसफर को प्राथमिकता मिली है जो कि शायद ही कभी होता है। यह सब व्यापार-बंद है।

बेशक, डीएमए का उपयोग करने के फायदे भी हैं, लेकिन यह वह नहीं है जो आपने मांगा था।


आपके विस्तृत उत्तर के लिए धन्यवाद। मिडी सबसे महत्वपूर्ण हिस्सा होगा, इसलिए मुझे लगता है कि डीएमए इसके लिए उपयुक्त है (हालांकि गति कम है: 31250 बॉड)। मेरे पास पर्याप्त डीएमए चैनल हैं, बाद में मैं 4 यूएसएआरटी का उपयोग करते समय एक और एसटीएम 32 का उपयोग करने जा रहा हूं। मुझे सीपीयू को निलंबित करने की आवश्यकता नहीं है, क्योंकि इसमें 5 वी यूएसबी शक्ति होगी, और मुझे संदेशों के बीच प्रसंस्करण करने की आवश्यकता है (मुख्य लूप में संदेशों को संसाधित करने के लिए)। मेरे पास 256 बाइट पढ़ी गई हैं और 256 बाइट ट्रांसमिटेड बफर हैं। जरूरत पड़ने पर बाद में इसे बढ़ा सकता हूं। STM32f103c8t6 में 20 KB रैम है, अंतिम STM I का उपयोग 192 KB होगा।
मिशेल किजर्स

और आप मुझे एक बहुत अच्छा विचार दें कि कैसे सुधार किया जाए। अब तक मैं हमेशा 1 बाइट पढ़ता हूं और एक पूर्ण (मिडी) संदेश प्राप्त होने पर लगातार जांच करता हूं। लेकिन मैं पहली बाइट पढ़ सकता हूं, और इस पर निर्भर करता है कि ज्यादातर आकार ज्ञात है और बाकी के लिए पूछ सकते हैं। यह मुझे एक और छोटे बफर लागत लेकिन यह ठीक है।
मिशेल किजर्स

डीएमए के साथ सिंगल बाइट्स पढ़ना बहुत ही अक्षम है। कम विलंबता और उच्च दक्षता के लिए, प्रति-वर्ण का उपयोग तब तक बाधित होता है जब तक कि आप आकार नहीं जानते हैं और फिर डीएमए पर स्विच करना अनुकूल होगा।
जोनास श्फर

खैर मुझे इंटरप्ट्स (डीएमए के बिना) का उपयोग करने में बहुत सारी समस्याएं थीं, मुझे लगता है कि मैं 1 बाइट डीएमए प्राप्त का उपयोग करूंगा, और उसके बाद मुझे पता है कि मैं कितने बाइट की उम्मीद करूंगा और अधिक प्राप्त करने के लिए डीएमए अनुरोध करूंगा।
मिशेल किजर्स

6
यह शायद एक गलती है - आपको डीएमए के बिना , अपने सरल व्यवधान कोड को ठीक करना चाहिए ।
क्रिस स्ट्रैटन

10

डीएमए का उपयोग करने का आमतौर पर मतलब है कि अब आप हर चरित्र पर एक रुकावट नहीं ले रहे हैं, बल्कि केवल वर्णों के "बफर पूर्ण" प्राप्त होने (या प्रेषित) के बाद। इससे उन वर्णों को संसाधित करने की विलंबता बढ़ जाती है - पहले वर्ण को संसाधित नहीं किया जाता है जब तक कि बफर में अंतिम चरित्र प्राप्त नहीं हुआ है।

यह विलंबता एक बुरी बात हो सकती है, विशेष रूप से MIDI जैसे विलंबता-संवेदनशील अनुप्रयोग में, जहाँ कुछ ms यहाँ और वहाँ लाइव प्रदर्शन के लिए गंभीर playability मुद्दों को जोड़ सकते हैं।


मैं एक बार में 1 बाइट प्राप्त कर रहा हूं (इसलिए 1 बाइट का 'डीएमए' बफर) और उस एक बाइट के प्रत्येक डीएमए कॉलबैक के बाद, इसे रिंग बफर में स्टोर करने के लिए जिसे मैं स्वयं संभालता हूं। अपने मुख्य लूप में मैं पूर्ण मिडी संदेशों की जांच करने और उन्हें संसाधित करने का इरादा कर रहा हूं।
मिशेल किजर्स

3
DMA का उपयोग आमतौर पर कई बाइट्स प्राप्त करने के लिए किया जाता है, और केवल तब बाधित होता है जब वे सभी प्राप्त कर चुके होते हैं। डीएमए का उपयोग नहीं करने पर सिर्फ एक बाइट के बाद बाधित होना सामान्य है , इसलिए यह मुझे आश्चर्यचकित करता है: इसके लिए डीएमए का उपयोग करने की अतिरिक्त जटिलता में क्या बात है?
स्टीव मेलनिकॉफ़

5
@MichelKeijzers तब आप जो करते हैं वह बिल्कुल वैसा ही होता है जैसा आप शुद्ध व्यवधान-चालित कार्यान्वयन में करते हैं। इसलिए, इस मामले में डीएमए का उपयोग करने में कोई लाभ नहीं है और आपकी मूल समस्या डीएमए द्वारा हल नहीं की गई है, लेकिन आपके (आईएसआर, सेटअप) कोड के आपके पुनर्लेखन द्वारा।
जिमीबी नोव

@ जिमीबी ... धन्यवाद ... हालांकि नीचे जोनास के जवाब के कारण, मैं पढ़ने में सुधार करूंगा कि संदेश के रूप में कई बाइट्स लंबे हैं। मैं यह पहली बाइट (ज्यादातर मामलों में) प्राप्त करने के बाद जानता हूं। से अधिक यह अंतराल पर डीएमए का उपयोग करने के लिए अधिक लाभ होगा।
मिशेल कीजर्स

8

डीएमए इंटरप्ट के लिए एक विकल्प नहीं है - वे आम तौर पर एक साथ उपयोग किए जाते हैं! उदाहरण के लिए, यदि आप एक UART से अधिक डेटा भेजने के लिए DMA का उपयोग कर रहे हैं, तो आपको अभी भी यह बताने के लिए एक व्यवधान की आवश्यकता है कि भेजने का काम कब पूरा होगा।


यह सच है, शायद सीधे एसटीएम 32 पर (शुद्ध गैर डीएमए) रुकावट तंत्र सीधे डीएमए की तुलना में थोड़ा अनाड़ी है।
मिशेल किजर्स 1

2
@duskwuff वास्तव में नहीं; आप यह देखने के लिए मतदान कर सकते हैं कि डीएमए कब किया गया है, और आप अच्छी तरह से करना चाह सकते हैं क्योंकि डीएमए का उपयोग करने के प्रमुख कारणों में से एक सीरियल पोर्ट के साथ परेशान नहीं होना है जब तक कि आपका कार्यक्रम एक स्थिति में नहीं है जहां यह प्राप्त पर कार्य कर सकता है डेटा। या निवर्तमान डीएमए के लिए, आप केवल यह देखने के लिए मतदान कर सकते हैं कि क्या भेजने वाले बफर में अधिक जोड़ना संभव है।
क्रिस स्ट्रैटन

1
@MichelKeijzers: IDK विशिष्ट चिप, लेकिन आमतौर पर DMA का विकल्प वस्तुतः बाधित नहीं होता है, यह क्रमादेशित IO है (जहाँ आप CPU निर्देशों का उपयोग / I / O रजिस्टर से डेटा पढ़ने / लिखने के लिए करते हैं)। एक बाधा हैंडलर में, आप आम तौर पर एक पढ़ा करते हैं, और हो सकता है कि जब आप पहली बार पढ़ रहे थे, तो एक और मामला सामने आया, खासकर अगर वह एक और बाधा को ट्रिगर नहीं करेगा। या पढ़ें जब तक कि एक आंतरिक बफर खाली था अगर ऐसा कोई बफर है। जाहिर है कि आपको पीआईओ के लिए अधिक व्यवधानों की आवश्यकता है, और उन्हें अलग तरीके से सेट करें।
पीटर कॉर्डेस

@ChrisStratton अच्छा बिंदु ... अब तक मैंने जांच नहीं की है कि क्या यह संचारित करना संभव है, मैं बस कुछ संचारित करता हूं, अगर यह ठीक है तो जाँच नहीं। शायद नहीं, तो मैं बाद में फिर से कोशिश करता हूं।
मिशेल किजर्स

@PeterCordes ऐसा लगता है कि एसटीएम 32 में डीएमए के लिए पर्याप्त व्यवधान है और मैं हर बार सिर्फ 1 बाइट पढ़ता हूं। यहां तक ​​कि सबसे सरल STM32 (F103c8t6) में पर्याप्त डीएमए पोर्ट / इंटरप्ट उपलब्ध हैं।
मिशेल किजर्स

5

DMA का उपयोग UART के परिधीय उपयोग के अन्य सभी विचारों से परे कुछ दिलचस्प सवालों और चुनौतियों का परिचय देता है। मैं आपको कुछ उदाहरण दूंगा: मान लें कि आपका यूसी अन्य उपकरणों के साथ RS485 (या जो भी) बस में बैठा है। बस में कई संदेश हैं, कुछ आपके यूसी के लिए हैं, कुछ नहीं हैं। इसके अतिरिक्त मान लें कि ये बस-पड़ोसी सभी एक अलग डेटा प्रोटोकॉल बोलते हैं, जिसका अर्थ है कि संदेश की लंबाई अलग-अलग है।

कुछ प्रश्न जो केवल डीएमए का उपयोग करते समय सामने आते हैं:

  • मैं कब बाधा डालूं?
    • DMAs वास्तव में केवल तब बाधित करना पसंद करते हैं जब उन्होंने डेटा की पूर्व निर्धारित राशि स्थानांतरित की हो।
    • यदि आप कभी भी डीएमए बाधा को ट्रिगर करने के लिए पर्याप्त डेटा प्राप्त नहीं करते हैं, तो आप क्या करते हैं?
  • क्या होगा यदि आप केवल एक आंशिक संदेश प्राप्त करते हैं जब डीएमए बाधित होता है?
  • आपके आरएक्स बफ़र क्या दिखते हैं? क्या वे रैखिक या परिपत्र हैं?
    • डीएमए एक अनियंत्रित परिपत्र बफर भागीदार हो सकता है इस अर्थ में कि यह केवल पता सीमा का पालन करता है, लेकिन परिपत्र बफर सिस्टम में अन्य बिंदुओं को उड़ाने में कोई समस्या नहीं है।

वैसे भी, सिर्फ विचार के लिए भोजन।


उन विचारों के लिए धन्यवाद। वर्तमान में मैं हमेशा 1 बाइट प्राप्त करता हूं और इसे रिंग बफर में स्टोर करता हूं, क्योंकि वास्तव में मेरे संदेशों (मिडी) में अलग-अलग लंबाई हो सकती है और मैं आगे नहीं निकलता। अपने मुख्य लूप में मैं उन्हें संसाधित करने के लिए पूर्ण संदेशों की जांच करता हूं (और यदि पूर्ण हो, तो मैं उन्हें रिंग बफर से हटा देता हूं)। इसलिए मुझे हमेशा पर्याप्त डेटा प्राप्त होगा (जब तक मैं बाइट्स को याद नहीं करूंगा, मुझे उस पर जांच करनी होगी)। मेरा RX बफर केवल 1 बाइट है, लेकिन मैं इसे रिंग / सर्कुलर बफर में कॉपी करता हूं। अगर यह भरा हुआ है (इसे जोड़ने की आवश्यकता है) तो मैंने चेक नहीं किया।
मिशेल किजर्स

अरे, कोई चिंता नहीं। मुझे यकीन है कि आपका आवेदन अच्छी तरह से प्रोग्राम किया जाएगा। जैसा कि दूसरों ने उल्लेख किया है, डीएमए महान है, लेकिन स्वतंत्र नहीं है। यह सिस्टम में अतिरिक्त विचार प्रस्तुत करता है जो मौजूद नहीं है यदि आप इसका उपयोग किए बिना दूर हो सकते हैं।
pgvoorhees

अच्छा मुझे आशा है, मैं अभी भी एक शुरुआत कर रहा हूँ।
मिशेल किजर्स

3

प्राप्त पक्ष पर (जैसा कि मुझे याद है) डीएमए या तो एक चरित्र मैच या टर्मिनल काउंट पर समाप्त होता है। कुछ प्रोटोकॉल और कई इंटरैक्टिव अनुप्रयोग इस मॉडल में आसानी से फिट नहीं होते हैं और आपको वास्तव में चरित्र द्वारा चीजों को संभालने की आवश्यकता होती है। डीएमए तकनीक भी भंगुर हो सकती है यदि संचार लिंक अविश्वसनीय है, तो धारा में एक भी चरित्र खोना आपके डीएमए राज्य मशीन को आसानी से गड़बड़ कर सकता है।


मैं वास्तव में बाइट प्राप्त कर रहा हूं और बाद में इसे संसाधित करने के लिए इसे मैन्युअल रूप से एक रिंग बफर पर कॉपी करता हूं।
मिशेल किजर्स 10

1

मैंने अब कुछ परियोजनाओं पर STM32CubeMx / HAL का उपयोग किया है और पाया है कि UART से निपटने वाला सॉफ़्टवेयर जो उत्पन्न करता है, उसे प्राप्त पक्ष में निश्चित कमियाँ हैं।

प्रेषित होने पर आप सामान्य रूप से डेटा या लाइन ऑफ़ टेक्स्ट भेजना चाहेंगे। इस मामले में आप जानते हैं कि डेटा अंतरण कितना लंबा है और इसलिए डीएमए का उपयोग एक स्पष्ट समाधान है। स्थानांतरण पूर्ण होने के बाद आपको एक बाधा मिलती है और अपने मुख्य कोड को इंगित करने के लिए UART TX पूर्ण कॉलबैक फ़ंक्शन का उपयोग कर सकते हैं कि ट्रांसमिशन पूरा हो गया है और आप डेटा का एक और ब्लॉक भेज सकते हैं।

जब डेटा रिसेप्शन की बात आती है, तो एसटी द्वारा प्रदान किए गए कार्य सभी मान लेते हैं कि आप जानते हैं कि भेजने से पहले डिवाइस आपको भेजने वाले कितने वर्ण देगा। सामान्य रूप से यह ज्ञात नहीं है। व्यवधान कार्यक्षमता डेटा को एक बफ़र में रखती है और केवल यह इंगित करती है कि वर्णों की पूर्व-निर्धारित संख्या प्राप्त होने पर डेटा उपलब्ध है। यदि आप अनुक्रमिक एकल वर्ण स्थानान्तरण स्थापित करके डेटा प्राप्त करने के लिए डीएमए या इंटरप्ट कार्यक्षमता का उपयोग करने का प्रयास करते हैं, तो इनमें से प्रत्येक के लिए सेटअप समय का मतलब होगा कि आप धीमे डेटा दरों (बॉड दर जिसे आप के अलावा किसी और चीज में खो देंगे) डेटा खोना शुरू करना आपके प्रोसेसर की घड़ी की गति पर निर्भर करेगा) और प्रोसेसर को अत्यधिक लोड करेगा, जिससे किसी अन्य प्रसंस्करण के लिए कोई निर्देश चक्र नहीं होगा

इसे प्राप्त करने के लिए मैंने अपने स्वयं के इंटरप्ट हैंडलर फ़ंक्शन को लिखा है जो डेटा को एक छोटे से स्थानीय परिपत्र बफर में संग्रहीत करता है और एक गिनती सेट करता है जिसे मुख्य कोड (आरटीओएस काउंटिंग सेमाफोर) द्वारा पढ़ा जाता है ताकि यह संकेत मिल सके कि डेटा तैयार है। मुख्य कोड तब इस बफ़र से अपने अवकाश पर डेटा एकत्र कर सकता है, इससे कोई फर्क नहीं पड़ता कि डेटा एकत्र करने में कुछ देरी हो रही है या नहीं कि डेटा एकत्र करने से पहले स्थानीय बफर अतिप्रवाह नहीं करता है।


मैं ठीक वैसा ही करता हूं (मुझे लगता है)। मैं एक समय में 1 बाइट पढ़ता हूं और इसे एक चक्रीय बफर में संग्रहीत करता हूं, और मैं संपूर्ण संदेशों के लिए मुख्य लूप में जांच करना चाहता हूं। हालांकि थोड़ा बढ़ाया जा सकता है।
मिशेल किजर्स

क्या आपको लगता है कि मैं इस समस्या में भाग सकता हूं कि हर बार डीएमए स्थापित करने से मेरे प्रोसेसर / लापता पात्रों को 31,250 बॉड में अधिभारित किया जाएगा?
मिशेल किजर्स 10

1
जब तक आप एक समय में कई वर्णों को स्थानांतरित करने के लिए डीएमए सेट करते हैं, तो इससे कोई समस्या नहीं होगी। मैं 4 UARTs 115200 और उच्चतर चल रहा है और I2C समस्याओं के बिना DMA का उपयोग कर रहा है। UART के प्रसारण सभी ~ 20 बाइट्स या अधिक लंबे होते हैं। समस्या UMA (L4 प्रोसेसर पर 80MHz, 9600baud) पर प्राप्त करने के लिए DMA का उपयोग कर रही थी।
u

वर्तमान में मैंने इसे एक बार में 1 बाइट पर सेट किया है, लेकिन मैं इसे बेहतर बना सकता हूं (पहले बाइट करके, और यह जांचने की तुलना में कि कितने बाइट्स की जरूरत है)।
मिशेल किजर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.