আরডুইনো / এভিআর কোডের জন্য ঘড়ির চক্র পর্যবেক্ষণ করবেন?


11

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

বর্তমান সমাধানটি আমি আসতে পারি সময় থেকে:

#define clockCyclesPerMicrosecond() ( F_CPU / 1000000L )
#define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() )

wiring.c যোগ করেছে:

#define microsecondsToClockCycles(a) ( (a) * clockCyclesPerMicrosecond() )

এই অ্যাকাউন্টের মাধ্যমে আমি মাইক্রোসেকেন্ডগুলি পর্যবেক্ষণ করে পাস করা ঘড়ি চক্রগুলি গণনা করতে পারতাম এবং তারপরে এটি মাইক্রোসেকেন্ডসটোকলকাইকাইলগুলিতে () পাঠাতে পারি। আমার প্রশ্ন, আরও ভাল উপায় আছে?

sidenote: AVR এর পারফরম্যান্স পর্যবেক্ষণের জন্য কি ভাল সংস্থান রয়েছে? lmgtfy.com এবং বিভিন্ন ফোরামে অনুসন্ধানগুলি টাইমারগুলির অনুসন্ধান ব্যতীত কোনও সুস্পষ্ট ফলাফল সরবরাহ করে না

ধন্যবাদ

উত্তর:


6

সবচেয়ে সহজ পদ্ধতিটি হ'ল আপনার কোডটি আপনি যে কোডটি চান তা চালিয়ে দেওয়ার আগে কিছুটা পিন টানতে এবং এটি যে কোনও কাজ শেষ করার পরে এটিকে কম টানুন। তারপরে কোড লুপটি তৈরি করুন (বা একক শট মোডে মেমরির সাথে ডিজিটাল অসিলোস্কোপ ব্যবহার করুন) এবং কেবল স্কোপ করুন তারপরে পিন করুন। ডালের দৈর্ঘ্য আপনাকে জানায় যে পিনের অবস্থা পরিবর্তন করতে কোডের টুকরা প্লাস ওয়ান ক্লক চক্রটি কার্যকর করতে কত সময় লেগেছে (আমি মনে করি এটি একটি চক্র নেয়, 100% নিশ্চিত না)।


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

4

"মনিটর" বলতে কী বোঝ?

অ্যাসেম্বলি কোডের ছোট ছোট টুকরাগুলির জন্য এভিআর-র জন্য ক্লকচক্র গণনা করা শক্ত হবে না।

কোডটি কার্যকর হওয়ার আগে আপনি একটি বন্দরও সেট করতে পারেন এবং পরে এটি পুনরায় সেট করতে পারেন এবং সময়টি পেতে লজিক বিশ্লেষক বা অ্যাসিলোস্কোপ দিয়ে এটি পর্যবেক্ষণ করতে পারেন।

এবং আপনি যেমন বলেছিলেন তেমন দ্রুত একটি চলমান টাইমার থেকে সময়ও পড়তে পারতেন।


মনিটরের মাধ্যমে আমি কোড দ্বারা ব্যবহৃত চক্রের সংখ্যা নির্ধারণ করি। এর মতো কিছু (নোট, কোডের ফর্ম্যাটিং সম্ভবত মন্তব্য ইঞ্জিন দ্বারা সমতল হবে): ঘড়িগুলি = স্টার্টকাউন্টিংআটমেগা ক্লকস (); ... {জন্য ... {ডিজিটাল রিড ...}} সিরিয়াল.প্রিন্ট ("ব্যবহৃত চক্রের সংখ্যা:"); সিরিয়াল.প্রিন্ট (বর্তমানকাউন্টিংআটমেগা ক্লকস) (ঘড়ি, ডিইসি);
সাইফঙ্ক

তবে হ্যাঁ, আপনার প্রতিক্রিয়া আমি ধরে নিয়েছি আমার বিকল্পগুলি। আমার ধারণা, আমি যদি ঘড়ির চক্র গণনা করতে পারি তবে
এসেম্বিলার

3

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

আউটপুট:

clocks for 1us:16
runtime us, ms, ck :: elapsed tme us, ms ck
4003236 4002	64051776	::	4003236	4002	64051760
8006668 8006	128106688	::	4003432	4004	64054912
12010508    12010	192168128	::	4003840	4004	64061440
16014348    16014	256229568	::	4003840	4004	64061440
20018188    20018	320291008	::	4003840	4004	64061440
24022028    24022	384352448	::	4003840	4004	64061440
28026892    28026	448430272	::	4004864	4004	64077824
32030732    32030	512491712	::	4003840	4004	64061440
36034572    36034	576553152	::	4003840	4004	64061440
40038412    40038	640614592	::	4003840	4004	64061440
44042252    44042	704676032	::	4003840	4004	64061440
48046092    48046	768737472	::	4003840	4004	64061440
52050956    52050	832815296	::	4004864	4004	64077824

আমি নিশ্চিত যে এখানে কেন প্রথম লুপগুলির চেয়ে বেশিরভাগের চেয়ে কম বিস্তৃত ঘড়ির চক্র ছিল এবং অন্য সমস্ত লুপগুলি কেন দুটি দৈর্ঘ্যের চক্রের মধ্যে টগল করে a

কোড:

unsigned long us, ms, ck;
unsigned long _us, _ms, _ck;
unsigned long __us, __ms, __ck;
void setup() {
        Serial.begin(9600);
}
boolean firstloop=1;
void loop() { 
        delay(4000);

        if (firstloop) {
                Serial.print("clocks for 1us:");
                ck=microsecondsToClockCycles(1);
                Serial.println(ck,DEC);
                firstloop--;
                Serial.println("runtime us, ms, ck :: elapsed tme us, ms ck");
        }

        _us=us;
        _ms=ms;
        _ck=ck;

        us=micros(); // us since program start
        ms=millis();
        //ms=us/1000;
        ck=microsecondsToClockCycles(us);
        Serial.print(us,DEC);
        Serial.print("\t");
        Serial.print(ms,DEC);
        Serial.print("\t");
        Serial.print(ck,DEC);     
        Serial.print("\t::\t");

        __us = us - _us;
        __ms = ms - _ms;
        __ck = ck - _ck;
        Serial.print(__us,DEC);
        Serial.print("\t");
        Serial.print(__ms,DEC);
        Serial.print("\t");
        Serial.println(__ck,DEC);     

}

সিডনোট: আপনি 4 সেকেন্ড বিলম্ব সরিয়ে ফেললে আপনি সিরিয়াল.প্রিন্ট () এর প্রভাবগুলি আরও স্পষ্টভাবে দেখতে শুরু করবেন। নোট, এখানে 2 রান তুলনা করা হয়। আমি কেবল তাদের নিজ নিজ লগ থেকে একে অপরের কাছে 4 টি নমুনা অন্তর্ভুক্ত করেছি।

রান 1:

5000604 5000	80009664	::	2516	2	40256
6001424 6001	96022784	::	2520	3	40320
7002184 7002	112034944	::	2600	3	41600
8001292 8001	128020672	::	2600	3	41600

রান 2:

5002460 5002	80039360	::	2524	3	40384
6000728 6000	96011648	::	2520	2	40320
7001452 7001	112023232	::	2600	3	41600
8000552 8000	128008832	::	2604	3	41664

মোট রান সময় ব্যয় করা সময় বৃদ্ধি পায়। এক সেকেন্ড অতিবাহিত হওয়ার পরে ঘড়িগুলি গড়ে 40 কে থেকে 44 কে বেড়ে যায়। এটি 1 সেকেন্ডের পরে অবিচ্ছিন্নভাবে কয়েক মিলি সেকেন্ডে ঘটবে এবং কমপক্ষে পরবর্তী 10 সেকেন্ডের জন্য বিস্তৃত ঘড়িগুলি 44k এর কাছাকাছি থেকে যায় (আমি এটি আরও পরীক্ষা করে দেখিনি)। এ কারণেই মনিটরিং দরকারী বা প্রয়োজনীয়। সম্ভবত কমে যাওয়া দক্ষতার সাথে সিরিয়ালটিতে কনফিগারেশন বা বাগগুলি রয়েছে? অথবা সম্ভবত কোডটি সঠিকভাবে মেমরি ব্যবহার করছে না এবং এর একটি ফাঁস রয়েছে যা কার্যকারিতা ইত্যাদি প্রভাবিত করে etc.


বহু বছর পরে, আমি এখনও এমন কিছু চাই যা কোডগুলি সহ ঘড়িগুলি আরও নিখুঁতভাবে দেখায় (যেমন একটি অ্যাসিলোস্কোপ হিসাবে প্রয়োগ করা হয়েছিল)। আমি 16MHZ এবং 8MHZ উভয় ক্ষেত্রেই ডিজিটাল রাইট () এর জন্য প্রয়োজনীয় ঘড়ির চক্র সংখ্যা নির্ধারণ করার চেষ্টা করছি। 16MHZ এ আমি 8us / 64clk পাই। তবে 8 এমএইচজেডে আমি 0us / 0 ক্লিকি পাই।
সাইফঙ্ক

1

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

আমি সবেমাত্র একটি এটমেল স্টুডিও প্লাগইন পেয়েছি যার নাম "অ্যানোটেটেড অ্যাসেম্বলি ফাইল ডিবাগার"। http://www.atmel.com/webdoc/aafdebugger/pr01.html মনে হচ্ছে সত্যিকারের উত্সাহিত সমাবেশ ভাষাটি যখন পদক্ষেপ নিচ্ছিল যখন সম্ভবত ক্লান্তিকর আপনাকে ঠিক কী ঘটছে তা দেখাতে চলেছে। প্রতিটি নির্দেশের জন্য আপনাকে কত চক্র লাগবে তা এখনও ডিকোড করতে হতে পারে তবে এটি পোস্ট হওয়া অপশনগুলির তুলনায় অনেক বেশি কাছাকাছি পৌঁছে যাবে।

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

প্রকল্পের সম্পত্তি | টুলচেন | এভিআর / জিএনইউ কমন | OutputFiles

চেকবক্স ".lss (এলএসএস ফাইল উত্পন্ন করুন)


1

আপনি বিল্ট ইন টাইমার ব্যবহার করতে পারেন। ব্লকের আগে প্রেসক্যালার = 1 এবং টিসিএনটি = 0 এর জন্য সবকিছু সেট আপ করুন। তারপরে ব্লকের আগে লাইনে টাইমার সক্ষম করুন এবং ব্লকের পরে লাইনে এটি অক্ষম করুন। টিসিএনটি এখন ব্লকটি যে পরিমাণ চক্র নিয়েছে তার সংখ্যা কম রাখবে, সক্ষম ও অক্ষম কোডের জন্য নির্দিষ্ট চক্রের চেয়ে কম।

দ্রষ্টব্য যে টিএনটিটি 16 বিট টাইমারে 65535 ঘড়ির চক্রের পরে উপচে পড়বে। সময় ডাবল করার জন্য আপনি ওভারফ্লো পতাকা ব্যবহার করতে পারেন। আপনার যদি এখনও আরও দীর্ঘ প্রয়োজন হয় তবে আপনি একটি প্রেসকেলার ব্যবহার করতে পারেন তবে কম রেজোলিউশন পাবেন।

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