क्या रास्पबेरी पाई मज़बूती से 9600 बॉड सीरियल में धमाका कर सकती है और इसका उदाहरण कोड है?


29

मैं सोच रहा हूँ कि रास्पबेरी पाई पर GPIO पिन के माध्यम से 9600 बॉड धारावाहिक को चलाने के लिए बिटबैंगिंग का उपयोग करना कितना संभव है।

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

विश्वसनीयता के लिए मेरा मानक यह है कि यह ज्यादातर समय 9600 बॉड सीरियल सहिष्णुता के भीतर रहना चाहिए। मैं वर्तमान में अनिश्चित हूं कि व्यवहार में कितनी त्रुटियां सहन करने योग्य हैं, लेकिन प्रोटोकॉल में पुनरावृत्ति और स्वीकार्यताएं हैं, इसलिए यह कुछ हद तक सहनशील है।

तो, मेरे सवाल हैं:

  • क्या यूजरलैंड सॉफ्टवेयर मज़बूती से बिट-बैंग 9600 बॉड स्पीड कर सकता है?
  • क्या इसके लिए वास्तविक समय में पैच किए गए कर्नेल की आवश्यकता है?
  • मुझे सामान्य रूप से कितनी त्रुटियों की अपेक्षा करनी चाहिए?

इसके अलावा, क्या कोई उदाहरण कोड GPIO बिट बैंगिंग के माध्यम से धारावाहिक कर रहा है? मुझे Arduino SoftSerial का पता है, लेकिन यह इसके बारे में है।

बस मामले में, सवाल को सीमित करने के लिए: यह एक मानक सीरियल इंटरफ़ेस नहीं है और रास्पबेरी पाई का UART पहले से ही एक अन्य सीरियल लिंक के लिए उपयोग किया जाता है। मैं ऐसे उत्तरों की कामना नहीं करता, जो बाहरी हार्डवेयर (जैसे गर्टबोर्ड या अरुडिनो) का सुझाव देते हैं और न ही ऐसे उत्तर जो यूएआरटी पर निर्भर करते हैं।


1
+1 अच्छा सवाल। मुझे भी इसके उत्तर में दिलचस्पी होगी। हालांकि, सवाल reliabilityकार्रवाई और उम्मीदों पर निर्भर हो सकता है।
जीवांश

2
RS-232 को नकारात्मक वोल्टेज की आवश्यकता होती है, लेकिन यह धारावाहिक लिंक RS-232 वोल्टेज का उपयोग नहीं करता है। मुझे नहीं पता, लेकिन मेरा मानना ​​है कि आरपीआई को आरएस -232 कनवर्टर के मानक टीटीएल की आवश्यकता है, जैसे कि मैक्स 232 या दर्जनों विकल्पों में से कोई भी। हालाँकि, सिर्फ स्पष्ट होने के लिए, यह मेरे सवाल के लिए प्रासंगिक नहीं है, मैं सिर्फ जवाब देना चाहता था।
नाकाबिल

4
GPIO पिन 14 और 15 पर एक दूसरा UART भी है। यह पूरी तरह से मुख्य के रूप में चित्रित नहीं किया गया है
जॉन ला रोय सिप


1
@ क्या आप अपने काम को साझा कर सकते हैं? मेरे पास एक अनुकरणीय समस्या है और आप यह देखना चाहेंगे कि आपने स्पाई के माध्यम से दूसरा धारावाहिक कैसे किया। धन्यवाद MSP

जवाबों:


15

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

मैं 20x बॉड दर पर लाइनों के नमूने के लिए SPI का उपयोग करता हूं। मैं SCLK और SS पिन को पूरी तरह से अनदेखा करता हूं, RX लाइन को MISO और TX लाइन को MOSI से जोड़ता है। यह मुझे आरएक्स लाइन में एक (1-बिट) आस्टसीलस्कप जैसा दृश्य देता है और धारावाहिक में बिट्स को स्पष्ट रूप से प्रेषित करता है:

00 00 00 00 00 00 
00 00 00 00 01 FF 
FF FF FF FF 00 00 
01 FF FF FF FF FF 
FF FF E0 00 00 00 
00 00 07 FF FF FF 
FF FF 

इससे वास्तविक डेटा बिट्स का नमूना करने के लिए सही स्थिति का पता लगाने के लिए कोडिंग का एक सरल मामला है। भेजने वाला पक्ष समान रूप से तुच्छ है, मुझे बस हर बिट को बिट बिट की एक लंबी धारा में बदलने की जरूरत है जिसमें स्टार्ट बिट और स्टॉप बिट शामिल है।

बिट-बैंगिंग की तुलना में बेहतर काम करने का कारण यह है कि एसपीआई की अपनी एक घड़ी होती है जो कर्नेल के साथ स्थिर नहीं होती है और एसपीआई भेजने और प्राप्त करने वाली लाइनों के हस्तांतरण के लिए 16-बाइट फीफो है जो कर्नेल फ्रीज से भी स्वतंत्र हैं। 9600 बॉड के लिए, मैं 250kHz SPI घड़ी का उपयोग कर रहा हूं और इसका मतलब है कि मैं बिना किसी ट्रांसमिशन त्रुटियों के FIFO को भरने और निकालने के बीच एक मिलीसेकंड के लिए भी सो सकता हूं। हालाँकि, सुरक्षित पक्ष को प्राप्त करने के लिए, मैं 300 err स्लीप का उपयोग कर रहा हूँ। मैंने संक्षेप में परीक्षण किया कि मैं इसे कितना आगे बढ़ा सकता हूं और कम से कम 2MHz SPI घड़ी अभी भी प्रयोग करने योग्य है, इसलिए यह समाधान उच्च बॉड दरों के साथ-साथ उच्च स्तर पर भी लागू होता है।

इस समाधान का एक बदसूरत हिस्सा यह है कि कर्नेल एसपीआई ड्राइवर इस तरह के स्ट्रीमिंग बिट ट्रांसफर का समर्थन नहीं करता है। इसका मतलब है कि मैं कर्नेल एसपीआई ड्राइवर का उपयोग करके अपने स्वयं के कर्नेल मॉड्यूल को लिखकर ऐसा नहीं कर सकता हूं, और मैं उपयोगकर्ता भूमि से /dev/sdidev0.0 का उपयोग करके भी नहीं कर सकता। हालांकि, रास्पबेरी पाई पर, SPI और अन्य बाह्य उपकरणों को सीधे mmap (): n / dev / मेम द्वारा कर्नेल नियंत्रण को पूरी तरह से दरकिनार करके पहुँचा जा सकता है। मैं इससे बहुत खुश नहीं हूं, लेकिन यह पूरी तरह से काम करता है और यह अतिरिक्त लाभ देता है कि उपयोगकर्तालैंड में विभाजन दोष कर्नेल को दुर्घटनाग्रस्त नहीं कर सकता (जब तक कि दुर्घटना से अन्य बाह्य उपकरणों के साथ गड़बड़ न हो)। सीपीयू के उपयोग के लिए, 300 s की नींद मुझे लगातार 7% सीपीयू उपयोग करने के लिए दे रही है, लेकिन मेरा कोड बहुत ही अडॉप्टिमल है। नींद की अवधि बढ़ाने से जाहिर तौर पर सीपीयू का इस्तेमाल कम होता है।

संपादित करें: उल्लेख करना भूल गया, मैंने उपयोगकर्ता के लिए SPI को नियंत्रित करने के लिए अच्छा bcm2835 पुस्तकालय का उपयोग किया, जहां यह आवश्यक है।

इसलिए, संक्षेप में: मैं रास्पबेरी पाई पर 250kHz पर सीधे / dev / mem के माध्यम से SPI चिप का उपयोग करके पूरी तरह से उपयोगकर्ताभूमि से 9600 बॉड धारावाहिक लिंक पर मज़बूती से संचारित और प्राप्त कर सकता हूं।


@ Nakedible - क्या आप थोड़ा विस्तार कर सकते हैं या mmap () भाग पर लिंक प्रदान कर सकते हैं। मैं उसी चीज पर काम कर रहा हूं।
जे के

क्या आप ट्रांसफ़ॉर्म करने के लिए SPI हार्डवेयर का उपयोग कर रहे हैं?
चीता

हाँ, संचारण भी काम करता है।
नाकाबिल

3
क्या आप कृपया एक चरण-दर-चरण निर्देश दे सकते हैं कि आप कैसे कोड भेज और प्राप्त कर सकते हैं, और किसी भी संशोधित पैकेज को साझा कर सकते हैं यदि आप कुछ ऐसा उपयोग करते हैं जो आपने खुद को पैच किया है ... टीआईए!
वेलेंटाइन

10

ऐसा लगता है कि कम से कम वास्तविक समय के पैच (CONFIG_PREEMPT_RT) के बिना, रास्पबेरी पाई 9600 बॉड धारावाहिक को बिट-बैंग नहीं कर सकती है।

मैंने एक साधारण विलंबता परीक्षक का उपयोग किया, जिसने सभी लाइन साइड चीजों को बेहतर तरीके से कॉन्फ़िगर किया (शेड्यूल_फिफो, प्राथमिकता 99, cpu_dma_latench 0us, mlockall)। मैंने 100 ecsec (लगभग 9600 बॉड) के लिए सोने की कोशिश की और 2 मिनट के लिए एक शांत प्रणाली पर विलंबता उग आया। परिणाम थे:

न्यूनतम: 12 वर्ग सेकेंड: 24 सेकेंड अधिकतम: 282 वर्ग सेकेंड

यह आम परिणाम की तरह लग रहा था। 100 variedsec और 300 .sec के बीच धीमे माप में अधिकतम विविध। मैंने वितरण की जाँच भी की और ऐसा लगता है कि विशाल बहुमत 24 .sec रेंज में हैं। केवल कुछ ही जो 50 µsec से ऊपर जाते हैं, लेकिन लगभग हमेशा कुछ होते हैं। कभी-कभी विशाल विलंबताएं भी होती हैं, जैसे कि 4000 butsec, लेकिन ये अब तक की अनदेखी के लिए असामान्य हैं, कम से कम।

मुझे लगता है कि अधिकतम विलंबता 9600 बॉड के लिए 50 50sec से नीचे होनी चाहिए ताकि त्रुटियां न हों और 100 oversec से अधिक विलंबता संचरण या रिसेप्शन में पूरी तरह से गायब हो जाए।

यह सब अभी तक GPIO पिन को छूने के बिना है। चूँकि मैं सिर्फ 2 सेकंड के साथ भी एक क्लीन रन नहीं प्राप्त कर सका, इसलिए यह कहना सुरक्षित है कि रियल-टाइम पैच के बिना रास्पबेरी पाई 9600 बॉड सीरियल लिंक को किसी भी गंभीर राशि के लिए त्रुटियों को उत्पन्न किए बिना बिट नहीं कर सकता है।

अगर मुझे समय मिलता है तो मैं वास्तविक समय के पैच का परीक्षण करूंगा।

(उपकरण का उपयोग किया गया: http://git.kernel.org/?p=linux/kernel/git/clrkwllms/rt-tests.git=a=summary )

अद्यतन: CONFIG_PREEMPT_RT पैच सेट के साथ संकलित किए बिना SD कार्ड का पता लगाए बिना RPI कर्नेल बूट पर लटका देता है। यह ठीक करने के लिए एक साधारण बात हो सकती है, लेकिन आरपीआई स्रोत में गड़बड़ को देखते हुए, मुझे लगता है कि मैं तब तक इंतजार करना चाहता हूं जब तक कि यह मेनलाइन कर्नेल में न हो।

इसलिए, यह परीक्षण करना बहुत कठिन है, और मैं इसे छोड़ रहा हूं।


0

आपको थोड़ा धमाका करने की जरूरत नहीं है। आप प्रारंभ बिट के गिरने का पता लगाने के लिए rx gpio में एक उपयोगकर्ता भूमि अवरोध स्थापित कर सकते हैं। फिर बिट्स के बीच में नमूना करने के लिए एक समय बाधित करें। कर्नेल मॉड्यूल कर रहा है जो संभव है।


लेकिन यह अभी भी थोड़ा धमाकेदार है। वास्तव में यही तरीका है कि आप आम तौर पर थोड़ा धमाका करते हैं।
फिलिप्पुस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.