2012-04-02 23 views
7

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

चालक संचार प्रोटोकॉल को लागू करेगा और UART पढ़ता/लिखता है, और यह अपने उपयोगकर्ताओं के उच्च स्तर के कार्यों का एक सेट निर्यात करने के लिए उन्हें MCU के साथ संवाद करने के लिए अनुमति देने के लिए है (उदाहरण के लिए read_register(), drive_gpios(), यह सब सामान) । इस मॉड्यूल का केवल एक उपयोगकर्ता होगा।

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

सवाल यह है: मेरी सेमाफोर आधारित दृष्टिकोण ठीक है, या बहुत भोली है? संभावित विकल्प क्या हैं? क्या कोई नुकसान है जो मुझे याद आ रही है?

+3

सेमफोरों को बेहतर लिनक्स आंतरिकों का समर्थन करने के लिए जो कुछ मैं समझता हूं, उससे नौकरी करना चाहिए, कृपया मुफ्त पुस्तक "लाइनक्स कर्नेल विकास 3 संस्करण" देखें, जो मुफ्त पीडीएफ के रूप में उपलब्ध है और अद्यतित है (.39 कर्नेल मुझे विश्वास है)। वह पुस्तक वास्तव में गहरी नहीं जाती है, लेकिन यह बुनियादी सिद्धांतों और शो विकल्पों को बताती है। मज़ा हैकिंग है। – AoeAoe

+0

एक अच्छी किताब, धन्यवाद! यदि कोई और दिलचस्पी लेता है, तो मैं लिनक्स ड्राइवर्स डेवलपमेंट और लिनक्स कर्नेल मॉड्यूल डेवलपमेंट प्राप्त करने का भी सुझाव दूंगा (दोनों मुफ्त में ऑनलाइन उपलब्ध हैं) –

उत्तर

5

परंपरागत रूप से लिनक्स में से निपटने के लिए दो भागों में किया जाता है IRQ:

  1. तो "ऊपरी-आधा" कहा जाता है आईआरक्यू संदर्भ में वास्तविक काम कर (IRQ हैंडलर ही) है। इस भाग को जितनी जल्दी हो सके बाहर निकलना चाहिए। तो यह मूल रूप से इंटरप्ट स्रोत की जांच करता है और फिर आधे से शुरू होता है।

  2. "नीचे आधा"। इसे कार्य कतार के रूप में लागू किया जा सकता है। यह वह जगह है जहां वास्तविक काम किया जाता है। यह सामान्य संदर्भ में चलाता है, तो यह अवरुद्ध कार्यों का उपयोग कर सकते हैं आदि

आप केवल विशेष वस्तु का उपयोग करने के लिए अपने कार्यकर्ता सूत्र में आईआरक्यू के लिए प्रतीक्षा करने, बेहतर चाहते हैं completion कहा जाता है। यह वास्तव में इस कार्य के लिए बनाया गया है।

संबंधित मुद्दे