सी ++ बनाम द अरुडिनो भाषा?


81

Arduino का उपयोग करते समय प्रत्येक भाषा के क्या फायदे हैं?

मैं सोच रहा हूं कि यह एक अच्छा सामान्य प्रश्न है, लेकिन मैं थोड़ा सा जोड़ूंगा कि मैं यह क्यों पूछ रहा हूं कि क्या कोई मुझे टिप देना चाहता है।

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

मैं एक ऑक्टोकॉप्टर बना रहा हूं, और सोच रहा हूं कि एक वस्तु उन्मुख दृष्टिकोण सबसे आसान होगा। (सॉफ्टवेयर में बहुत सारी विशेषताएं होंगी ...) हालांकि मैंने कभी भी C ++ में नहीं लिखा है।

चूँकि यह एक प्रश्नोत्तर साइट है जो दूसरों की मदद करने वाली है, केवल शुरुआत में प्रस्तुत किया गया सामान्य प्रश्न ज्यादा महत्व रखता है, लेकिन मैं अपनी स्थिति पर किसी भी टिप्पणी की सराहना करता हूं।


16
Arduino IDE से बचें क्योंकि यह इसके IDE नाम के लायक नहीं है, यह एक बहुत ही गरीब संपादक है: यह शुरुआती और सरल रेखाचित्रों के लिए अच्छा हो सकता है लेकिन किसी को तेजी से कुछ बेहतर करना चाहिए।
jfpoilpret

4
यह "Arduino Programming Language" के द्वारा (और वास्तव में हुड के तहत क्या है) का एक बहुत ही संक्षिप्त ब्रेकडाउन है।
AdjunctProfectorFalcon

10
C++ vs. The Arduino Language?- "Arduino भाषा" है सी ++। आपको फ़ंक्शन प्रोटोटाइप करने से बचाने के लिए थोड़ी पूर्व-प्रक्रिया है, लेकिन यह निश्चित रूप से C ++ है।
निक गैमन

2
आर्डिनो भाषा जैसी कोई चीज नहीं है। यह बस एक पुस्तकालय है।
Overdrivr

2
इस सवाल से संबंधित नहीं है क्योंकि टिप्पणी: Atmel स्टूडियो मुफ्त है और IMHO यह Arduino प्रोग्रामिंग के लिए दृश्य स्टूडियो से बेहतर है। विजुअल माइक्रो प्लगइन का भी समर्थन करता है, हालांकि यह प्रोग्रामिंग और डीबगिंग आर्दीनो के लिए बिल्कुल भी आवश्यक नहीं है।
साइबरपाँक

जवाबों:


55

प्रोफेसर (प्रोग्रामिंग, मेक्ट्रोनिक्स) के रूप में मेरा व्यक्तिगत अनुभव यह है कि यदि आपके पास पिछले प्रोग्रामिंग अनुभव है और आपको ओओपी के रूप में अवधारणाओं के बारे में पता है, तो C / C ++ के लिए जाना बेहतर है। Arduino भाषा शुरुआती लोगों के लिए वास्तव में बहुत बढ़िया है, लेकिन कुछ सीमाएँ हैं (जैसे कि आपके पास एक ही फ़ोल्डर में आपकी सभी फाइलें होनी चाहिए)। और यह मूल रूप से C / C ++ का एक सरलीकरण है (आप व्यावहारिक रूप से Arduino कोड को C / C ++ फ़ाइल में कॉपी और पेस्ट कर सकते हैं, और यह काम करेगा)। यह भी समझ में आता है कि आप ग्रहण के रूप में एक पूरी तरह से ज्ञात आईडीई का उपयोग कर सकते हैं:

http://playground.arduino.cc/Code/Eclipse

प्रारंभ में यह आपके देव वातावरण के सेटअप और कॉन्फ़िगरेशन के लिए थोड़ा अधिक आवश्यक है, लेकिन IMHO यह प्रोग्रामर के लिए किसी अन्य भाषा में अनुभव के साथ इसके लायक है।

किसी भी मामले में, यह आपको कुछ दिनों के लिए arduino भाषा और arduino IDE का उपयोग शुरू करने के लिए नुकसान नहीं पहुंचाएगा और arduino हार्डवेयर से परिचित होने के लिए और फिर वास्तव में आपकी परियोजना को विकसित करने के लिए ग्रहण के साथ C / C ++ में स्थानांतरित होगा।


आपके विचारों के लिए धन्यवाद। मैं सभी विभिन्न हार्डवेयर टुकड़ों जैसे सेंसर और एलसीडी स्क्रीन आदि को नियंत्रित करने का तरीका जानने के लिए Arduino IDE का उपयोग करूंगा। फिर मैं ऑक्टोकॉप्टर के लिए सॉफ्टवेयर बनाने के लिए C ++ तक जाऊंगा। क्या आप अन्य भाषाओं को जानने वाले लोगों के लिए एक अच्छी और छोटी पुस्तक जानते हैं? कई पुस्तकों के साथ "समस्या" जो मैंने पाया है कि वे इसमें इतनी शामिल हैं कि मुझे इसकी आवश्यकता नहीं है क्योंकि मैं यूआई कंप्यूटर के बजाय एक छोटे से एटम माइक्रोकंट्रोलर पर हूं।
किम

1
जुलिएन बेले की एक अच्छी पुस्तक "सी प्रोग्रामिंग फॉर अरुडिनो" है जो उपयोगी है। यह C ++ भाषा नहीं है, लेकिन आपको आधार को समझने में मदद करनी चाहिए।
fenix688

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

1
C ++ OO सुविधाओं का समर्थन करता है, C भाषा नहीं करती है।
क्रिस ओ

1
@FriendofKim वास्तव में मेरा क्या मतलब नहीं था (हालांकि तकनीकी रूप से आप कर सकते हैं, इस कारण गैर-मेगाबाइट धारावाहिक संचार के लिए एक सॉफ्टवेयर समाधान का समर्थन करने के लिए उपवास पर्याप्त है, और इसमें कुल 5 U (S) ARTS हैं जबकि Arduino लाइब्रेरी केवल 4 प्रदान करते हैं उन्हें लेकिन iirc नियत बोर्ड वैसे भी USART में से किसी एक के लिए पिन प्रदान नहीं करता है); Arduino लाइब्रेरी असिंक्रोनस मोड का उपयोग करने के लिए USART को कॉन्फ़िगर करती है, लेकिन मुझे 6Mbps तक सिंक्रोनस की आवश्यकता होती है (और मुझे SPI मोड का उपयोग करना पड़ता था क्योंकि इनपुट को कच्चे बिटस्ट्रीम के रूप में माना जाता था इसलिए नो स्टॉप बिट्स / आदि), जो इसमें शामिल था। डिफ़ॉल्ट PIO कंट्रोलर कॉन्फिगरेशन को संशोधित करना।
JAB

48

सिद्धांत रूप में ...
वहाँ वास्तव में इस तरह के रूप में एक Arduino भाषा नहीं है। यह वास्तव में कुछ डोमेन-विशिष्ट पुस्तकालयों के साथ सिर्फ सी ++ है। ये विभिन्न विशेषताओं पर जोड़ते हैं, जैसे कि फ़ंक्शन जिन्हें आप हार्डवेयर को नियंत्रित करने के लिए कॉल कर सकते हैं। यदि आपके पास वे कार्य नहीं हैं, तो आपको सब कुछ नियंत्रित करने के लिए विशेष रजिस्टरों के साथ सीधे फ़ेल करने की आवश्यकता होगी। इस तरह से एम्बेडेड प्रोग्रामिंग आमतौर पर किया जाता है। यह तेज़ है, लेकिन इसे सीखना और समझना काफी कठिन हो सकता है।

कार्यों के अलावा, पुस्तकालय कुछ प्रकारों के लिए वैकल्पिक नाम जोड़ते हैं। उदाहरण के लिए, booleanऔर byteC ++ मानक में नहीं हैं। हालांकि, वे सीधे boolऔर के बराबर हैं unsigned char

इन सभी बातों का मतलब है कि आप बिना किसी कठिनाई के सीधे Arduino पर सामान्य C ++ कोड पोर्ट कर सकते हैं। हालांकि, दूसरे तरीके से वापस जाने पर कुछ मामूली संपादन की आवश्यकता हो सकती है।

व्यवहार में ...
उस सब के बाद, Arduino के लिए प्रोग्रामिंग बिल्कुल सामान्य C ++ प्रोग्रामिंग के समान नहीं है। बहुत सारे अंतर सभी एम्बेडेड प्रोग्रामिंग के लिए आम हैं (जैसे कि सीमित मेमोरी और प्रोसेसिंग पावर)।

यह भी ध्यान देने योग्य है कि यदि आप आधिकारिक Arduino IDE का उपयोग कर रहे हैं तो आपके कोड को कैसे सेट किया जाए, इस पर सभी प्रकार के कष्टप्रद झटके और सीमाएँ हैं। सभी मामलों में वर्कअराउंड हैं (जहां तक ​​मुझे पता है), लेकिन वे कभी-कभी काफी निराश होते हैं।

पूर्ण लचीलेपन के लिए, Arduino का समर्थन करने के लिए प्लग-इन के साथ तृतीय-पक्ष IDE (जैसे ग्रहण) का उपयोग करें। आपको Arduino पुस्तकालयों के साथ-साथ C ++ के सभी लाभ प्रदान करने चाहिए।


25

Arduino का उपयोग करते समय C ++ बनाम Arduino भाषा के क्या फायदे हैं? मैं जावास्क्रिप्ट, PHP जैसी पूर्वप्रेरित भाषाओं में अनुभवी हूं, और जावा और विजुअल बेसिक जैसी भाषाओं से युक्त हूं।

सबसे पहले, Arduino संकलक / IDE C-C ++ को इस रूप में स्वीकार करता है। वास्तव में कई पुस्तकालय सी ++ में लिखे गए हैं। अंतर्निहित प्रणाली का अधिकांश वस्तु उन्मुख नहीं है, लेकिन यह हो सकता है।

इस प्रकार, "द आर्डिनो भाषा" C ++ या C है।

C ++ कचरा एकत्रित नहीं है। यह वैरिएबल को कार्यक्षेत्र में रखता है - यदि आप लिखते हैं:

int led = 13;

void blinkTimes(int value)
{
   int i;

   for(i=0;i<value;i++)
   {
      digitalWrite(led, HIGH);
      delay(1000);
      digitalWrite(led, LOW);
      delay(1000);
   }
}

तो फिर तुम कि मिल जाएगा ledऔर iविकसित नहीं होते या रिसाव, कोई फर्क नहीं पड़ता कि आप कितनी बार फोन blinkTimes

यदि iकोई वर्ग होता है, तो फ़ंक्शन समाप्त होने के बाद इसका समान रूप से निपटान किया जाएगा। इसलिए जब तक आप newनई वस्तुओं को बनाने के लिए स्मृति आवंटन कार्यों का उपयोग या समान नहीं कर रहे हैं , तब तक आपको लीक के बारे में चिंता करने की आवश्यकता नहीं होगी।

आप अभी भी मेमोरी से बाहर भाग सकते हैं, यदि आप बहुत बड़ी कक्षाएं बनाते हैं और उनमें से बहुत से का उपयोग नेस्टेड फ़ंक्शंस में करते हैं, लेकिन सामान्य तौर पर आप तब तक परेशानी में नहीं पड़ेंगे जब तक आप newऔर freeफ़ंक्शंस शुरू नहीं करेंगे ।

यदि आप उपयोग कर रहे हैं new, तो आपको deleteउचित समय पर कॉल करना होगा । C ++, और एक्सटेंशन Arduino द्वारा, कोई भी स्वचालित कचरा संग्रह नहीं है, आपको अपनी स्मृति को स्पष्ट रूप से प्रबंधित करना होगा।


1
ठीक है, अगर तात्कालिक वस्तुएं (नए के साथ) कचरा एकत्र नहीं की जाती हैं, तो मुझे यह भी सीखना होगा। मुझे लगता है कि C ++ पर किसी भी पुस्तक को कवर किया जाएगा। अच्छे उत्तर के लिए धन्यवाद!
किम

14

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

Arduino और C ++ के बीच मुख्य अंतर मेमोरी स्टोरेज में हैं। आमतौर पर एक आधुनिक कंप्यूटर में 2GB से अधिक RAM होता है, जबकि Arduino Uno में 2kB (1 मिलियन गुना कम) होता है। Arduino 32 बिट्स जो एक कंप्यूटर उपयोग करता है, के अनुसार 8-बिट निर्देशों का उपयोग करता है। यह मुख्य रूप से एक चर में आपके द्वारा संग्रहीत जानकारी की मात्रा को प्रभावित करेगा।

यदि आप Arduino की दुनिया में बहुत नए हैं, तो आपको एक ट्यूटोरियल देखना चाहिए, क्योंकि वहाँ बहुत सारे अच्छे हैं।


आप स्मृति का उल्लेख करें। मेरे पास ड्यू है जिसमें 96KB RAM है। लेकिन आखिरी चीज जो मैं चाहता हूं कि मैमोरी लीक के कारण दुर्घटनाग्रस्त होने के लिए कोप्टर के लिए है (एक बहुत महंगा कैमरा है, जो पुलिस वाले पर लगा हुआ है)।
किम

क्या C ++ में मेमोरी स्वचालित रूप से नियंत्रित की जाती है (जैसे जावा में कचरा कलेक्टर) यदि अन्यथा निर्दिष्ट नहीं है?
किम

2
C ++ मानक स्मृति आकारों के बारे में कोई गारंटी नहीं देता है - c ++ पहले से ही बिना संशोधन के एम्बेडेड हार्डवेयर पर चलता है।
माइकल थॉर्प

2
आप हार्डवेयर प्लेटफार्मों के बीच अंतर का वर्णन कर रहे हैं, न कि C ++ हालांकि।
साइबरबर्गन

5
@FriendofKim C ++ में, चर / ऑब्जेक्ट्स को इंस्टेंट करने के दो अलग-अलग तरीके हैं। यदि आप उन्हें स्थानीय रूप से त्वरित रूप से (जैसे int blah = 5;) करते हैं, तो वे स्वचालित रूप से नष्ट हो जाएंगे जब वे दायरे से बाहर हो जाएंगे (यानी लूप या फ़ंक्शन के अंत में)। हालाँकि, यदि आप उन्हें ढेर (जैसे int *blah = new int(5);) पर इंस्टेंट करते हैं, तो आपको उन्हें स्वयं जारी करने की आवश्यकता है। यह आमतौर पर एम्बेडेड प्रोग्रामिंग में ढेर डेटा का उपयोग करने के लिए बुद्धिमान नहीं है।
पीटर ब्लूमफील्ड

14

--- अपडेट 170412
मैंने अपना मूल उत्तर तीन साल पहले लिखा था, जिसमें एक अलग "अरुडिनो सी ++" मौजूद था। आईडीई में प्रयुक्त भाषा है , क्योंकि यह GNU सी ++ संकलक द्वारा कार्यान्वित किया जाता, मानक सी ++। "स्पष्ट" मतभेद रेंगते हैं, क्योंकि IDE कुछ पूर्व-प्रक्रिया करेगा, जो भाषा में नए लोगों की मदद करने के लिए 'गेटका के जोड़े से बचने के लिए, कुछ #includes, f / ex में भरकर। लेकिन आप कर सकते हैं - और मैं - यह करने के लिए सही सी ++ लिखें और आप जो पाने की उम्मीद करते हैं उसे प्राप्त करें।
--- अंत अद्यतन

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

स्मृति के बारे में आपके प्रश्न के लिए: C ++ कचरा-संग्रह नहीं करता है। स्टैक-आधारित भाषाएं जैसे C और C ++ फ़ंक्शन एंट्री पर स्वचालित चर के लिए स्टैक पर अस्थायी भंडारण आवंटित करती हैं, जो तब वापस आती है जब फ़ंक्शन वापस लौटता है, लेकिन यह सही कचरा-संग्रह नहीं है। ढेर- या वैश्विक स्मृति में बनाई गई वस्तुएं तब तक जीवित रहती हैं जब तक आप उन्हें स्पष्ट रूप से हटा नहीं देते। सुनिश्चित करें कि आप जानते हैं कि कहां, कब और कितनी देर तक विभिन्न प्रकार की वस्तुओं का निर्माण किया जाएगा। आप वास्तव में अपने newकोडिंग और delete-ing ऑब्जेक्ट्स विली- निली नहीं चाहते हैं । वे ढेर मेमोरी में बनाए जाएंगे, इसे टुकड़े टुकड़े कर देंगे और इसे ढेर में उगाएंगे। जब आपका कोड - और आपका अच्छा 'कॉप्टर' क्रैश हो जाएगा।

सी आप के लिए कम है, तो यह कम कर सकते हैं करता है करने के लिए आप। यह एक बुरा विकल्प नहीं है। C ++ की कुछ सुविधाओं के साथ C और भी बेहतर विकल्प हो सकता है, यदि आप अतिरिक्त सुविधाओं का चुनाव विवेकपूर्ण तरीके से करते हैं। C ++, यदि वे आपके दो विकल्प हैं:

[मूल उत्तर] - C ++ एक मानकीकृत भाषा है। यह एम्बेडेड सिस्टम सहित कई वातावरणों में व्यापक रूप से तैनात है और इसलिए बहुत अच्छी तरह से सी-सी ++ भाषा की तुलना में अधिक अच्छी तरह से परीक्षण किया जाता है जो कि "Arino" है। यह मिशन-महत्वपूर्ण / सुरक्षा-महत्वपूर्ण अनुप्रयोगों जैसे कि आप योजना बना रहे हैं के लिए विशेष रूप से महत्वपूर्ण है। दुर्घटनाग्रस्त कोड का अर्थ है दुर्घटनाग्रस्त 'काप्टर और यहां तक ​​कि अगर यह किसी को चोट नहीं पहुंचाता है, तो यह आपकी महंगी मशीन को तोड़ देगा

  • मानक होने के नाते, C ++ पोर्टेबल है। अपने प्रोसेसर को अपग्रेड करने की आवश्यकता है? सब कुछ लेकिन सिलिकॉन-विशिष्ट कोड नए को पोर्ट करेगा। अपने टूलसेट, विकास प्रणाली, होस्ट ओएस को बदलने की आवश्यकता है? C ++ को हर जगह सपोर्ट किया जाएगा। हालांकि Arduino IDE जावा समर्थित है, कहीं भी चलेगा, यह एकमात्र उपकरण है जो Arduino C ++ का उपयोग करता है और यह एक बहुत ही सीमित उपकरण है। यदि आप ग्रहण का उपयोग करना चाहते हैं, तो AVR टूल, कमांड-लाइन पर नंगे पैर जाएं, Emacs के भीतर विकसित करें, या जो भी अन्य वातावरण आप पसंद करते हैं, मानक C ++ का समर्थन किया जाएगा।

  • Arduino IDE आपकी पीठ के पीछे की चीजें करता है - विशेष रूप से, यह #includes .h फाइलें जब यह सोचता है कि आपको उनकी आवश्यकता है। यहां तक ​​कि अगर यह सही है, तो आप वास्तव में लिखना चाहते हैं, या कम से कम देखते हैं और समझते हैं, जो कुछ भी संकलक देखने जा रहा है। कंप्यूटर के लिए प्रोग्रामिंग भाषाएं नहीं बनाई जाती हैं (कंप्यूटर नाश्ते के लिए बिट्स खाते हैं); वे लोगों के लिए, विशेष रूप से उन लोगों के लिए बने हैं, जो प्रोजेक्ट पर आपका अनुसरण करते हैं, जिनमें से सबसे महत्वपूर्ण हो सकता है ... आप!, जब एक मॉड्यूल लिखने के 6 महीने बाद, आपको इसे बढ़ाने के लिए वापस आना होगा, या अधिक संभावना है, इसे ठीक करें। आप वास्तव में सब कुछ देखने में सक्षम होना चाहते हैं जो कंपाइलर देखता है।


2
यह वास्तव में एक अच्छा जवाब है। यह स्पष्ट प्रतीत होता है कि आपको C ++ पसंद है और मुझे भी इसे पसंद करना चाहिए! ... लेकिन गंभीरता से, मैं सी ++ पर सही तरीके से कूदूंगा जैसे ही मैं समझ गया हूं कि विभिन्न सेंसर आदि के साथ "संचार" कैसे काम करता है।
किम

क्या आप इस विषय पर कोई अच्छी किताब जानते हैं? (मेरे लिए सूट किया गया है जो अन्य भाषाओं में वर्षों से प्रोग्रामिंग कर रहे हैं, और केवल C ++ के "एम्बेडेड भाग" की आवश्यकता है।)
किम

क्या आपको लगता है कि त्वरित C ​​++ इसके लिए एक अच्छी पुस्तक है?
किम

2
काश मैं 'सही' किताब के साथ आपकी मदद कर सकता, लेकिन मैं C ++ में मेरे पीछे बहुत से C के साथ आया और Kernighan & Ritchie की The C प्रोग्रामिंग लैंग्वेज अभी भी मेरी गो-टू बुक है (बुरी सज़ा) किसी भी चीज़ के लिए स्पष्ट रूप से C ++ , और एलिस और स्ट्रॉस्ट्रुप के एनोटेट सी ++ संदर्भ मैनुअल सी ++ के लिए। लेकिन हार्डवेयर लिखने के लिए, आप Arduino.cc पर उपयोगकर्ताओं द्वारा योगदान किए गए कुछ डिवाइस पुस्तकालयों को देखने के लिए अच्छा करेंगे । पिनमोड (), digitalWrite () और digitalRead () फ़ंक्शंस के साथ I / O पोर्ट्स को ट्विक करना शुरू करें, फिर उनका एनालॉग i / o समकक्षों, और अंततः, ...
JRobert

1
... स्पीड और मेमोरी-स्पेस सुधार के लिए I / O रजिस्टर पर सीधे लिखने की योजना। Blinky.cpp और hello.cpp जैसे कार्यक्रम हार्डवेयर के साथ खिलवाड़ करने के लिए अच्छी जगह हैं। एक साधारण मल्टीमीटर को जोड़ें, और कुछ एलइडी को सही वर्तमान-सीमित प्रतिरोधों के साथ स्थायी रूप से एक पैर में मिलाया जाता है और आपको वास्तविक, यदि सरल, आपके प्रयासों से परिणाम देखने में सक्षम होना चाहिए। उसके बाद, किसी भी हार्डवेयर के लिए डेटा-शीट पढ़ें, जो आपको यह जानने के लिए रुचि रखता है कि आप उन्हें खेलने के लिए क्या संकेत पढ़ सकते हैं / उन्हें लिखना चाहिए। तापमान सेंसर का उपयोग करना आसान है और हर किसी को फ्रिज लकड़हारे की आवश्यकता नहीं है? मज़े करो!
JRobert

10

मेरे अनुभव में, सीमित मेमोरी वाले मशीनों पर चलने पर नए से बचना और हटाना सबसे अच्छा है ।

  • मेमोरी प्रबंधन स्वयं मूल्यवान प्रोग्राम और रैम स्पेस का उपयोग करता है
  • ISR वैक्टर संकलन tme पर सेट किए जाते हैं। रन समय में आईएसआर का दावा करने के लिए एक वर्ग उदाहरण के लिए यह असंभव (असंभव) है
  • आम तौर पर आपको संकलन समय पर पता चल जाएगा कि आपको किस वर्ग के उदाहरणों की आवश्यकता है - जैसे 3 बटन डिबेंसेर्स, एक डिस्प्ले ड्राइवर और एक 2-लाइन डिस्प्ले ड्राइवर
  • जब आप नए का उपयोग करते हैं या हटाते हैं, तो स्मृति प्रबंधन अज्ञात देरी का परिचय देता है।

ऐसे मामले हो सकते हैं जहां गतिशील आवृत्ति निर्माण और विनाश का उपयोग करना उचित है, लेकिन मुझे संदेह है कि वे दुर्लभ हैं।


C ++ में पूरी तरह से नया होने के नाते, मेरे पास STD के संबंध में एक अनुवर्ती प्रश्न है। क्या यह एक बुरा विचार स्मृति का उपयोग करने के लिए बुद्धिमान है? यदि नहीं, तो इसे कैसे जोड़ा जा सकता है (ग्रहण)? मैंने AVR कंपाइलर और उसके काम को अच्छी तरह से सेट किया है।
किम

1
आप जो कहते हैं वह सब सही है, लेकिन मैं यह नहीं देखता कि यह ओपी सवाल का जवाब कैसे है। newऔर deleteArduino IDE में भी उपलब्ध हैं।
jfpoilpret

यह एक जवाब नहीं है, लेकिन बहुत उपयोगी जानकारी है जो मैं वास्तव में सराहना करता हूं।
किम

8

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


6

उपरोक्त टिप्पणियों के अलावा, मैं आगे काम करने वाली रैम के साथ समस्याओं पर जोर देना चाहूंगा जो आपके पास Arduino बोर्डों पर है, विशेष रूप से Uno (और अन्य जो समान माइक्रोकंट्रोलर साझा करते हैं) के साथ। मैंने हाल ही में एक 32x32 एलईडी मैट्रिक्स पर चलने वाला एक सरल अंतरिक्ष आक्रमणकारी गेम लिखा था और बार-बार कम मेमोरी के कारण होने वाली समस्याओं में भाग गया था।

Uno में केवल 2048 बाइट्स RAM है। मेरे मैट्रिक्स के लिए लाइब्रेरी ने 3/4 से अधिक लिया और मुझे खेल के लिए लगभग 400 बाइट के साथ छोड़ दिया। जैसा कि यह मेरा इरादा है कि कुछ बिंदुओं पर प्रोजेक्ट को "अपग्रेड" करने के लिए एक ही प्रोग्राम बेस के साथ कई गेम चलाने के लिए और अधिक शक्तिशाली होने के कारण, मैंने OO प्रिंसिपल और बहुत से वर्ग विरासत के साथ कोड डिज़ाइन किया है। (खेल वर्ग को वर्चुअल अपडेट और ड्रॉ कॉल के साथ विरासत में मिला था, खेल संस्थाएं सभी विरासत में मिली थीं)।

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

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

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


4

Arduino भाषा है सी ++ (हालांकि अक्सर यह अधिक "वर्गों के साथ सी," जो एम्बेडेड सिस्टम माइक्रोकंट्रोलर दुनिया में वास्तव में काफी आम है की तरह एक शैली में लागू)। कहानी का अंत। लोगों के साथ यह सोचकर कि यह पहले से ही एक अलग भाषा है! यह g ++ कंपाइलर का उपयोग करता है।

सबूत:

वरीयताओं में संकलन के दौरान वर्बोज़ आउटपुट सक्षम करें और अपलोड करें और आप उन पंक्तियों को पढ़कर बहुत कुछ सीखेंगे।

यहाँ कुछ अतिरिक्त जानकारी दी गई है:

मेरे अपने शब्द:

Arduino कोड है सी ++। Arduino कोर फ़ंक्शंस बस C ++ कक्षाओं और पुस्तकालयों का एक सेट है जिसका आप उपयोग कर सकते हैं। यह GNU gcc / g ++ कंपाइलर का उपयोग करके बनाया और संकलित किया गया है । आपका सेटअप () और लूप () फ़ंक्शन केवल अनिवार्य मुख्य () फ़ंक्शन में रखे गए हैं ( यहीं वास्तव में - फ़ाइल "main.cpp" है, जो कि आपके लिए C ++ स्रोत फ़ाइल है) स्वचालित रूप से है और कुछ अतिरिक्त है यह सुनिश्चित करने के लिए किया गया है कि यह एक मान्य C ++ प्रोग्राम है (उदा: सभी फ़ंक्शन प्रोटोटाइप [aka: घोषणाओं के लिए स्कैनिंग) ताकि आप किसी फ़ंक्शन का उपयोग कर सकें, भले ही इसका प्रोटोटाइप आपके .ino फ़ाइल में बाद में आए। Arduino का अधिकांश भाग "C स्टाइल" में लिखा गया है, हालांकि, और इसलिए # extern "C" {}C ++ को रोकने के लिए इसके चारों ओर ब्रेसिज़ की आवश्यकता होती हैAVR-libc द्वारा कार्यान्वित C फ़ंक्शन के लिए "name-mangling" (जिसे "नाम सजाने / नाम सजावट" के रूप में भी जाना जाता है ) फ़ंक्शन कॉल करता है , जो ATmega328 और अन्य AVR- आर्किटेक्चर माइक्रोकंट्रोलर्स के लिए C कार्यान्वयन है।

Arduino के शब्द:

" क्या मैं Arduino बोर्ड को C में प्रोग्राम कर सकता हूं?
वास्तव में, आप पहले से ही हैं; Arduino भाषा केवल C / C ++ फ़ंक्शन का एक सेट है जिसे आपके कोड से कॉल किया जा सकता है। आपका स्केच मामूली परिवर्तन से गुजरता है (जैसे फ़ंक्शन फ़ंक्शन के स्वचालित पीढ़ी)। और फिर सीधे C / C ++ कंपाइलर (avr-g ++) को पास कर दिया जाता है। avr-g ++ द्वारा समर्थित सभी मानक C और C ++ कंस्ट्रक्शन को Arduino में काम करना चाहिए। अधिक जानकारी के लिए, Arduino बिल्ड प्रोसेस पर पेज देखें । "

स्रोत: https://www.arduino.cc/en/Main/FAQ#toc13

Arduino लाइब्रेरी बनाम शुद्ध C या C ++ का उपयोग कब करें ?

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

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