2009-05-19 8 views
6

आज मैं एक सहकर्मी, जिनमें से एक विषय मिल गया मुझे सोच और आज शाम googling के साथ एक बहुत ही दिलचस्प बातचीत में मिला है। एक एम्बेडेड वातावरण में सी ++ (सी के विपरीत) का उपयोग करना। चारों ओर देखकर, सी ++ सुविधाओं के लिए और उसके विरुद्ध कुछ अच्छे trades प्रतीत होते हैं, लेकिन अन्य Meyers स्पष्ट रूप से इसका समर्थन करते हैं। इसलिए, मैं सोच रहा था कि इस विषय पर कुछ प्रकाश डालने में सक्षम होगा और समुदाय की आम सहमति क्या थी।एक एम्बेडेड वातावरण में C++ का उपयोग करते हुए

+0

मुझे यह जोड़ना चाहिए कि यह चर्चा हमारे प्रबंधकों पर आंशिक रूप से हमारे अधिकांश पुस्तकालयों में सी ++ को अपनाने के लिए अनिच्छुक है। हम "एम्बेडेड" काम करते हैं, केवल यही है कि यह ज्यादातर रोबोट पर रहता है। 99% समय, हम एक आरटीओएस या किसी भी सिस्टम का उपयोग नहीं कर रहे हैं जिसमें अत्यधिक सीमित स्मृति है। – jdt141

+0

संबंधित प्रश्न: http://stackoverflow.com/questions/812717/ –

+0

यह भी देखें http://stackoverflow.com/questions/649789/why-artificially-limit-your-code-to-c – Suma

उत्तर

5

यह एक तरह से अपने एम्बेडेड प्रणाली की विशेष प्रकृति पर निर्भर करता है और जो सी की सुविधाओं ++ आप का उपयोग करें। भाषा स्वयं सी से

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

मुझे पता चला है कि स्मृति वास्तव में तंग होने पर टालने के लिए सबसे बड़ी बात है, क्योंकि आपको प्रत्येक प्रकार के प्रत्येक टेम्पलेट फ़ंक्शन की एक प्रति प्राप्त होती है, और यह कोड सेगमेंट को तेज़ी से फहरा सकता है।

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

1

मैं के बारे में "आम सहमति", केवल कंपनी मैं के लिए काम (जो मोबाइल फोन, कार नेविगेशन सिस्टम, DPFs, आदि के लिए विकास का एक बहुत कुछ करता है) पता नहीं है।

सी के विपरीत के रूप में एम्बेडेड प्लेटफॉर्म पर सी ++ का उपयोग करने के लिए मुझे मिली मुख्य कमी यह है कि यह पोर्टेबल नहीं है - ऐसे कई कंपाइलर्स हैं जो मानक का पालन नहीं करते हैं जो समस्याएं पैदा कर सकते हैं यदि आपको 1 से अधिक कंपाइलर के साथ अपना कोड बनाना है या कार्यान्वयन में पूरी तरह से बग हैं। फिर ऐसे वातावरण हैं जहां सी ++ कोड बस नहीं चलेगा - ब्रेक के मुद्दों को स्थानांतरित करने योग्य कोड और इसके "मूल ओओपी" के साथ "नियमित" सी ++ कक्षाओं और विरासत के साथ इतना अच्छा नहीं खेलता है।

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

1

निर्भर करता है आप एम्बेडेड विकास किस तरह कर रहे हैं। मैं विभिन्न प्लेटफार्मों पर दोनों सी ++, सी और विधानसभा के साथ एम्बेडेड विकास किया है, तुम भी जावा का उपयोग स्मार्ट फोन पर आवेदन पत्र लिखने के लिए कर सकते हैं।

डिवाइस की तरह एक स्मार्ट फोन पर उदाहरण के लिए Windows CE 5 चल रहा है कि, लगभग सभी कोड की सी ++, ऑपरेटिंग सिस्टम में भी शामिल है। सी या असेंबली में केवल छोटे बिट्स लिखे गए हैं।

दूसरी तरफ मैंने एक एमएसपी 430 माइक्रोकंट्रोलर के लिए कोड लिखा है, जो सी में था, और शायद मैंने ऐसा किया होगा कि सी ++ में संकलक अधिक भरोसेमंद और मानकों का अनुपालन करता।

इसके अलावा, मैं याद करने के लिए मेरा एक विश्वविद्यालय व्याख्याता आगे या कुछ में एम्बेडेड कोड लिखने के बारे में बात लग रहे हैं। तो वास्तव में कोई भी भाषा कर सकती है।

6

सी ++ के डर एम्बेडेड डेवलपर्स के बीच बड़े पैमाने पर अतीत में, जब सी ++ compilers सी compilers (अनुकूलन और कोड गुणवत्ता वार) के रूप में के रूप में अच्छा नहीं थे की बात है।

यह विशेष रूप से 32 बिट आर्किटेक्चर के साथ आधुनिक प्लेटफॉर्म पर लागू होता है। लेकिन, सी निश्चित रूप से अभी भी अधिक सीमित वातावरण के लिए पसंदीदा विकल्प है (जैसा कि 8 बिट या 4 बिट लक्ष्यों के लिए असेंबलर है)।

तो, यह वास्तव में आपके लक्षित प्लेटफ़ॉर्म के संसाधनों को उबालता है, और वास्तव में इन संसाधनों में से कितने संसाधनों की आवश्यकता होती है, यानी यदि आप सी ++ में एम्बेडेड विकास करने की 'लक्जरी' (या यहां तक ​​कि जावा उस मामले के लिए), क्योंकि आप जानते हैं कि आपको मेमोरी या सीपीयू बाधाओं के बारे में कोई समस्या नहीं होगी।

आजकल, कई आधुनिक एम्बेडेड प्लेटफॉर्म (गेमिंग कंसोल, मोबाइल फोन, पीडीए इत्यादि) सोचते हैं, वास्तव में आरआईएससी आर्किटेक्चर, कई एमबी रैम और 3 डी हार्डवेयर त्वरण के साथ बहुत ही सक्षम लक्ष्य बन गए हैं।

यह सिर्फ सी या यहाँ तक कि बेख़बर प्रदर्शन विचार से बाहर कोडांतरक का उपयोग कर दूसरी ओर C++ एक 16 बिट पीआईसी प्रोग्रामिंग पर शायद यह भी एक विवादास्पद फैसले होगा इस तरह के प्लेटफार्मों कार्यक्रम के एक ग़लत फ़ैसला किया जाएगा।

तो, वास्तव में यह पूछने की बात है कि कितनी शक्ति है, आपको वास्तव में आवश्यकता होगी और विकास अनुभव में सुधार करने के लिए आप कितना खर्च कर सकते हैं (उच्च स्तरीय भाषा, तेज विकास, कम कठिन/अनावश्यक कार्य)।

2

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

सी ++ के सभी सम्मान के संबंध में (जो एक भाषा है जिसे मैं वास्तव में प्यार करता हूं) लेकिन मुझे लगता है कि सी - हमारे विशेष परिदृश्य में - बेहतर विकल्प था।

मैं कुछ मामलों में शर्त लगाता हूं सी ++ एम्बेडेड अनुप्रयोगों के लिए उपयोग करने के लिए ठीक है लेकिन यह वास्तव में एप्लिकेशन पर निर्भर करता है - यदि आपका प्रोग्राम परमाणु संयंत्र को नियंत्रित कर रहा है या आपके सेल फोन पर एड्रेस बुक का प्रबंधन कर रहा है तो इसमें कोई फर्क पड़ता है।

1

अब एक दिन यह सभी प्लेटफॉर्म के सी ++ रनटाइम समर्थन में उबाल जाएगा। आपको सी ++ कोड को जीसीसी के साथ लगभग किसी भी एम्बेडेड प्लेटफ़ॉर्म पर संकलित करने का कोई तरीका मिल सकता है, लेकिन यदि आपको प्लेटफ़ॉर्म के लिए उपयुक्त C++ रनटाइम नहीं मिल रहा है तो आपके प्रयास व्यर्थ होंगे, जब तक कि आप अपना स्वयं का C++ रनटाइम नहीं लिख लेते।

5

एम्बेडेड प्लेटफार्मों के लिए सी ++ पूरी तरह से ठीक है - जब तक आप इसे बेहतर सी के रूप में देखते हैं, मुझे इस तथ्य से प्यार है कि भाषा थोड़ा अधिक संरचित है। आप अभी भी उन सभी चीजों को कर सकते हैं जिन्हें आप सी के साथ करना चाहते हैं। बस न्यूलिब या यूक्लिब जैसे एम्बेडेड सी लाइब्रेरी से चिपकना याद रखें।

मुझे विशेष रूप से एस्ट्रस्ट्रक्शन पसंद है जिसे हम सी ++ का उपयोग करके विशेष रूप से I/O उपकरणों के लिए बना सकते हैं। इसलिए, हमारे पास यूएआरटी और जीपीआईओ के लिए एक कक्षा हो सकती है और क्या नहीं है। यह कार्यों का एक समूह (आईएमएचओ) होने से क्लीनर है।

0

कुछ चीजें मैं लीनुस से सहमत करते हैं में से एक उनकी राय है सी ++ http://thread.gmane.org/gmane.comp.version-control.git/57643/focus=57918

इस के अलावा के बारे में, क्या तुम सच में वास्तव में सी उपयोग करना चाहते हैं ++ आप http://www.caravan.net/ec2plus/ पर एक नज़र सी एंबेडेड का वर्णन करता है जो ++ के लिए चाहते हो सकता है, या बेहतर कहने के लिए कि आपको एम्बेडेड सिस्टम के लिए सी ++ में उपयोग नहीं करना चाहिए।

0

लंबे समय तक सी ++ का उपयोग करने के साथ हमें रखने वाली बड़ी बात यह थी कि इसके लिए VxWorks समर्थन वास्तव में चूसा था। यह आश्चर्यजनक रूप से VxWorks 6 पर बेहतर हो गया है (हाँ, यह थोड़ी देर हो गया है ... अच्छा 'ओले विक्रेता लॉक-इन और कंपनी दृष्टि की कमी ने हमें VxWorks 5.5 पर फंस दिया है)।

तो हमारे लिए यह ज्यादातर पर्यावरण का सवाल है। उसके बाद, सी ++ स्पष्ट रूप से सी के रूप में उतना ही अच्छा हो सकता है ... यह लोगों की बात है कि उनका उपकरण क्या करता है और इसका उपयोग कैसे किया जाता है। सी ++ अविश्वसनीय रूप से अक्षम कोड लिखना आसान बना सकता है, लेकिन इसका मतलब यह नहीं है कि हमें इसे मारना होगा।

0

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

मेरी राय यह है कि सी ++ के कुछ फायदे हैं, लेकिन मैं अपवादों और मानक टेम्पलेट लाइब्रेरी से दूर रहूंगा। हमें वर्चुअल फ़ंक्शंस का उपयोग करने में समस्या नहीं है।

0

सी ++ ओएस के बिना माइक्रोकंट्रोलर और उपकरणों के लिए उपयुक्त है। आपको बस सिस्टम के आर्किटेक्चर को जानना होगा और समय और अंतरिक्ष की बाधाओं के प्रति सचेत रहना होगा, खासकर जब मिशन महत्वपूर्ण प्रोग्रामिंग करना।

सी ++ के साथ आप अमूर्तता कर सकते हैं जो अक्सर कोड में बढ़ते पदचिह्न की ओर जाता है। संसाधन-सीमित मशीन जैसे 8-बिट एमसीयू के लिए प्रोग्रामिंग करते समय आप यह नहीं चाहते हैं।

आम तौर पर, से बचने:

  • गतिशील स्मृति आवंटन, क्योंकि यह समय
  • में अनिश्चितता ओवरलोडिंग
  • RTTI क्योंकि स्मृति लागत बड़ी है का प्रतिनिधित्व करता है
  • निष्पादन की गति को कम करने की वजह से अपवाद

आभासी कार्यों के साथ सतर्क रहें क्योंकि उनके पास एक vtable की संसाधन लागत है प्रति वर्ग और प्रति वस्तु vtable के लिए एक सूचक। इसके अलावा, #define के स्थान पर कॉन्स का उपयोग करें।

जब आप 16 और 32-बिट एमसीयू तक पहुंचते हैं, तो 10 या 100 एमबी रैम के साथ, उपर्युक्त वर्णित भारी सुविधाओं का उपयोग किया जा सकता है।

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

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