পিআইসি 32 বনাম ডিএসপিক বনাম এআরএম বনাম এভিআর, যখন আমরা সি-ল্যাঙ্গুয়েজে প্রোগ্রাম করি তখন কি আর্কিটেকচারের বিষয়টি গুরুত্বপূর্ণ? [বন্ধ]


10

আমরা বর্তমানে 32-বিট PIC32 মাইক্রোকন্ট্রোলার ব্যবহার করছি। এটি আমাদের প্রয়োজনের জন্য সূক্ষ্মভাবে কাজ করছে, তবে আমরা অন্যান্য মাইক্রোকন্টোলারদেরও সন্ধান করছি যা আমাদের আরও ভাল করে স্যুট করতে পারে + আমাদের আরও কিছু প্রকল্প রয়েছে যার জন্য আমরা এমসিইউ নির্বাচন করছি। সেই উদ্দেশ্যে আমরা এআরএম ভিত্তিক এসএএম ডিএ মাইক্রোকন্টোলার নির্বাচন করেছি যা একই 32-বিট তবে এটিআরএম ভিত্তিক (পিআইসি 32 -র চেয়ে বেশি জনপ্রিয় - শিল্প বুদ্ধিমান)।

এখন পিক 32 এর জন্য আমরা এমপিএলবি ব্যবহার করি তবে এআরএম কর্টেক্স-এম0 এর জন্য, আমরা আটমেল স্টুডিও ব্যবহার করব। আমরা উভয় প্ল্যাটফর্মে সি-ভাষা ব্যবহার করব। আমার উদ্বেগের বিষয়টি হ'ল, আমরা দুটি 32 বিট মাইক্রোকন্টোলার ব্যবহার করব (একই সংস্থা থেকে) তবে বিভিন্ন আর্কিটেকচার থাকবে। এর জন্য আমাদের দুটি পৃথক ডিভাইস শিখতে হবে এবং আমাদের "শেখার বক্রতা" + সরবরাহের সময় বাড়িয়ে তুলবে। তবে অন্যদিকে, আমি এটাও মনে করি যেহেতু আমরা উভয় ক্ষেত্রেই সি-ভাষা ব্যবহার করব, তাই আর্মের জন্য শেখার বক্ররেখাটি শোনা উচিত নয় এবং সেই প্রসেসরের অন্বেষণও মূল্যবান।

আমার মূল প্রশ্নটি হ'ল, আমরা যখন সি-ল্যাঙ্গুয়েজে প্রোগ্রামিং করি তখন আর্কিটেকচারটি কতটা তাত্পর্যপূর্ণ করে তোলে কারণ এটি মাইক্রোকন্ট্রোলারের অভ্যন্তরীণগুলির বিমূর্ততা সরবরাহ করে। এবং সিপিএল প্রোগ্রামিং বিবেচনা করে এমপিএলএপ এবং আতেল স্টুডিওতে প্রধান পার্থক্যগুলি কী


2
যদি জিনিসগুলি পিআইসি 32 নিয়ে কাজ করে, তবে স্যুইচ করার কী দরকার? এমনকি কোডটি পুরোপুরি পোর্ট করে (এটি হবে না), অভ্যস্ত হওয়ার জন্য এখনও নতুন সরঞ্জাম চেইন এবং আইডিই রয়েছে। আলোচ্য বিষয়টি কি? ধর্মীয় কারণে স্যুইচ করা বা "এআরএম ভিত্তিক" হতে (বা অন্য কোনও কিছু ভিত্তিক) মূর্খ। আপনার একটি ভাল কারণ থাকা দরকার, তবে আপনি আমাদের কোনও দেখান নি।
অলিন ল্যাথ্রপ

আমি স্যুইচিং সম্পর্কে জিজ্ঞাসা করিনি। আমরা অন্যান্য প্রকল্পের জন্য একটি ভিন্ন আর্কিটেকচার বেছে নেওয়ার কথা বলেছিলাম কারণ আমরা একাধিক প্রকল্পে কাজ করছি + আমাদের বিদ্যমান ডিজাইনের উন্নতির সুযোগ রয়েছে। মূল বিষয় ছিল একই সময়ে দুটি পৃথক স্থাপত্যের সাথে কাজ করার ক্ষেত্রে বক্ররেখা এবং চ্যালেঞ্জগুলি সম্পর্কে।
ইঞ্জিনিয়ার

একটা জিনিস আমি খুঁজে পেলাম যে আটল স্টুডিও এমপিএলবি ইউটিউব ভিডিওর
ইঞ্জিনিয়ার

উত্তর:


20

এটি বেশ একটি মতামতযুক্ত বিষয়। আমি নিজের পক্ষে কথা বলতে পারি (এভিআর, এআরএম, এমএসপি ৪৪০)

পার্থক্য 1 (সবচেয়ে উল্লেখযোগ্য) পেরিফেরিয়ালগুলিতে রয়েছে। প্রতিটি এমসইউতে ইউআআরটি, এসপিআই, টাইমারস ইত্যাদি থাকে - কেবল নাম নিবন্ধ করুন এবং বিটগুলি আলাদা are চিপসের মধ্যে কোড সরিয়ে দেওয়ার সময় বেশিরভাগ সময় এটিই আমার প্রধান সমস্যা ছিল। সমাধান: আপনার ড্রাইভারগুলিকে একটি সাধারণ এপিআই দিয়ে লিখুন, যাতে আপনার অ্যাপ্লিকেশনটি পোর্টেবল হতে পারে।

পার্থক্য 2 মেমরি আর্কিটেকচার। আপনি যদি কোনও এভিআর ফ্ল্যাশগুলিতে ধ্রুবক স্থাপন করতে চান তবে সেগুলি পড়ার জন্য আপনাকে বিশেষ গুণাবলী এবং বিশেষ ফাংশন ব্যবহার করতে হবে। এআরএম বিশ্বে আপনি কেবলমাত্র একটি পয়েন্টারকে অবজ্ঞা করেন কারণ সেখানে একটি একক ঠিকানার স্থান রয়েছে (আমি জানি না ছোট পিকগুলি কীভাবে এটি পরিচালনা করে তবে তারা ধরে নিবে যে তারা এভিআরের কাছাকাছি রয়েছে)।

পার্থক্য 3 হ'ল বিঘ্নিত ঘোষণা এবং হ্যান্ডলিং। avr-gccহয়েছে ISR()ম্যাক্রো। এআরএম এর কেবল একটি ফাংশনের নাম রয়েছে (যেমন কিছুউখিলথ হ্যান্ডলার () - আপনি যদি সিএমএসআইএস হেডার এবং স্টার্টআপ কোড ব্যবহার করেন)। এআরএম বিঘ্নিত ভেক্টরগুলি যে কোনও জায়গায় (র‌্যাম সহ) স্থাপন করা যেতে পারে এবং রানটাইমের সময় সংশোধন করা যেতে পারে (উদাহরণস্বরূপ আপনার কাছে দুটি পৃথক ইউআআআরটি প্রোটোকল রয়েছে যা স্যুইচ করা যায়) very "মেইন ফ্ল্যাশ" বা "বুটলোডার বিভাগ" তে এভিআর কেবলমাত্র ভেক্টর ব্যবহার করার বিকল্প রয়েছে (সুতরাং আপনি যদি বাধা আলাদাভাবে পরিচালনা করতে চান তবে আপনাকে একটি ifবিবৃতি ব্যবহার করতে হবে )।

পার্থক্য 4 - ঘুমের পদ্ধতি এবং শক্তি নিয়ন্ত্রণ। আপনার যদি সর্বনিম্ন বিদ্যুত ব্যবহারের প্রয়োজন হয়, তবে আপনাকে এমসইউর সমস্ত বৈশিষ্ট্য ধার্য করতে হবে। এটি এমসিইউর মধ্যে অনেক পার্থক্য করতে পারে - কারও কাছে আরও মোটা মোটা পাওয়ার সাশ্রয় মোড রয়েছে, কেউ কেউ পৃথক পেরিফেরিয়াল সক্ষম / অক্ষম করতে পারে। কিছু এমসিইউতে সামঞ্জস্যযোগ্য নিয়ামক রয়েছে যাতে আপনি এগুলি ধীর গতিতে কম ভোল্টেজের সাথে চালাতে পারেন ইত্যাদি global গ্লোবাল পাওয়ার মোড এবং অন্য একটি 7 পাওয়ার মোড সহ একটি এমসিইউতে (আসুন আমরা বলি) একই দক্ষতা অর্জনের সহজ উপায় দেখতে পাচ্ছি না এবং স্বতন্ত্র পেরিফেরাল ক্লক নিয়ন্ত্রণ।

বহনযোগ্যতার যত্ন নেওয়ার সময় একক অতি গুরুত্বপূর্ণ বিষয় হ'ল আপনার কোডটিকে স্পষ্টভাবে হার্ডওয়্যার-নির্ভর (ড্রাইভার) এবং হার্ডওয়্যার-ইন্ডিপেন্ডেন্ট (অ্যাপ্লিকেশন) অংশগুলিতে বিভক্ত করা। আপনি একটি নিয়মিত পিসিতে একটি মক ড্রাইভার (উদাহরণস্বরূপ, একটি ইউআআরটির পরিবর্তে কনসোল) দিয়ে বিকাশ এবং পরীক্ষা করতে পারেন। প্রোটোটাইপ হার্ডওয়্যার রিফ্লো ওভেন থেকে বেরিয়ে আসার আগে 90% অ্যাপ্লিকেশন কোড সম্পূর্ণ হওয়ায় এটি আমাকে বহুবার সাশ্রয় করেছে :)

আমার মতে এআরএম সম্পর্কে ভাল জিনিসটি হ'ল "একরকমালচার" - অনেক সংকলক (জিসিসি, কেইল, আইএআর ... কয়েকটি নাম রাখার জন্য), অনেকগুলি ফ্রি এবং অফিশিয়ালি সমর্থিত আইডিই (কমপক্ষে এনএক্সপি, এসটিএম 32 , সিলিকন ল্যাবগুলির জন্য, নর্ডিক), অনেক ডিবাগ সরঞ্জাম (SEGGER - বিশেষত ওজোন, ইউআরপি, ওপেনওসিডি ...) এবং অনেক চিপ বিক্রেতারা (আমি তাদের নামকরণও শুরু করব না)। PIC32 বেশিরভাগ মাইক্রোচিপ মধ্যে সীমাবদ্ধ (তবে আপনি যদি তাদের সরঞ্জাম পছন্দ না করেন তবে এটি কেবল তার পক্ষে গুরুত্বপূর্ণ।

যখন সি কোড আসে। এটি 99% একই, একটি ifবিবৃতি একই, একটি লুপ একইভাবে কাজ করে। তবে আপনার নেটিভ শব্দের আকার সম্পর্কে যত্ন নেওয়া উচিত। উদাহরণস্বরূপ, forআপনি যদি uint8_tকাউন্টারটির জন্য ব্যবহার করেন তবে একটি এভিআর এর একটি লুপ দ্রুত হয় , আর এআরএম-তে uint32_tদ্রুততম ধরণের (বা int32_t) হয়। আপনি যদি আরও ছোট টাইপ ব্যবহার করেন তবে এআরএমকে প্রতিবার 8-বিট ওভারফ্লো পরীক্ষা করতে হবে।

একটি MCU এবং / অথবা বিক্রেতা নির্বাচন সাধারণভাবে বেশিরভাগই রাজনীতি ও সরবরাহ সম্পর্কে (যতক্ষণ না আপনি খুব পরিষ্কার ইঞ্জিনিয়ারিং সীমাবদ্ধতার উদাহরণ হিসেবে আছে: উচ্চ তাপমাত্রা - ব্যবহারের MSP430 বা Vorago)। এমনকি যদি অ্যাপ্লিকেশনটি কোনও কিছুতে চলতে পারে এবং কেবলমাত্র 5% কোড (ড্রাইভার) পণ্য আজীবন বিকাশ এবং সমর্থন করতে হয় - এটি এখনও সংস্থার জন্য অতিরিক্ত ব্যয়। আমি যে জায়গাগুলিতে কাজ করেছি তার সমস্ত জায়গাতেই একটি প্রিয় বিক্রেতা এবং এমসিইউ লাইন ছিল (যেমন "আলাদা কিছু চয়ন করার খুব ভাল কারণ না থাকলে" আপনি যে কোনও কিনেটি বেছে নিন ")। এটির সাহায্যে যদি আপনার কাছে অন্য লোকের কাছে সাহায্য চাইতে থাকে তবে এটি পরিচালক হিসাবে আমি 5-ব্যক্তি বিকাশ বিভাগ থাকা এড়াতে পারি যেখানে প্রত্যেকে একেবারে আলাদা চিপ ব্যবহার করে।


3
“আপনি যদি কাউন্টারটির জন্য uint8_t ব্যবহার করেন তবে এভিআর সবচেয়ে দ্রুত হয়, আর এআরএম uint32_t দ্রুততম টাইপ (বা int32_t)। আপনি যদি আরও ছোট ধরনের ব্যবহার করেন তবে এআরএমকে প্রতিবার 8-বিট ওভারফ্লো পরীক্ষা করতে হবে ” আপনার যদি কমপক্ষে 8 বিটের প্রয়োজন হয় তবে আপনি uint_fast8_t ব্যবহার করতে পারেন।
মাইকেল 20

@ মিশেল - আপনি _ প্রকারের ধরণের ব্যবহার নিশ্চিত করতে পারেন তবে আপনি ওভারফ্লো আচরণের উপর নির্ভর করতে পারবেন না। আমার জিসিসির স্ট্যান্ডিন্টে আমার কাছে "টাইপেফ স্বাক্ষরবিহীন ইন্ট uint_fast8_t" আছে, যা মূলত একটি uint32_t :)
ফিলো

বিভিন্ন প্লাটফর্মের আলাদা আলাদা ক্ষমতা রয়েছে তা দিয়ে দক্ষ, সর্বজনীন এবং সম্পূর্ণ এমন একটি এপিআই লেখার চেষ্টা করা কঠিন। সিপিইউ সম্ভবত পেরিফেরিয়াল এবং তাদের সাথে তৈরি নকশার সিদ্ধান্তগুলির চেয়ে কম গুরুত্বপূর্ণ। উদাহরণস্বরূপ, কিছু ডিভাইস বেশ কয়েকটি মাইক্রোসেকেন্ডে যে কোনও সময়ে বিভিন্ন পেরিফেরিয়ালগুলিকে পুনরায় কনফিগার করার অনুমতি দিয়েছে, আবার অন্যদের কয়েকশ মাইক্রোসেকেন্ড বা এমনকি মিলিসেকেন্ডে ছড়িয়ে থাকা একাধিক পদক্ষেপের প্রয়োজন হতে পারে। প্রাক্তন প্যাটার্নের জন্য উদ্দিষ্ট একটি এপিআই ফাংশন 10,000 হিটেডে চলমান একটি বিঘ্নিত পরিষেবার রুটিনের মধ্যে ব্যবহারযোগ্য হতে পারে, তবে ...
সুপারক্যাট

... প্ল্যাটফর্মগুলিতে এমন ব্যবহারকে সমর্থন করতে পারেনি যার জন্য শত শত মাইক্রোসেকেন্ডের মধ্যে অপারেশন ছড়িয়ে দেওয়া দরকার। আমি জানি না কেন হার্ডওয়্যার ডিজাইনাররা "যে কোনও সময়ে দ্রুত অপারেশন" সমর্থন করার জন্য খুব কঠোর চেষ্টা করে বলে মনে হয় না, তবে অনেকে এমন মডেল ব্যবহার করেন যা রাষ্ট্রের পরিবর্তে পৃথক ক্রিয়াকলাপগুলিকে সিঙ্ক্রোনাইজ করে যাতে উদাহরণস্বরূপ কোনও অনুরোধ দেওয়া হয়েছে একটি ডিভাইস চালু করুন এবং কোড বুঝতে পারে যে এটি চালু হওয়ার দরকার নেই, ডিভাইসটি চালু করার জন্য অনুরোধটি বন্ধ করার আগে কোডটির অবশ্যই অপেক্ষা করা উচিত। কোনও এপিআইতে সহজেই পরিচালনা করা বড় জটিলতা যুক্ত করে।
সুপারক্যাট

11

আমি চারটি ভিন্ন নির্মাতাদের বেশ কয়েকটি এমসিইউ ব্যবহার করেছি। প্রতিবারের প্রধান কাজ হ'ল পেরিফেরিয়ালগুলির সাথে পরিচিত হওয়া।

উদাহরণস্বরূপ একটি ইউআআরটি নিজেও খুব জটিল নয় এবং আমি আমার ড্রাইভার পোর্টটি সহজেই খুঁজে পাই। তবে শেষবারের সময়গুলি আমার কাছে প্রায় একদিন সময় নিয়েছিল ঘড়িগুলি পেতে, I / O পিনগুলি বাধাগ্রস্ত করে, সক্ষম করে তোলে ইত্যাদি ইত্যাদি বাছাই করে।

জিপিআইও খুব জটিল হতে পারে। বিট-সেট, বিট-ক্লিয়ার, বিট-টগল, বিশেষ ফাংশনগুলি সক্ষম / অক্ষম, ত্রি-স্থিতি। এরপরে আপনি বাধা পেতে পারেন: যে কোনও প্রান্ত, উত্থান, পতন, স্তর-নিম্ন, স্তর-উচ্চ, স্ব-সাফ হওয়া বা না।

তারপরে আই -২ সি, এসপিআই, পিডাব্লুএমএম, টাইমার এবং আরও দুটি ডজন পেরিফেরিয়াল রয়েছে যার প্রত্যেকটি তাদের নিজস্ব ঘড়ি সক্ষম করে এবং প্রতিবার নতুন বিটগুলির সাথে রেজিস্টারগুলি আলাদা হয়। এই সকলের জন্য ডেটাশিটটি পড়তে অনেক ঘন্টা সময় লাগে যা কোন পরিস্থিতিতে কোন বিটটি সেট করবে to

সর্বশেষ প্রস্তুতকারকের প্রচুর কোড উদাহরণ ছিল যা আমি অকেজো বলে মনে করি। সবকিছু বিমূর্ত ছিল। তবে আমি যখন এটি সন্ধান করেছি, কোডটি ছয়টি দিয়ে গেছে ! GPIO বিট সেট করতে ফাংশন কলগুলির স্তরের। আপনার কাছে 3GHz প্রসেসর থাকলে ভাল তবে 48MHz এর MCU এ না U আমার কোডটি একক লাইন ছিল:

GPIO->set_output = bit.

আমি আরও জেনেরিক ড্রাইভার ব্যবহার করার চেষ্টা করেছি তবে আমি হাল ছেড়ে দিয়েছি। একটি এমসিইউতে আপনি সর্বদা স্থান এবং ঘড়ির চক্রের সাথে লড়াই করে যাচ্ছেন। আমি দেখতে পেয়েছি যে আপনি 10KHz নামক একটি বিঘ্নিত রুটিনে একটি নির্দিষ্ট তরঙ্গরূপ তৈরি করে তবে বিমূর্ত স্তরটি উইন্ডোটির বাইরে সর্বপ্রথম।

সুতরাং এখন আমার সমস্ত কিছু কাজ করছে এবং খুব, খুব ভাল কারণ ব্যতীত আমি আবার স্যুইচ না করার পরিকল্পনা করছি।

উপরের সমস্তটি আপনাকে কতটি পণ্য বিক্রয় করবে এবং কী সংরক্ষণ করবে সে সম্পর্কে অবশ্যই মনোযোগী হতে হবে। একটি মিলিয়ন বিক্রয়: 0.10 সাশ্রয় করার জন্য একটি ভিন্ন ধরণের স্যুইচ করতে আপনি সফটওয়্যার ম্যান-ঘন্টাগুলিতে 100.000 ব্যয় করতে পারবেন। 1000 বিক্রি করে আপনার ব্যয় করতে হবে 100 জন।


1
ব্যক্তিগতভাবে এ কারণেই আমি এসেম্বলারের সাথে থাকি। সুদৃশ্য বাইনারি, কোনও বিমূর্ততা নেই।
ইয়ান ব্ল্যান্ড

সি এর প্রিপ্রোসেসর স্টাফগুলির সাথে বেশ ভাল করতে পারে, বিশেষত যখন __builtin_constant অন্তর্দৃষ্টিগুলির সাথে একত্রিত হয়। তাহলে প্রতিটি ইনপুট / আউটপুট জন্য এক সংজ্ঞায়িত ধ্রুবক ফর্ম (পোর্ট নম্বর * 32 + + বিট সংখ্যা) বিট, এটি একটি ম্যাক্রো জন্য লিখতে সম্ভব OUTPUT_HI(n)যা কোড সমতুল্য উত্পাদ হবে GPIOD->bssr |= 0x400;যদি n0x6A মত একটি ধ্রুবক, কিন্তু যদি একটি সহজ সাবরুটিন কল nহয় ধ্রুবক নয়। এটি বলা হয়ে থাকে, বেশিরভাগ বিক্রেতা এপিআই আমি মাঝারি এবং ভয়ঙ্কর মধ্যে পরিসীমা দেখেছি।
সুপারক্যাট

8

এটি উত্তরের চেয়ে মতামত / মন্তব্য।

আপনি চান না এবং সি সি ++ তে প্রোগ্রামিং করা উচিত নয়, যখন সঠিক উপায়ে ব্যবহার করা হয় তখন অনেক উচ্চতর। (ঠিক আছে, আমাকে স্বীকার করতে হবে, যখন সি এর চেয়েও খারাপ এটি ভুল উপায়ে ব্যবহৃত হয়) এটি আপনাকে (আধুনিক) সি ++ সংকলকযুক্ত চিপগুলির মধ্যে সীমাবদ্ধ করে, যা মোটামুটি চিরকালীন যা জি সি সি দ্বারা সমর্থিত, এভিআর সহ (সহ) কিছু সীমাবদ্ধতা, ফিলো একটি অ-অভিন্ন ঠিকানা জায়গার সমস্যার উল্লেখ করে), তবে প্রায় সমস্ত পিআইসি বাদ দিয়ে (পিআইসি 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]   

আমি কীভাবে এটি এসেম্বলারের মধ্যে লিখতে চাইতাম - যদি আমি বুঝতে পারি যে পিআইও রেজিস্টারগুলি একটি সাধারণ বেস থেকে অফসেটের সাথে ব্যবহার করা যেতে পারে। এই ক্ষেত্রে আমি সম্ভবত করব, তবে কম্পাইলারটি আমার চেয়ে এই জাতীয় জিনিসগুলির অনুকূলকরণে অনেক বেশি ভাল।

আমার উত্তর যতদূর পাওয়া যায়, তা হ'ল: আপনার হার্ডওয়্যারের জন্য বিমূর্ত স্তরটি লিখুন তবে এটি আধুনিক সি ++ (ধারণা, টেম্পলেট) এ করুন যাতে এটি আপনার কর্মক্ষমতা ক্ষতি করে না। সেই জায়গায়, আপনি সহজেই অন্য চিপে স্যুইচ করতে পারেন। এমনকি আপনি যে কয়েকটি এলোমেলো চিপ আপনি রেখেছিলেন তা বিকাশ করা শুরু করতে পারেন, ফ্যামিলিয়ায়ার হচ্ছেন, এর জন্য ভাল ডিবাগিং সরঞ্জামাদি ইত্যাদি রয়েছে এবং চূড়ান্ত পছন্দটি স্থির করে নিন যতক্ষণ না পরে (যখন আপনার প্রয়োজনীয় মেমরি, সিপিইউ গতি ইত্যাদি সম্পর্কে আরও তথ্য থাকবে)।

আইএমও এম্বেডড ডেভলপমেন্টের অন্যতম ত্রুটিটি প্রথমে চিপটি বেছে নিচ্ছে (এটি প্রায়শই এই ফোরামে প্রশ্ন করা হয়: কোন চিপটি আমার পছন্দ করা উচিত .... সর্বোত্তম উত্তরটি সাধারণত: কোনও ব্যাপার নয়))

(সম্পাদনা - "সুতরাং পারফরম্যান্স অনুসারে প্রতিক্রিয়া, সি বা সি ++ একই স্তরে থাকবে?")

একই নির্মাণের জন্য, সি এবং সি ++ একই। সি ++ এর বিমূর্তকরণের জন্য আরও অনেকগুলি নির্মাণ রয়েছে (মাত্র কয়েকটি: শ্রেণি, টেম্পলেট, কনস্টেক্সপ্র) যা কোনও সরঞ্জামের মতো ভাল বা খারাপের জন্য ব্যবহার করা যেতে পারে। আলোচনাগুলিকে আরও আকর্ষণীয় করে তোলার জন্য: সবাই ভাল বা খারাপ কী তা নিয়ে একমত হয় না ...


তাহলে পারফরম্যান্স ওয়াইস, সি বা সি ++ একই স্তরে থাকবে? আমি ভাবব সি ++ এর বেশি ওভারলোড হবে। অবশ্যই আপনি আমাকে সঠিক দিকে নির্দেশ করেছেন, সি ++ হল সি না যাওয়ার উপায়
ইঞ্জিনিয়ার

সি ++ টেমপ্লেটগুলি কম্পাইল-টাইম পলিমারফিজমকে জোর করে যা পারফরম্যান্সের ক্ষেত্রে শূন্য (বা এমনকি নেতিবাচক) হতে পারে, কোডটি প্রতিটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে সংকলিত হয় বলে। যদিও এটি লক্ষ্যমাত্রার গতিতে (জিসিসির জন্য ও 3) নিজেকে সবচেয়ে ভাল toণ দেয়। ভার্চুয়াল ফাংশনগুলির মতো রান-টাইম পলিমারফিজম অনেক বেশি জরিমানার শিকার হতে পারে যদিও তর্কযোগ্যভাবে বজায় রাখা সহজ এবং কিছু ক্ষেত্রে যথেষ্ট যথেষ্ট good
হ্যান্স

1
আপনি দাবি করেন যে সি ++ আরও ভাল তবে আপনি গিয়ে সি-স্টাইলের কাস্ট ব্যবহার করেন। লজ্জা হয় না তোমার.
জ্যাব

@ জ্যাব আমি কখনই নতুন ধাঁচের ক্যাসেটগুলির জন্য বেশি কিছু অনুভব করতে পারি নি, তবে আমি তাদের চেষ্টা করব। তবে আমার বর্তমান অগ্রাধিকার এই লাইব্রেরির অন্যান্য অংশগুলিতে। আসল সমস্যাটি অবশ্যই আমি পয়েন্টারগুলিকে টেমপ্লেট পরামিতি হিসাবে পাস করতে পারি নি।
ওয়াউটার ভ্যান ওইজেন

@ আমার সিটিও (টাইম অবজেক্টস সংকলন) শৈলীর পরিবর্তে সংকীর্ণ ব্যবহারের কেস রয়েছে (হার্ডওয়্যারটির নিকটবর্তী, সংকলন-সময় পরিচিত পরিস্থিতি), এটি ভার্চুয়াল-ভিত্তিক ওও এর ট্রেন্ডিশনাল ব্যবহারের পরিবর্তনের চেয়ে সি-কিলারের চেয়ে বেশি। একটি ব্যবহারযোগ্য বাইক্যাচ হ'ল ইন্ডিয়ারেশনের অভাবে স্ট্যাকের আকারটি গণনা করা সম্ভব হয়।
ওয়াউটার ভ্যান ওইজেন

4

যদি আমি সঠিকভাবে বুঝতে পারি তবে আপনি জানতে চান যে আপনার সি ভাষার পরিবেশে প্ল্যাটফর্মের নির্দিষ্ট বৈশিষ্ট্যগুলি "পপ আপ" কী, উভয় প্ল্যাটফর্মে রক্ষণাবেক্ষণযোগ্য, পোর্টেবল কোড লেখাকে আরও চ্যালেঞ্জ হিসাবে তৈরি করে।

সি এটি ইতিমধ্যে বেশ নমনীয় যে এটি একটি "পোর্টেবল অ্যাসেমব্লার"। আপনার নির্বাচিত সমস্ত প্ল্যাটফর্মগুলিতে জিসিসি / বাণিজ্যিক সংকলক উপলব্ধ রয়েছে যা C89 এবং C99 ভাষার মানগুলির জন্য সমর্থন করে, যার অর্থ আপনি সমস্ত প্ল্যাটফর্মগুলিতে একই কোড চালনা করতে পারেন।

কয়েকটি বিবেচনা আছে:

  • কিছু আর্কিটেকচার হলেন ভন নিউমান (এআরএম, এমআইপিএস), অন্যরা হার্ভার্ড। মূল সীমাবদ্ধতাগুলি দেখা দেয় যখন আপনার সি প্রোগ্রামটি রম থেকে ডেটা পড়তে হয়, যেমন স্ট্রিং মুদ্রণ করতে, "কনস্ট" বা অনুরূপ হিসাবে সংজ্ঞায়িত ডেটা থাকতে হয়।

কিছু প্ল্যাটফর্ম / সংকলক অন্যদের চেয়ে এই "সীমাবদ্ধতা" লুকিয়ে রাখতে পারে। যেমন এভিআর তে আপনাকে রম ডেটা পড়তে নির্দিষ্ট ম্যাক্রোগুলি ব্যবহার করতে হবে। পি আই সি ২৪ / ডিএসপিক-এ এছাড়াও উত্সর্গীকৃত টিবিএলআরড ইনস্ট্রাকশন উপলব্ধ। তবে কিছু অংশে "প্রোগ্রাম স্পেস ভিজিবিলিটি" (পিএসভিপিএজি) বৈশিষ্ট্য উপলব্ধ রয়েছে যা ফ্ল্যাশ পৃষ্ঠার একটি পৃষ্ঠাকে র‌্যামে ম্যাপ করার অনুমতি দেয়, তাত্ক্ষণিক ডেটা অ্যাড্রেসিংকে tblrd ছাড়াই উপলব্ধ করে তোলে। সংকলক এটি বেশ কার্যকরভাবে করতে পারে।

এআরএম এবং এমআইপিএস হ'ল ভন নিউমান, এর মাধ্যমে রম, র‌্যাম এবং পেরিফেরিয়ালগুলির জন্য 1 টি বাসে মেমরি অঞ্চল রয়েছে। আপনি র‌্যাম বা "রম" থেকে ডেটা পড়ার মধ্যে কোনও পার্থক্য লক্ষ্য করবেন না।

  • আপনি যদি সি এর নীচে ডুব দিয়ে থাকেন এবং নির্দিষ্ট ক্রিয়াকলাপের জন্য উত্পন্ন নির্দেশাবলী দেখে থাকেন তবে আপনি I / O এর আশেপাশে কিছু বড় পার্থক্য খুঁজে পাবেন। এআরএম এবং এমআইপিএস হ'ল আরআইএসসি লোড-স্টোর রেজিস্ট্রার আর্কিটেকচার । এর অর্থ হল মেমোরি বাসে ডেটা অ্যাক্সেস অবশ্যই MOV নির্দেশাবলীর মধ্য দিয়ে যেতে হবে। এর অর্থ হ'ল পেরিফেরিয়াল মানটির যে কোনও সংশোধন রিড-মডিফাই-রাইটিং (আরএমডাব্লু) অপারেশনকে নেতৃত্ব দেয়। কিছু আর্ম অংশ রয়েছে যা বিট-ব্যান্ডিং সমর্থন করে, সেই মানচিত্রটি আই / ও পেরিফেরিয়াল স্পেসে সেট / ক্লার-বিট রেজিস্টার করে। তবে আপনাকে নিজেরাই এই অ্যাক্সেসটি কোড করতে হবে।

অন্যদিকে একটি পিক 24 এএলইউ অপারেশনগুলিকে সরাসরি পরোক্ষ ঠিকানার মাধ্যমে ডেটা পড়তে এবং লেখার অনুমতি দেয় (এমনকি পয়েন্টার পরিবর্তনের মাধ্যমেও)। এটি সিআইএসসি থেকে আর্কিটেকচারের মতো কিছু বৈশিষ্ট্য রয়েছে, সুতরাং 1 টি নির্দেশ আরও কাজ করতে পারে। এই নকশার ফলে আরও জটিল সিপিইউ কোর, নিম্ন ঘড়ি, উচ্চ বিদ্যুত ব্যবহার ইত্যাদি হতে পারে ভাগ্যক্রমে আপনার জন্য অংশটি ইতিমধ্যে নকশা করা হয়েছে। ;-)

এই পার্থক্যগুলির অর্থ হ'ল একটি পিক 24 এটি একইভাবে ক্লকড এআরএম বা এমআইপিএস চিপের চেয়ে আইআর / O ক্রিয়াকলাপ হতে পারে "আরও পঞ্চি" হতে পারে। তবে একই দাম / প্যাকেজ / ডিজাইনের সীমাবদ্ধতার জন্য আপনি অনেক বেশি ক্লোকার এআরএম / এমআইপিএস অংশ পেতে পারেন। আমি ব্যবহারিক পদগুলির জন্য অনুমান করি, আমি মনে করি অনেকগুলি "প্ল্যাটফর্মটি শিখতে" আর্কিটেকচার কী করতে পারে এবং কী করতে পারে না, কয়েক সেট অপারেশন কত দ্রুত হবে ইত্যাদি গ্রিপ করতে চলেছে etc.

  • পেরিফেরিয়ালস, ক্লক ম্যানেজমেন্ট ইত্যাদি বিভিন্ন পরিবারে পৃথক। কড়া কথায় বলতে গেলে এনকিওসি এবং সিসটিকের মতো কয়েকটি কর্টেক্স এম বাউন্ড পেরিফেরি বাদে বিক্রেতাদের মধ্যে এটি আর্ম ইকো-সিস্টেমের মধ্যেও পরিবর্তিত হবে।

এই পার্থক্যগুলি ডিভাইস ড্রাইভারদের দ্বারা কিছুটা এনপ্যাপুলেটেড করা যায়, তবে শেষ পর্যন্ত এম্বেড থাকা ফার্মওয়্যারের হার্ডওয়্যারের সাথে উচ্চ স্তরের সংযোগ থাকে, তাই কখনও কখনও কাস্টম কাজ এড়ানো যায় না।

এছাড়াও, আপনি যদি মাইক্রোচিপ / প্রাক্তন আতেল এর বাস্তুসংস্থান ছেড়ে চলেছেন তবে দেখতে পাবেন যে এআরএম অংশগুলি সেগুলি চালিত করার জন্য আরও সেটআপ প্রয়োজন। আমি বলতে চাইছি; পেরিফেরিয়ালগুলিতে ঘড়িগুলি সক্ষম করা, পেরিফেরিয়ালগুলি কনফিগার করা এবং তাদের "সক্ষম" করা, এনভিসি আলাদাভাবে সেটআপ করা ইত্যাদি the এটি শেখার কার্ভের কেবল একটি অংশ। একবার আপনি এই সমস্ত জিনিসগুলি মনে রাখার পরে, সঠিক ক্রমে, এই সমস্ত মাইক্রোকন্ট্রোলারদের জন্য ডিভাইস ড্রাইভারগুলি লেখার ক্ষেত্রে কোনও এক মুহুর্তে বেশ অনুরূপ অনুভূত হবে।

  • এছাড়াও, আপনি ইতিমধ্যে না থাকলে stdint.h, stdbool.h ইত্যাদি লাইব্রেরি ব্যবহার করার চেষ্টা করুন। এই পূর্ণসংখ্যার প্রকারগুলি প্রস্থগুলিকে স্পষ্ট করে তোলে যা প্ল্যাটফর্মগুলির মধ্যে কোড আচরণকে সবচেয়ে অনুমানযোগ্য করে তোলে। এর অর্থ 8-বিট এভিআর-তে 32-বিট ইন্টিজার ব্যবহার করা যেতে পারে; তবে আপনার কোডটির যদি এটির প্রয়োজন হয় তবে তা হ'ল।

3

হ্যা এবং না. প্রোগ্রামার দৃষ্টিকোণ থেকে আপনি আদর্শভাবে নির্দেশ সেটটির বিশদটি গোপন করছেন। তবে এটি কিছুটা ইতিমধ্যে প্রাসঙ্গিক নয় যা পেরিফেরিয়ালগুলি প্রোগ্রামটি লেখার পুরো বিষয় নির্দেশ নির্দেশের অংশ নয়। এখন একই সময়ে আপনি কেবলমাত্র সেই নির্দেশিক সেটগুলি জুড়ে 4096 বাইট ফ্ল্যাশ অংশের তুলনা করতে পারবেন না, বিশেষত সি ব্যবহার করা হলে, ফ্ল্যাশ / মেমরির পরিমাণের পরিমাণ নির্দেশের সেট এবং সংকলক দ্বারা ভারীভাবে নির্ধারিত হয়, কারও কখনও সংকলক দেখতে পাওয়া উচিত নয় (কাশি পিআইসি) কাশি) সংকলন করে resources সংস্থানগুলির কতটা অপচয় হয় সে কারণে। অন্যরা ফ্ল্যাশ খরচ একটি ছোট ওভারহেড। এমসিইউ অ্যাপ্লিকেশনগুলিতে উচ্চ স্তরের ভাষা এবং পারফরম্যান্স সম্পর্কিত বিষয়গুলি ব্যবহার করার সময় পারফরম্যান্সও একটি সমস্যা so

যদি এটি প্রোগ্রামিংটিকে আরও সহজ করে তোলার বিষয়ে হয় (পণ্যটির সামগ্রিক ব্যয়ে) আপনি এমসিইউর জন্য একটি বিকাশকারী প্যাকেজ ডাউনলোড করতে সক্ষম হন যেমন নির্দেশ সেট আর্কিটেকচার এমন কোনও জিনিস যা আপনি কখনও দেখেন না, তাই যদি এটি আপনার প্রাথমিক উদ্বেগ হয় তবে এটি উদ্বেগ নয়। এই লাইব্রেরিগুলি ব্যবহারের জন্য পণ্যের ব্যয় হিসাবে এখনও আপনার অর্থ ব্যয় হয়, তবে বাজারে সময় কম হতে পারে, আমি জানি যে লাইব্রেরিগুলি পেরিফেরিয়ালগুলির সাথে সরাসরি কথা বলার জন্য ব্যবহার করতে আরও সময় / কাজ নেয়।

নীচের লাইনটি নির্দেশের সেটগুলি আপনার উদ্বেগগুলির মধ্যে সবচেয়ে কম, আসল সমস্যাগুলিতে এগিয়ে যান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.