এটি উত্তরের চেয়ে মতামত / মন্তব্য।
আপনি চান না এবং সি সি ++ তে প্রোগ্রামিং করা উচিত নয়, যখন সঠিক উপায়ে ব্যবহার করা হয় তখন অনেক উচ্চতর। (ঠিক আছে, আমাকে স্বীকার করতে হবে, যখন সি এর চেয়েও খারাপ এটি ভুল উপায়ে ব্যবহৃত হয়) এটি আপনাকে (আধুনিক) সি ++ সংকলকযুক্ত চিপগুলির মধ্যে সীমাবদ্ধ করে, যা মোটামুটি চিরকালীন যা জি সি সি দ্বারা সমর্থিত, এভিআর সহ (সহ) কিছু সীমাবদ্ধতা, ফিলো একটি অ-অভিন্ন ঠিকানা জায়গার সমস্যার উল্লেখ করে), তবে প্রায় সমস্ত পিআইসি বাদ দিয়ে (পিআইসি 32 সমর্থনযোগ্য হতে পারে, তবে আমি এখনও কোনও শালীন বন্দর দেখিনি)।
আপনি যখন সি / সি ++ এ অ্যালগরিদমগুলি প্রোগ্রাম করছেন আপনি যে পছন্দগুলি উল্লেখ করেছেন তার মধ্যে পার্থক্যটি সামান্য (বাদে যখন আপনি 16, 32 বা উচ্চতর বিট পাটিগণিত করেন তখন একটি 8 বা 16 বিট চিপ মারাত্মক অসুবিধার হয়ে থাকে)) যখন আপনাকে সম্পাদনের শেষ আউন্সটির দরকার হয় তখন আপনাকে সম্ভবত এসেম্বলার ব্যবহার করতে হবে (হয় আপনার নিজের বা বিক্রেতার দ্বারা সরবরাহ করা কোড বা তৃতীয় পক্ষ)। সেক্ষেত্রে আপনি নির্বাচিত চিপটি পুনরায় বিবেচনা করতে চাইতে পারেন।
আপনি যখন হার্ডওয়্যারটিতে কোডিং করছেন আপনি হয় কিছু বিমূর্ত স্তর ব্যবহার করতে পারেন (প্রায়শই প্রস্তুতকারকের দ্বারা সরবরাহ করা হয়) বা আপনার নিজের (ডেটাশিট এবং / অথবা উদাহরণ কোডের উপর ভিত্তি করে) লিখতে পারেন। আইএমই বিদ্যমান সি বিমূর্ততা (এমবেড, সিমসিস, ...) প্রায়শই কার্যকরী হয় (প্রায়) সঠিক, তবে কার্য সম্পাদনে মারাত্মকভাবে ব্যর্থ হয় (পিন সেট অপারেশনের জন্য ওপেনারেশনের প্রায় 6 স্তরগুলি ওল্ডফার্টগুলি পরীক্ষা করে), ব্যবহারযোগ্যতা এবং বহনযোগ্যতা। তারা আপনার কাছে নির্দিষ্ট চিপের সমস্ত কার্যকারিতা উন্মোচিত করতে চায়, যা প্রায় সকল ক্ষেত্রেই আপনার প্রয়োজন হবে না বরং যত্ন নেবে না এবং এটি আপনার কোডটি সেই নির্দিষ্ট বিক্রেতার কাছে লক করে (এবং সম্ভবত সেই নির্দিষ্ট চিপ))
এটি হ'ল সি ++ আরও ভাল কিছু করতে পারে: সঠিকভাবে সম্পন্ন করার পরে, একটি পিন সেটটি 6 বা তার বেশি বিমূর্ত স্তরগুলির মধ্য দিয়ে যেতে পারে (কারণ এটি একটি ভাল (পোর্টেবল!) ইন্টারফেস এবং সংক্ষিপ্ত কোডকে সম্ভব করে তোলে), তবুও একটি ইন্টারফেস সরবরাহ করে যা লক্ষ্য-স্বাধীন is সাধারণ ক্ষেত্রে , এবং এখনও আপনি এসেম্বেলারে লিখবেন ঠিক একই মেশিন কোডের ফলাফল ।
আমি ব্যবহার করি কোডিং স্টাইলের একটি স্নিপেট, যা আপনাকে মন্ত্রমুগ্ধ করে তুলতে পারে বা ভীতিতে ফিরে যেতে পারে:
// 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]
আমি কীভাবে এটি এসেম্বলারের মধ্যে লিখতে চাইতাম - যদি আমি বুঝতে পারি যে পিআইও রেজিস্টারগুলি একটি সাধারণ বেস থেকে অফসেটের সাথে ব্যবহার করা যেতে পারে। এই ক্ষেত্রে আমি সম্ভবত করব, তবে কম্পাইলারটি আমার চেয়ে এই জাতীয় জিনিসগুলির অনুকূলকরণে অনেক বেশি ভাল।
আমার উত্তর যতদূর পাওয়া যায়, তা হ'ল: আপনার হার্ডওয়্যারের জন্য বিমূর্ত স্তরটি লিখুন তবে এটি আধুনিক সি ++ (ধারণা, টেম্পলেট) এ করুন যাতে এটি আপনার কর্মক্ষমতা ক্ষতি করে না। সেই জায়গায়, আপনি সহজেই অন্য চিপে স্যুইচ করতে পারেন। এমনকি আপনি যে কয়েকটি এলোমেলো চিপ আপনি রেখেছিলেন তা বিকাশ করা শুরু করতে পারেন, ফ্যামিলিয়ায়ার হচ্ছেন, এর জন্য ভাল ডিবাগিং সরঞ্জামাদি ইত্যাদি রয়েছে এবং চূড়ান্ত পছন্দটি স্থির করে নিন যতক্ষণ না পরে (যখন আপনার প্রয়োজনীয় মেমরি, সিপিইউ গতি ইত্যাদি সম্পর্কে আরও তথ্য থাকবে)।
আইএমও এম্বেডড ডেভলপমেন্টের অন্যতম ত্রুটিটি প্রথমে চিপটি বেছে নিচ্ছে (এটি প্রায়শই এই ফোরামে প্রশ্ন করা হয়: কোন চিপটি আমার পছন্দ করা উচিত .... সর্বোত্তম উত্তরটি সাধারণত: কোনও ব্যাপার নয়))
(সম্পাদনা - "সুতরাং পারফরম্যান্স অনুসারে প্রতিক্রিয়া, সি বা সি ++ একই স্তরে থাকবে?")
একই নির্মাণের জন্য, সি এবং সি ++ একই। সি ++ এর বিমূর্তকরণের জন্য আরও অনেকগুলি নির্মাণ রয়েছে (মাত্র কয়েকটি: শ্রেণি, টেম্পলেট, কনস্টেক্সপ্র) যা কোনও সরঞ্জামের মতো ভাল বা খারাপের জন্য ব্যবহার করা যেতে পারে। আলোচনাগুলিকে আরও আকর্ষণীয় করে তোলার জন্য: সবাই ভাল বা খারাপ কী তা নিয়ে একমত হয় না ...