কোনও প্রোগ্রামে রানটাইম ত্রুটি হলে কী হবে? কর্মসূচি বাস্তবায়ন বন্ধ হবে? ত্রুটিটি কী তা বলার জন্য আমি আরডুইনো পেতে কিছু উপায় পাচ্ছি?
কোনও প্রোগ্রামে রানটাইম ত্রুটি হলে কী হবে? কর্মসূচি বাস্তবায়ন বন্ধ হবে? ত্রুটিটি কী তা বলার জন্য আমি আরডুইনো পেতে কিছু উপায় পাচ্ছি?
উত্তর:
প্রথমে কী ভুল হতে পারে তার কয়েকটি উদাহরণ দেখা যাক।
void setup() {
int status;
pinMode(13, OUTPUT);
digitalWrite(13, status);
}
মন্তব্যগুলিতে এডগার বোনেটের নির্দেশ অনুসারে , status
উপরের কোডের মতো স্থানীয় ভেরিয়েবলগুলি সি ++ সংকলক দ্বারা স্পষ্টভাবে আরম্ভ করা হয়নি। সুতরাং, উপরের কোডের ফলাফল অনির্দিষ্ট। এটি এড়াতে, নিশ্চিত হন যে আপনি সর্বদা আপনার স্থানীয় ভেরিয়েবলগুলিকে মান নির্ধারণ করেন।
বৈশ্বিক এবং স্থিতিশীল ভেরিয়েবলগুলির সাথে জিনিসগুলি কিছুটা পৃথক:
গ্লোবাল এবং স্ট্যাটিক ভেরিয়েবলগুলি সি স্ট্যান্ডার্ডের দ্বারা 0 এ প্রাথমিকভাবে গ্যারান্টিযুক্ত।
এর অর্থ আপনার কোডে 0 টি করে আরম্ভ করার বিষয়ে আপনার চিন্তা করা উচিত নয়। প্রকৃতপক্ষে স্মৃতি নষ্ট হতে পারে বলে বাস্তবে, আপনার সত্যই এড়ানো উচিত। কেবল 0 ছাড়া অন্য মানগুলিতে তাদের আরম্ভ করুন।
int array[10];
int v = array[100];
array[-100] = 10;
এখানে প্রথম সমস্যাটি হ'ল আপনি জানেন না যে ভি-তে কী বরাদ্দ করা হবে তবে সবচেয়ে খারাপটি হচ্ছে আপনি জানেন না আপনি কীটি অ্যাসাইনমেন্টের সাথে -100 এর পজিশনে গোলমাল করেছেন array
।
void doSomething( void ) {
for (int i = 0; i < 1000; i++);
}
void setup ()
{
void (*funcPtr)( void );
funcPtr = &doSomething;
funcPtr(); // calls doSomething();
funcPtr = NULL;
funcPtr(); // undefined behavior
}
প্রথম কলটি funcPtr()
আসলে কল হবে doSomething()
। দ্বিতীয়টির মতো কলগুলি অনির্ধারিত আচরণের দিকে নিয়ে যেতে পারে।
ঠিক আছে, উদাহরণস্বরূপ, আপনি র্যামের বাইরে চলে যেতে পারেন। আর কি. যাই হোক না কেন, আমি মনে করি আপনার প্রোগ্রামটি চলতে থাকবে, সম্ভবত আপনি যেভাবে ইচ্ছা করেছিলেন তেমন নয়।
কম্পিউটার সিস্টেমে এ জাতীয় সমস্যাগুলি সাধারণত বিভিন্ন স্তরে মোকাবেলা করা হয়:
আরডুইনোদের কেবল সংকলকটির সীমিত সুরক্ষা রয়েছে এবং সম্ভবত অন্য কিছু নেই। সুসংবাদটি হ'ল এগুলি বহু-কাজ সম্পন্ন নয়, সুতরাং কেবলমাত্র আপনার প্রোগ্রামটিই ক্ষতিগ্রস্থ হচ্ছে। যাই হোক না কেন, এই বাগগুলির মধ্যে যে কোনওটি অনিয়মিত আচরণের দিকে পরিচালিত করবে।
অনুমানগুলি হ'ল আমি উপরে বর্ণিত সমস্ত সমস্যা রানটাইম সমস্যা।
কোনও প্রোগ্রামে রানটাইম ত্রুটি হলে কী হবে?
প্রোগ্রামটি চলতে থাকবে এবং যা ঘটে তা রানটাইম ত্রুটির পার্শ্ব-প্রতিক্রিয়াগুলির উপর নির্ভর করবে। নাল ফাংশন পয়েন্টারের একটি কল সম্ভবত প্রোগ্রামটিকে অজানা স্থানে নিয়ে যাবে।
কর্মসূচি বাস্তবায়ন বন্ধ হবে?
না, এটি এমনভাবে চলতে থাকবে যেন অসাধারণ কিছুই ঘটেনি, সম্ভবত আপনি যা করার ইচ্ছা করেননি তা করছেন। এটি রিসেট হতে পারে বা ভুলভাবে কাজ করতে পারে। এটি কিছু ইনপুটগুলিকে আউটপুটগুলিতে পরিণত করতে এবং একটি সেন্সর বা দুটি জ্বলতে পারে (তবে এটি অত্যন্ত অসম্ভব )।
ত্রুটিটি কী তা বলার জন্য আমি আরডুইনো পেয়ে যাবার কোনও উপায় আছে?
আমি তাই মনে করি না. যেমনটি আমি আগেই বলেছি, সুরক্ষা ব্যবস্থা নেই। ভাষা থেকে কোনও রানটাইম সমর্থন নেই, কোনও ওএস নেই, সীমানা ছাড়িয়ে যাওয়া মেমরির অ্যাক্সেসের জন্য কোনও হার্ডওয়্যার চেক নেই (বুটলোডার এটি হিসাবে গণ্য হয় না)। আপনাকে কেবল আপনার প্রোগ্রামটি সম্পর্কে সতর্কতা অবলম্বন করতে হবে এবং সম্ভবত আপনার নিজের সুরক্ষা জাল স্থাপন করতে হবে।
সুরক্ষার অভাবের কারণ সম্ভবতঃ আরডুইনো কন্ট্রোলারগুলি খুব সস্তা, খুব কম স্মৃতি রয়েছে এবং খুব গুরুত্বপূর্ণ কিছু চালানো উচিত নয় (হ্যাঁ, আপনি সাধারণত এমসিইউগুলি ব্যবহার না করে এমন কোনও জায়গায় এভিআর দ্বারা অস্বীকৃতি বলে মনে হয়) there লাইফ সাপোর্ট সিস্টেমগুলিতে আরডুইনো)।
কোনও রানটাইম ব্যতিক্রম নেই। কেবল অপরিবর্তিত আচরণ আছে।
সত্যিই, কোন ব্যতিক্রম আছে এ সব । আপনি যদি কোনও অবৈধ অপারেশন করার চেষ্টা করেন তবে এর ফলাফলগুলি অজানা।
আপনি প্রয়োগ করেন তা বাদে কোনও রানটাইম চেকিং নেই । আপনার প্রোগ্রামটি বেয়ার-মেটাল হার্ডওয়ারে চলছে। এটি ডেস্কটপ সর্বদা রিং -0 এ চালানোর সমতুল্য , কারণ এটিমেগায় রিং থাকে না ।
এমন একটি ব্যবস্থা আছে যা এমরইউ অনিয়মিত অবস্থা থেকে পেতে পারে এবং এটি ওয়াচডগ টাইমার । আপনি যদি এমন কোনও কোড প্রয়োগ করছেন যা বারবার একটি লুপে চলবে, যা কোনও নির্দিষ্ট সময়ের চেয়ে বেশি সময় চলবে না, আপনি এই সময়টিকে ওয়াচডগ সময় হিসাবে সেট করতে এবং টাইমার সক্ষম করতে পারবেন।
তারপরে, আপনাকে বারবার লুপে টাইমারটি পুনরায় সেট করতে হবে। যদি আপনার কোডটি এমন কোনও শর্ত লুপে স্থির হয়ে যায় যা কখনই শেষ হয় না, তবে নজরদারিটি শূন্যে গণনা করা হবে এবং শেষ পর্যন্ত এমসিইউটিকে পুনরায় সেট করুন।
এইভাবে আপনি ডেটা হারাচ্ছেন, তবে আপনি যদি বাধা মোডে AVR ডাব্লুডিটি চালান, আপনি এমসিইউ পুনরায় সেট করার আগে কিছু ডেটা সঞ্চয় করতে পারেন।
সুতরাং প্রহরী ডগ টাইমার আপনার কোডটিকে মাঝে মধ্যে অজান্তেই অন্তহীন অন্তহীন লুপগুলি থেকে রক্ষা করতে পারে।
ডকুমেন্টেশন: AVR132: বর্ধিত ওয়াচডগ টাইমার ব্যবহার করে
এরকম কোনও কিছুর জন্য আপনার একটি হার্ডওয়্যার ডিবাগার দরকার। তবে সাধারণত আপনি প্রোগ্রামটি যেমনটি প্রত্যাশা করছেন তেমন আচরণ করে না দেখবেন এবং সমস্যাটি সনাক্ত করার জন্য কোডের সেই অংশটি দেখতে হবে।
এটি করার একটি সাধারণ / দ্রুত / সহজ উপায় হ'ল ভেরিয়েবলের মানগুলি মুদ্রণের জন্য মুদ্রণ বিবৃতি যুক্ত করা বা কেবল যে কোনও কিছু যাতে আপনি জানেন যে প্রোগ্রামটি কোনও সমস্যা ছাড়াই কোডটিতে সেই বিন্দুতে পৌঁছেছে। এটি আপনাকে সমস্যাটিকে আরও বিচ্ছিন্ন করতে সহায়তা করবে।
আমি বিশ্বাস করি ভিজুয়ালমাইক্রো এর মধ্যে কিছু ডিবাগিং কার্যকারিতা রয়েছে।
আমি ধরে নেব AVR সিপিইউতে কোনও ত্রুটি সনাক্তকরণ বা পুনরুদ্ধারের সরঞ্জাম নেই। এটি কেবল বন্ধ হয়ে যেতে পারে, বা ত্রুটি এবং ফলাফলগুলি উপেক্ষা করে চলতে পারে। যেমন স্যাচলিন বলেছিলেন, আপনার প্রোগ্রামে এমন কিছু ডিবাগ স্টেটমেন্ট যুক্ত করা উচিত যা কাজ করছে কিনা তা পরীক্ষা করার জন্য একটি অপারেশনের মাঝখানে ডেটা মুদ্রণ করে। আপনি যদি একটি এমুলার ব্যবহার করেন এবং ব্রেকপয়েন্টগুলি সেট করেন তবে আপনি সহজেই একটি সমস্যা খুঁজে পেতে পারেন।
আরডুইনো পুনরায় বুট করবে (অর্থাত এটি পুনরায় চালু হবে setup()
এবং loop()
)।