আমি খুব বেশি র‌্যাম ব্যবহার করছি। এটি কীভাবে পরিমাপ করা যায়?


19

আমি আমার প্রকল্পে আমি কতটা র‌্যাম ব্যবহার করছি তা জানতে চাই, যতদূর আমি বলতে পারি, বাস্তবে এটি কাজ করার কোনও উপায় নেই (এটি নিজে চালিয়ে যাওয়া এবং এটি গণনা করা ছাড়া)। আমি বরং একটি বৃহত প্রকল্পে একটি পর্যায়ে পৌঁছেছি যেখানে আমি নির্ধারণ করেছি যে আমি র‌্যামের বাইরে চলে যাচ্ছি।

আমি এটি নির্ধারণ করেছি কারণ আমি কোনও বিভাগ যুক্ত করতে পারি এবং তারপরে কোনও স্পষ্ট কারণ ছাড়াই সমস্ত কোড আমার কোডে অন্য কোথাও loose িলে যায়। আমি যদি #ifndefঅন্য কিছু বাইরে বেরোন তবে তা আবার কাজ করে। নতুন কোডটির সাথে প্রোগ্রামক্রমে ভুল কিছু নেই।

আমি কিছুক্ষণ সন্দেহ করেছিলাম যে আমি উপলব্ধ র‌্যামের শেষের দিকে যাচ্ছি। আমি মনে করি না যে আমি খুব বেশি স্ট্যাক ব্যবহার করছি (যদিও এটি সম্ভব) তবে আমি আসলে কতটা র‌্যাম ব্যবহার করছি তা নির্ধারণ করার সর্বোত্তম উপায় কোনটি?

এর মাধ্যমে কাজ করার চেষ্টা করছি, যখন আমি এনাম এবং স্ট্রাক্টে যাই তখন আমার সমস্যা হয়; তাদের কত স্মৃতি খরচ হয়?

প্রথম সম্পাদনা: এছাড়াও, আমি আমার স্কেচটি শুরু করার পরে এডিট করেছি, এগুলি আমার প্রথম দিকে পাওয়া আসল ফলাফল নয়, তবে আমি এখন যা পাচ্ছি তা সেগুলি।

  text     data     bss     dec     hex filename
 17554      844     449   18847    499f HA15_20140317w.cpp.elf
 16316      694     409   17419    440b HA15_20140317w.cpp.elf
 17346      790     426   18562    4882 HA15_20140317w.cpp.elf

প্রথম লাইন (পাঠ্য 17554 সহ) কাজ করছে না, অনেক সম্পাদনার পরে, দ্বিতীয় লাইনটি (পাঠ্য 16316 সহ) যেমনটি করা উচিত কাজ করছে।

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

আমি কীভাবে উপরের তথ্যের ব্যাখ্যা করব?

এখনও পর্যন্ত আমার বোঝার বিষয়টি হ'ল:

`TEXT` is program instruction memory
`DATA` is variables (unitialised?) in program memory
`BSS`  is variables occupying RAM

যেহেতু বিএসএস 1024 বাইটের চেয়ে কম, তবে দ্বিতীয়টি কেন কাজ করে তবে প্রথমটি কাজ করে না? যদি তা হয় DATA+BSSতবে উভয়ই 1024 এরও বেশি দখল করে।

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


আমি ভেবেছিলাম আমি যুক্ত করব, আমি গত কয়েক সপ্তাহ ধরে কোডের বিভিন্ন নতুন বিভাগ যুক্ত করেছি, এটি কাজ না করা পর্যন্ত এটি অপ্টমাইজ করেছিলাম, তবে এখন আমি কেবলমাত্র অর্ধ
ডোজ

আপনি কি Stringআপনার প্রোগ্রামগুলিতে টাইপ ব্যবহার করেন ? এটি ঘন ঘন গতিশীল মেমরির বরাদ্দ এবং প্রকাশগুলি করতে পরিচিত, যা আপনাকে এমন কোনও বিন্দুতে টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করে দিতে পারে
jfpoil ব্যাখ্যা

@ jfpoil ব্যাখ্যা আমি Stringওভারহেডের কারণে এস থেকে দূরে থাকি । আমি চরের অ্যারে নিয়ে কাজ করে খুশি, যা বলেছিল যে, আমি প্রায় সবসময় আমার সমস্ত চর অ্যারে স্থির আকারের সাথে সংজ্ঞায়িত করি (এই মুহুর্তে, আমার কাছে একটি বাইট অ্যারে রয়েছে যা সম্পূর্ণরূপে নয় কারণ আমি বিভিন্ন পুনঃসংযোগের জন্য সামগ্রীর দৈর্ঘ্য পরিবর্তন করি
মাদিবাদ

আপনার কোড এখানে পোস্ট করা (বা এটি খুব বড় হলে পেস্টবিনে পোস্ট করা) মেমরির সাথে আপনি কী সমস্যার মুখোমুখি হতে পারেন তা জানতে পারে।
jfpoil ব্যাখ্যা

@ jfpoil ব্যাখ্যা আমি কোডটি সত্যিই পোস্ট করতে পারি না, এটি বিশাল এবং দুর্ভাগ্যক্রমে খুব ফুলে গেছে, এটি 16 টির মধ্যে ছড়িয়ে পড়ে spread এটি এমন একটি প্রকল্প যা আমি প্রয়োজনের তুলনায় ভালভাবে বাড়তে দিচ্ছিলাম (এটি বেশ কয়েকটি প্রকল্প একত্রে একত্রিত হয়েছে)। আমি এটিকে ভেঙে ফেলার জন্য এখনই শুরু করছি যা আমি নিশ্চিত যে সমস্যার সমাধান করতে সহায়তা করবে। যদিও এর কিছু অংশ রয়েছে আমার লোকেরা দেখতে (বা আমাকে গাইড করতে) প্রয়োজন, আমি সেগুলি পরে পোস্ট করব।
মাদ্রিবাদ

উত্তর:


15

আপনি সরবরাহিত ফাংশনগুলি ব্যবহার করতে পারেন AVRGCC: মনিটরিং স্ট্যাক ব্যবহার

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

দুটি ফাংশন রয়েছে:

  • স্ট্যাকপেইন্টটি আরম্ভের সময় স্বয়ংক্রিয়ভাবে কার্যকর করা হয় এবং 0xC5 মান সহ র‌্যামটি "রঙে" (প্রয়োজনে পরিবর্তন করা যেতে পারে)।

  • যে র‌্যাম ব্যবহার করা হয়নি তা গণনা করার জন্য যে কোনও সময়ে স্ট্যাককাউন্টকে কল করা যেতে পারে।

এখানে ব্যবহারের একটি উদাহরণ রয়েছে। বেশি কিছু করে না তবে কীভাবে ফাংশনগুলি ব্যবহার করতে হয় তা দেখানোর উদ্দেশ্যে is

// -----------------------------------------------------------------------------
extern uint8_t _end;
extern uint8_t __stack;

void StackPaint(void) __attribute__ ((naked)) __attribute__ ((section (".init1")));

void StackPaint(void)
{
#if 0
    uint8_t *p = &_end;

    while(p <= &__stack)
    {
        *p = 0xc5;
        p++;
    }
#else
    __asm volatile ("    ldi r30,lo8(_end)\n"
                    "    ldi r31,hi8(_end)\n"
                    "    ldi r24,lo8(0xc5)\n" /* STACK_CANARY = 0xc5 */
                    "    ldi r25,hi8(__stack)\n"
                    "    rjmp .cmp\n"
                    ".loop:\n"
                    "    st Z+,r24\n"
                    ".cmp:\n"
                    "    cpi r30,lo8(__stack)\n"
                    "    cpc r31,r25\n"
                    "    brlo .loop\n"
                    "    breq .loop"::);
#endif
} 


uint16_t StackCount(void)
{
    const uint8_t *p = &_end;
    uint16_t       c = 0;

    while(*p == 0xc5 && p <= &__stack)
    {
        p++;
        c++;
    }

    return c;
} 

// -----------------------------------------------------------------------------

void setup() {

Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
Serial.println(StackCount(), DEC);  // calls StackCount() to report the unused RAM
delay(1000);
}

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

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

1
ধন্যবাদ @ এলেক্সান_ই, আমি আমার ডিসপ্লেতে এমন একটি অঞ্চল তৈরি করেছি যা এখনই এটির প্রতিবেদন করে, যাতে পরের কয়েকদিন ধরে অগ্রসর হওয়ার সাথে সাথে আমি এই সংখ্যাটি আগ্রহের সাথে দেখব, বিশেষত যখন এটি ব্যর্থ হয়! আবারও ধন্যবাদ
মাডিভাদ

@ মাদিবাদ দয়া করে নোট করুন যে malloc ()
কোডটিতে

তার জন্য ধন্যবাদ, আমি সচেতন, এটি উল্লেখ করা হয়েছে। আমি যতদূর সচেতন, আমি এটি ব্যবহার করছি না (আমি জানি এটি ব্যবহার করে কোনও গ্রন্থাগার থাকতে পারে, আমি এখনও পুরোপুরি পরীক্ষা করে দেখিনি)।
মাদ্রিবাদ

10

রানটাইমের সময় মেমরির ব্যবহারের সাথে আপনার প্রধান সমস্যাগুলি হ'ল:

  • গতিশীল বরাদ্দ ( বা ) জন্য গাদা কোনও মেমরি উপলব্ধ নেইmallocnew
  • কোনও ফাংশন কল করার সময় স্ট্যাকের কোনও ঘর বাকি নেই

উভয়ই এভিআর এসআরএমের মতোই (আরডুইনোতে 2 কে) উভয়ের জন্য ব্যবহৃত হয় ( স্ট্যাটিক ডেটা ছাড়াও যা আকার কখনই প্রোগ্রামের প্রয়োগের সময় পরিবর্তিত হয় না)।

সাধারণত, গতিশীল মেমরির বরাদ্দ এমসিইউগুলিতে খুব কম ব্যবহৃত হয়, কেবলমাত্র কয়েকটি গ্রন্থাগার সাধারণত এটি ব্যবহার করে (এর মধ্যে একটি Stringশ্রেণি, যা আপনি উল্লেখ করেছেন যে আপনি ব্যবহার করেন না, এবং এটি একটি ভাল বিষয়)।

স্ট্যাক এবং গাদা নীচের ছবিতে দেখা যাবে ( অ্যাডাফুর্ট সৌজন্যে ): এখানে চিত্র বর্ণনা লিখুন

সুতরাং, সর্বাধিক প্রত্যাশিত সমস্যাটি স্ট্যাকের ওভারফ্লো থেকে আসে (অর্থাত্ যখন স্ট্যাকটি গাদাটির দিকে প্রসারিত হয় এবং এটির উপর দিয়ে প্রবাহিত হয়, এবং তারপর -আরআআআআআআআআআআএমের স্ট্যাটিক ডেটা জোনটিতে apিপিটি ব্যবহার করা হয় না that তখন, আপনার একটির উচ্চ ঝুঁকি রয়েছে:

  • ডেটা দুর্নীতি (উদাহরণস্বরূপ স্ট্যাকের ওভারুইটস হিপ বা স্ট্যাটিক ডেটা), আপনাকে অযৌক্তিক আচরণ প্রদান করে
  • স্ট্যাক দুর্নীতি (যেমন হিপ বা স্ট্যাটিক ডেটা স্ট্যাক সামগ্রীকে ওভাররাইট করে), সাধারণত ক্রাশ হয়ে যায়

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

int freeRam () {
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

উপরের কোডে, __brkvalগাদা শীর্ষকে নির্দেশ করে তবে 0যখন হিপটি ব্যবহার করা হয়নি, সেই ক্ষেত্রে আমরা &__heap_startকোন পয়েন্টটিকে ব্যবহার করি যা __heap_startপ্রথম ভেরিয়েবল যা গাদা নীচে চিহ্নিত করে; &vঅবশ্যই স্ট্যাকের শীর্ষে পয়েন্টগুলি (এটি স্ট্যাকের উপরে চাপানো শেষ পরিবর্তনশীল), সুতরাং উপরের সূত্রটি স্ট্যাকের জন্য উপলব্ধ মেমরির পরিমাণ (বা আপনি যদি এটি ব্যবহার করেন তবে গাদা) প্রদান করে returns

এই কোডটি কোথায় নাটকীয়ভাবে হ্রাস পাচ্ছে তা চেষ্টা করার জন্য এবং আপনার কোডের বিভিন্ন স্থানে আপনি এই ফাংশনটি ব্যবহার করতে পারেন।

অবশ্যই, যদি আপনি এই ফাংশনটি কোনও নেতিবাচক সংখ্যাটি ফেরত দেখেন তবে খুব দেরী হয়ে গেছে: আপনি ইতিমধ্যে স্ট্যাকটিকে উপচে ফেলেছেন!


1
মডারেটরদের কাছে: এই পোস্টটি সম্প্রদায়ের উইকিতে রাখার জন্য দুঃখিত, পোস্টের মাঝামাঝি সময়ে, টাইপ করার সময় অবশ্যই অবশ্যই আমি কিছু ভুল করেছি। এই ক্রিয়াটি অনিচ্ছাকৃত হওয়ায় দয়া করে এটিকে এখানে ফিরিয়ে দিন। ধন্যবাদ।
jfpoil ব্যাখ্যা

এই উত্তরের জন্য ধন্যবাদ, আমি আক্ষরিক মাত্র এক ঘন্টা আগে এই কোডের টুকরোটি খুঁজে পেয়েছি ( প্লেগ্রাউন্ডের নীচের অংশে ard.আড়ুইনো.সি.সি. / কোড / অ্যাভিয়েশনমেমিরি । আমার ডিসপ্লেতে ডিবাগিংয়ের জন্য আমার যথেষ্ট বিশাল অঞ্চল রয়েছে বলে আমি এটি এখনও অন্তর্ভুক্ত করি নি (তবে আমি করব)। আমি মনে করি আমি গতিশীলরূপে জিনিস বরাদ্দ সম্পর্কে বিভ্রান্ত হয়ে পড়েছি। কি mallocএবং newএকমাত্র উপায় আমি যে কি করতে পারেন? যদি তা হয় তবে আমার গতিশীল কিছুই নেই। এছাড়াও, আমি সবেমাত্র শিখলাম ইউএনওতে 2K এসআরএএম রয়েছে। আমি ভেবেছিলাম এটি 1 কে। এগুলি বিবেচনায় নিয়ে, আমি র‌্যামের বাইরে চলে যাচ্ছি না! আমার অন্য কোথাও তাকাতে হবে।
মাদ্রিবাদ

এছাড়াও, এছাড়াও আছে calloc। তবে আপনি তৃতীয় পক্ষের লিবস ব্যবহার করতে পারেন যা আপনার
অজান্তেই

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

ভাল যুক্তি! আমি আপনার উত্তরে এই নির্দিষ্ট পয়েন্টটি লক্ষ্য করিনি (এবং আমার কাছে যা আসলে বাগের মতো দেখাচ্ছিল), এখন আমি মুক্ত জোনটি সামনে "পেইন্টিং" এর পয়েন্টটি দেখছি। আপনার উত্তরটিতে আপনি এই বিষয়টিকে আরও স্পষ্ট করে তুলতে পারেন?
jfpoil ব্যাখ্যা

7

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

avr-objdump -S -j .bss project.elf

project.elf:     file format elf32-avr


Disassembly of section .bss:

00800060 <__bss_start>:
        ...

00800070 <measurementReady>:
        ...

00800071 <cycles>:
        ...

00800073 <measurement>:
  800073:       00 00 00 00                                         ....

00800077 <measurementStart>:
  800077:       00 00 00 00                                         ....

0080007b <timerOverflows>:
  80007b:       00 00 00 00

লক্ষ্য করুন যে এটি স্ট্যাগ বা গতিশীল মেমরির ব্যবহারটি প্রদর্শন করে না যেমন নীচে মন্তব্যগুলিতে ইগনাসিও ভাস্কেজ-আব্রামগুলি উল্লেখ করেছে।

অতিরিক্ত হিসাবে একটি avr-objdump -S -j .data project.elfচেক করা যেতে পারে, তবে আমার প্রোগ্রামগুলির কোনওটিই এর সাথে কিছু আউটপুট দেয় না তাই এটি কার্যকর কিনা তা আমি নিশ্চিত করে বলতে পারি না। এটি 'ইনিশিয়াল (শূন্য নয়) ডেটা তালিকাভুক্ত করার কথা


অথবা আপনি কেবল ব্যবহার করতে পারেন avr-size। তবে এটি আপনাকে গতিশীল বরাদ্দ বা স্ট্যাকের ব্যবহার দেখায় না।
ইগনাসিও ওয়াজকেজ-আব্রামস

@ গতিশীলতা সম্পর্কে IgnacioVazquez-Abram, আমার সমাধানের জন্য একই। আমার উত্তর সম্পাদনা।
জিপ্পি

ঠিক আছে, এটি এখন পর্যন্ত সবচেয়ে আকর্ষণীয় উত্তর। আমি পরীক্ষানিরীক্ষা করে থাকেন avr-objdumpএবং avr-sizeআমি খুব শীঘ্রই উপরে আমার পোস্টটি সম্পাদনা করব। এর জন্য ধন্যবাদ.
মাদ্রিবাদ

3

আমি কিছুক্ষণ সন্দেহ করেছিলাম যে আমি উপলব্ধ র‌্যামের শেষের দিকে যাচ্ছি। আমি মনে করি না যে আমি খুব বেশি স্ট্যাক ব্যবহার করছি (যদিও এটি সম্ভব) তবে আমি আসলে কতটা র‌্যাম ব্যবহার করছি তা নির্ধারণ করার সর্বোত্তম উপায় কোনটি?

ম্যানুয়াল অনুমানের সংমিশ্রণটি ব্যবহার করে এবং sizeofঅপারেটরটি ব্যবহার করা ভাল । যদি আপনার সমস্ত ঘোষণা স্থিতিশীল হয়, তবে এটি আপনাকে একটি সঠিক চিত্র দেবে।

আপনি যদি গতিশীল বরাদ্দ ব্যবহার করে থাকেন, তবে আপনি একবার মেমোরিটিকে ক্ষুণ্ন করা শুরু করলে আপনি কোনও সমস্যার মধ্যে পড়তে পারেন। এটি স্তূপে মেমরি খণ্ডিত হওয়ার কারণে।

এর মাধ্যমে কাজ করার চেষ্টা করছি, যখন আমি এনাম এবং স্ট্রাক্টে যাই তখন আমার সমস্যা হয়; তাদের কত স্মৃতি খরচ হয়?

একটি এনাম একটি হিসাবে যতটা জায়গা নেয় int। সুতরাং, যদি আপনার কাছে কোনও enumঘোষণায় 10 টি উপাদানের একটি সেট থাকে , তা হবে 10*sizeof(int)। এছাড়াও, যে পরিবর্তনশীল একটি শুমার ব্যবহার করে কেবল একটি হল int

কাঠামোর জন্য, এটি সন্ধান করা ব্যবহার করা সবচেয়ে সহজ হবে sizeof। কাঠামোগুলি এর সদস্যদের যোগফলের সমান (ন্যূনতম) স্থান দখল করে। সংকলক যদি কাঠামোর প্রান্তিককরণ করে, তবে এটি আরও বেশি হতে পারে, তবে এটি ক্ষেত্রে সম্ভাবনা কম avr-gcc


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

নিশ্চিত না যে sizeofআপনার স্ট্যাটিক ডেটার আকারটি সত্যই আপনার জানা দরকার কারণ এটি আর্দুড আইআইআরসি দ্বারা মুদ্রিত হয়।
jfpoil ব্যাখ্যা

@ jfpoil ব্যাখ্যা এটি সংস্করণ নির্ভর, আমি মনে করি। সমস্ত সংস্করণ এবং প্ল্যাটফর্মগুলি এটি সরবরাহ করে না। খনি (লিনাক্স, একাধিক সংস্করণ) একের জন্য মেমরির ব্যবহার দেখায় না, যখন ম্যাক সংস্করণগুলি করে।
asheeshr


@ আলেশআর আমি সে সম্পর্কে অবগত ছিলাম না, উইন্ডোজটিতে আমার কাজ ঠিক আছে।
jfpoil ব্যাখ্যা

1

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

আরডুইনো নির্মাতা

আরডুইনো নির্মাতা কোডব্লকস আরডিনো আইডিই সমাধানটির অংশ তৈরি করে । এটি হয় স্ট্যান্ডেলোন প্রোগ্রাম হিসাবে বা কোডব্লকস আরডুইনো আইডিই এর মাধ্যমে ব্যবহার করা যেতে পারে।

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

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