यह एक उत्तर से अधिक एक राय / टिप्पणी है।
आप नहीं चाहते हैं और सही तरीके से उपयोग किए जाने पर C. C ++ में प्रोग्रामिंग नहीं की जानी चाहिए , यह कहीं बेहतर है। (ठीक है, मुझे स्वीकार करना होगा, जब गलत तरीके से उपयोग किया जाता है तो यह सी से कहीं अधिक खराब होता है) जो आपको उन चिप्स तक सीमित करता है जिनके पास एक (आधुनिक) सी ++ कंपाइलर है, जो कि जीसीसी द्वारा समर्थित है, जो AVR (साथ) कुछ सीमाओं, फिलो में एक गैर-समान पता स्थान की समस्याओं का उल्लेख किया गया है), लेकिन लगभग सभी PIC (PIC32 का समर्थन किया जा सकता है, लेकिन मुझे अभी तक कोई भी अच्छा पोर्ट नहीं मिला है)।
जब आप C / C ++ में प्रोग्रामिंग एल्गोरिदम कर रहे हैं, तो आपके द्वारा चुने गए विकल्पों के बीच का अंतर छोटा है (सिवाय इसके कि 8 या 16 बिट चिप एक गंभीर नुकसान में होगा जब आप 16, 32 या उच्च बिट अंकगणित करते हैं)। जब आपको प्रदर्शन के अंतिम औंस की आवश्यकता होती है, तो आपको शायद कोडांतरक (या तो अपना या कोड विक्रेता द्वारा प्रदान किया जाता है या एक तिहाई) का उपयोग करने की आवश्यकता होगी। उस स्थिति में आप अपने द्वारा चुने गए चिप पर फिर से विचार कर सकते हैं।
जब आप हार्डवेयर को कोड कर रहे होते हैं तो आप या तो कुछ अमूर्त परत (अक्सर निर्माता द्वारा प्रदान की जाती हैं) का उपयोग कर सकते हैं या अपना खुद का लिख सकते हैं (डेटाशीट और / या उदाहरण कोड के आधार पर)। IME मौजूदा C एब्स्ट्रक्शन (mbed, cmsis, ...) अक्सर फ़ंक्शनली (लगभग) सही होते हैं, लेकिन प्रदर्शन में बुरी तरह से विफल हो जाते हैं (एक पिन सेट ऑपरेशन के लिए अप्रत्यक्ष की 6 परतों के बारे में पुराने पड़ाव की जाँच करें), प्रयोज्य और पोर्टेबिलिटी। वे आपके लिए विशेष चिप की सभी कार्यक्षमता को उजागर करना चाहते हैं, जो लगभग सभी मामलों में आपको ज़रूरत नहीं होगी और इसके बारे में परवाह नहीं है, और यह आपके कोड को उस विशेष विक्रेता (और शायद उस विशेष चिप) को लॉक कर देता है।
यह C ++ बहुत बेहतर कर सकता है: जब ठीक से किया जाता है, तो एक पिन सेट 6 या अधिक अमूर्त परतों के माध्यम से जा सकता है (क्योंकि यह एक बेहतर (पोर्टेबल!) इंटरफ़ेस और कम कोड संभव बनाता है), फिर भी एक इंटरफ़ेस प्रदान करें जो लक्ष्य-स्वतंत्र हो! सरल मामलों के लिए , और फिर भी उसी मशीन कोड में परिणाम करें जैसा कि आप कोडांतरक में लिखेंगे ।
मेरे द्वारा उपयोग की जाने वाली कोडिंग शैली का एक स्निपेट, जो या तो आपको उत्साही बना सकता है या डरावनी स्थिति में ला सकता है:
// GPIO part of a HAL for atsam3xa
enum class _port { a = 0x400E0E00U, . . . };
template< _port P, uint32_t pin >
struct _pin_in_out_base : _pin_in_out_root {
static void direction_set_direct( pin_direction d ){
( ( d == pin_direction::input )
? ((Pio*)P)->PIO_ODR : ((Pio*)P)->PIO_OER ) = ( 0x1U << pin );
}
static void set_direct( bool v ){
( v ? ((Pio*)P)->PIO_SODR : ((Pio*)P)->PIO_CODR ) = ( 0x1U << pin );
}
};
// a general GPIO needs some boilerplate functionality
template< _port P, uint32_t pin >
using _pin_in_out = _box_creator< _pin_in_out_base< P, pin > >;
// an Arduino Due has an on-board led, and (suppose) it is active low
using _led = _pin_in_out< _port::b, 27 >;
using led = invert< pin_out< _led > >;
वास्तव में अमूर्तता की कुछ और परतें हैं। फिर भी एलईडी का अंतिम उपयोग, चलो इसे चालू करने के लिए कहते हैं, यह जटिलता या लक्ष्य का विवरण नहीं दिखाता है (एक आर्डिनिन यूनो या एसटी 32 ब्लू पिल के लिए कोड समान होगा)।
target::led::init();
target::led::set( 1 );
संकलक उन सभी परतों से भयभीत नहीं है, और क्योंकि कोई वर्चुअल फ़ंक्शन शामिल नहीं हैं जो कि अनुकूलक सब कुछ के माध्यम से देखता है (कुछ विवरण, छोड़े गए, जैसे परिधीय घड़ी को सक्षम करना):
mov.w r2, #134217728 ; 0x8000000
ldr r3, [pc, #24]
str r2, [r3, #16]
str r2, [r3, #48]
जो कि मैंने इसे असेंबलर में कैसे लिखा होगा - अगर मुझे पता चला है कि पीआईओ रजिस्टर का उपयोग आम आधार से ऑफसेट के साथ किया जा सकता है। इस मामले में मैं शायद करूंगा, लेकिन कंपाइलर इस तरह की चीजों का अनुकूलन करने से कहीं बेहतर है।
जहाँ तक मेरा उत्तर है, यह है: अपने हार्डवेयर के लिए एक अमूर्त परत लिखें, लेकिन इसे आधुनिक C ++ (अवधारणाओं, टेम्पलेट्स) में लिखें ताकि यह आपके प्रदर्शन को नुकसान न पहुंचाए। उस जगह के साथ, आप आसानी से दूसरी चिप में स्विच कर सकते हैं। तुम भी कुछ यादृच्छिक चिप पर विकसित करना शुरू कर सकते हैं, जो आपके आस-पास बिछा हुआ है, साथ में पारिवारिक हैं, आदि के लिए अच्छे डिबगिंग उपकरण हैं, और अंतिम विकल्प को बाद में स्थगित कर दें (जब आपके पास आवश्यक मेमोरी, सीपीयू की गति आदि के बारे में अधिक जानकारी हो)।
इम्बेडेड डेवलपमेंट के फालसे में से एक आईएमओ सबसे पहले चिप को चुन रहा है (यह इस मंच पर अक्सर पूछे जाने वाला प्रश्न है: मुझे किस चिप के लिए चुनना चाहिए .... सबसे अच्छा जवाब आमतौर पर है: यह कोई फर्क नहीं पड़ता।)
(संपादित करें - "तो प्रदर्शन वार, C या C ++ की प्रतिक्रिया समान स्तर पर होगी?"
समान निर्माणों के लिए, C और C ++ समान हैं। C ++ में एब्सट्रैक्शन (बस कुछ: क्लासेस, टेम्प्लेट, कॉन्स्टैक्स) के लिए बहुत अधिक निर्माण हैं, जो किसी भी टूल की तरह, अच्छे या बुरे के लिए उपयोग किए जा सकते हैं। चर्चाओं को अधिक रोचक बनाने के लिए: हर कोई इस बात से सहमत नहीं है कि अच्छा या बुरा क्या है ...