আমি কীভাবে একটি আরডিনো স্কেচটি ডিবাগ করব?


10

আমি খুব সম্প্রতি আরডুইনোর জন্য কোডিং শুরু করেছি। এবং কোডগুলিতে থাকা এই বাগগুলি আমাকে হত্যা করছে। আরডুইনোতে কোনও হার্ডওয়্যার ডিবাগার না থাকায় সিরিয়াল.প্রিন্ট () আমার একমাত্র অবলম্বন। আরডুইনো কোডটি ডিবাগ করার জন্য আপনি কী পদ্ধতি / অনুশীলনগুলি প্রয়োগ করেন?


আইডিই এবং ডিবাগার সরঞ্জামগুলির জন্য playground.arduino.cc/Main/DevelopmentTools এ দয়া করে একবার দেখুন
ডাল্লো

উত্তর:


8

পরিমিতি আপনার বন্ধু। আপনার ফাংশনগুলি কল করুন ..., ফাংশনগুলিকে কল করে এটি করার জন্য আপনার প্রধান লুপটি লিখুন ... আপনার স্তরগুলি যে স্তরটিতে সাধারণ হবে until মূল লুপ এবং পরবর্তী স্তরটি নীচে দিয়ে শুরু করুন, স্টাব ফাংশন করুন; হয় ফাঁকা:

function foo(){
    ;
}

বা নকল:

function read_temperature(){
    return(95);
}

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

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

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

টাইমিং ইস্যুগুলির বিষয়ে কথা বলা, আপনার প্রোগ্রামের নির্দিষ্ট পয়েন্টে আউটপুট পিন টগল করা, যেমন কোনও আইএসআর থেকে প্রবেশ এবং প্রস্থান, আপনাকে আরডুইনো পিনে একটি বর্গক্ষেত্র প্রদান করে যার ফ্রিকোয়েন্সি বা দায়িত্ব চক্র আপনাকে অভ্যন্তরীণ সময় সম্পর্কে কিছুটা অন্তর্দৃষ্টি দিতে পারে আপনার প্রোগ্রাম সরাসরি পোর্ট-আই / ও ফর্ম, যেমন,

PORTC ^= 0x01;

, কল করার চেয়ে কম সময়কে বিকৃত করবে digitalWrite()। আপনার যদি 'স্কোপ হ্যান্ডি' থাকে, বা ফ্রিকোয়েন্সি এবং / অথবা শুল্ক-চক্র পরিমাপ করার ক্ষমতা সহ কোনও ডিএমএম থাকে তবে দরকারী।

একইভাবে, আপনি প্রোগ্রামটির অভ্যন্তরে থেকে আপনার মিটারের একটি সংখ্যাসূচক মান আউটপুট করতে এনালগ আউটপুট পিন ব্যবহার করতে পারেন যাতে সময়কে খুব বেশি ঝামেলা না করে বা সিরিয়াল I / O ফাংশনগুলির সাথে কোডটি স্ফীত করে না। এখানেও সরাসরি আই / ও ফর্মগুলি ব্যবহার করুন।


6

আমি সিরিয়াল.প্রিন্ট () ব্যবহার করি এবং আমি এলইডি ফ্ল্যাশ করি।

এটি আপনি যা করতে পারেন তা বেশ কিছু।

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


5

3 অন্যান্য কৌশল:

  • প্রতিটি পর্যায়ে আস্তে আস্তে পরীক্ষা করে একটি প্রোগ্রামের কার্যকারিতা তৈরি করুন, এইভাবে আপনি একবারে কেবলমাত্র একটি ছোট সেট বাগের মুখোমুখি হন।

  • কমান্ড ইন্টারপ্রেটারকে ঘিরে প্রোগ্রামটি তৈরি করুন যাতে আপনি এখানে যেমন বিভাগে একসাথে কাজ করতে পারেন ।

  • উল্লেখযোগ্য সময়ে নাড়ি এবং একটি সুযোগ ব্যবহার করুন।


3

ভিসুয়াল মাইক্রো ভিসুয়াল স্টুডিও জন্য প্লাগ-ইন উপলব্ধ যাও Arduino ডিবাগ । উত্স কোড ট্রেস এবং বিরতি অন্তর্ভুক্ত করে এক্সপ্রেশন এবং ভেরিয়েবলগুলিকে "দেখা" এবং / অথবা সংশোধিত করার অনুমতি দেয়।

এখানে চিত্র বর্ণনা লিখুন


1
নোট করুন যে এটি আপনার কোডের মধ্যে automaticallyোকানো স্বয়ংক্রিয়ভাবে উত্পন্ন সিরিয়াল প্রিন্টগুলির মাধ্যমে সম্পন্ন হয়।
per1234

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

আরডুইনোর জন্য ডিবাগার থেকে : "এটি কোডের মাধ্যমে পদক্ষেপটি সমর্থন করে না এবং এটি ডিবাগারের সাথে যোগাযোগের জন্য বিল্ডিংয়ের আগে আপনার প্রোগ্রামে hiddenোকানো লুকানো কোডের উপর ভিত্তি করে তৈরি হয়েছিল" "
পিটার মর্টেনসেন

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

2

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

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

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


0

serial.printআরও নিয়ন্ত্রিত ব্যবহার করতে আপনি টগল ডিবাগ চালু এবং বন্ধ করতে একটি গ্লোবাল বুলিয়ান ভেরিয়েবল সংজ্ঞায়িত করতে পারেন। কোনও লাইন serial.printকোনও ifবিবৃতিতে মোড়ানো হবে যা কেবলমাত্র ডিবাগ পতাকা চালু থাকলে কার্যকর করা হবে। আপনি সম্পন্ন হয়ে গেলেও আপনি কোডটিতে ডিবাগ লাইনগুলি ছেড়ে যেতে পারেন, তবে পরে ডিবাগ পতাকাটি অফ-এ সেট করতে ভুলবেন না।


0

সরাসরি সিরিয়াল.প্রিন্টের চেয়ে ভাল, ম্যাক্রোগুলি ব্যবহার করুন। উদাহরণ:

#ifdef TRACE1
#define trace1(s) serial.print(s)
#define traceln1(s) serial.println(s)
#else
#define trace1(s)
#define traceln1(s)
#endif

এটি এর মতো ব্যবহার করুন:

function doIt(param1, param2) {
    trace1("->doIt("); trace1("param1: "); trace1(param1); trace1(" param2: "); trace1(param2); traceln1(")");

    ...

    traceln1("<-doIt");
}

আপনার কাছে (#ifdef TRACE2 ...)আরও বিশদ সহ বিভিন্ন ট্রেস স্তর থাকতে পারে ।

এবং আপনি "এফ" ম্যাক্রো ব্যবহার করতে পারেন (trace1(F("param1"));),। "এফ" ম্যাক্রো প্রতিরোধ করে যে স্ট্রিংটি অত্যন্ত সীমিত পরিমাণে এসআরএএম ব্যবহার করবে।


0

ব্লিঙ্ক এলইডি, সিরিয়াল পোর্টে জিনিসগুলি মুদ্রণ করুন এবং একবারে কোডের ছোট ছোট বিভাগগুলি লিখে এবং ডিবাগ করুন, কখনও কখনও কেবল কয়েকটি লাইন।

এমন সময় আছে যেখানে আপনি মডুলারাইজ করতে পারেন। যদি সি তে থাকে, উদাহরণস্বরূপ, আপনি একটি গণনা ফাংশনটি বিকাশ এবং পরীক্ষা করতে পারেন উদাহরণস্বরূপ যে কোনও হোস্ট কম্পিউটার, অন্যান্য প্রসেসরের হার্ডওয়্যারকে স্পর্শ করে না, এটি ইনপুটগুলি খাওয়ানোর জন্য পরীক্ষার বেঞ্চের সাহায্যে ফাংশনটি लपेटতে এবং আউটপুটগুলি পরীক্ষা করতে পারে ইত্যাদি etc.

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

অনুমোদিত যে এটি সম্ভবত একটি নিখুঁত ক্লোন নয়, তবে এটি যথেষ্ট ভাল হতে পারে। ভেরিলাটর সি / সি ++ তে পেরিফেরিয়ালগুলি তৈরি করা সত্যিই সহজ করে তোলে যাতে আপনি আপনার এভিআর ডিভাইসটি যা-কিছু সংকুচিত করেছেন তা অনুকরণ করতে পারেন।

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

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