আমি যখন আমার প্রোগ্রাম থেকে প্রস্থান () এ কল করব তখন কী ঘটে?


17

পারেন এর ইন setupবা loop, আমি যদি একটি অ্যাড ছিল exit(0)কল, যেখানে পাশ করা নিয়ন্ত্রণ করবে? মাইক্রোকন্ট্রোলারের পরবর্তী অবস্থা কী হবে? এটি কার্যকর করা এবং বিদ্যুৎ বন্ধ হবে?

আমি একটি রিভিশন 2 আরডুইনো ইউনো ব্যবহার করছি।


আমি মনে করি এটি বন্ধ হয়ে যায়। এটি ঘড়িটি বন্ধ করবে না, বা বিদ্যুৎ নামবে না।
TheDoctor

বাকী স্মৃতিটি NOPসমাবেশের বিবৃতিতে পূর্ণ হওয়া উচিত , যা কেবল কয়েক ঘন্টার চক্রের জন্য বিরতি দেয়
TheDoctor

উত্তর:


12

আমার প্রাথমিক অনুমানটি ভুল। আমি ভাবতাম এটি কেবল লুপ থেকে ফিরে আসবে এবং কোর লাইব্রেরিটি কেবল আবার লুপকে কল করবে ()। তবে, আমি দেখতে পাচ্ছি যে নিম্নলিখিত কোডটি তৈরি হয়েছিল। উল্লেখ্য যে __স্টপ_প্রগ্রাম একটি শক্ত লুপ ...

ব্লিঙ্ক.ইনো তালিকার একটি এক্সট্র্যাক্ট, প্রস্থান (0) যুক্ত করে:

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
  exit(0);
}

উপরের বিচ্ছিন্নতা:

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
 100:   80 91 00 01     lds r24, 0x0100
 104:   61 e0           ldi r22, 0x01   ; 1
 106:   0e 94 ca 01     call    0x394   ; 0x394 <digitalWrite>
  delay(1000);               // wait for a second
 10a:   68 ee           ldi r22, 0xE8   ; 232
 10c:   73 e0           ldi r23, 0x03   ; 3
 10e:   80 e0           ldi r24, 0x00   ; 0
 110:   90 e0           ldi r25, 0x00   ; 0
 112:   0e 94 f7 00     call    0x1ee   ; 0x1ee <delay>
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
 116:   80 91 00 01     lds r24, 0x0100
 11a:   60 e0           ldi r22, 0x00   ; 0
 11c:   0e 94 ca 01     call    0x394   ; 0x394 <digitalWrite>
  delay(1000);               // wait for a second
 120:   68 ee           ldi r22, 0xE8   ; 232
 122:   73 e0           ldi r23, 0x03   ; 3
 124:   80 e0           ldi r24, 0x00   ; 0
 126:   90 e0           ldi r25, 0x00   ; 0
 128:   0e 94 f7 00     call    0x1ee   ; 0x1ee <delay>
  exit(0);
 12c:   80 e0           ldi r24, 0x00   ; 0
 12e:   90 e0           ldi r25, 0x00   ; 0
 130:   0e 94 1e 02     call    0x43c   ; 0x43c <_exit>

...

0000043c <_exit>:
 43c:   f8 94           cli

0000043e <__stop_program>:
 43e:   ff cf           rjmp    .-2         ; 0x43e <__stop_program>

মনে রাখবেন যে _ এক্সিট যদি ক্লাই না ডাকত, বাধা স্টাফ করতে সক্ষম হবে। কিন্তু যে ক্ষেত্রে হয় না।


avr-objdump -S {compiled *.elf file}এমন একটি ফাইল তৈরি করে যাতে সি কোড অন্তর্ভুক্ত থাকে যা সমাবেশ কোডের প্রতিটি বিভাগে নেতৃত্ব দেয়। এটি অনুসরণ করা অনেক সহজ।
কনার ওল্ফ

আমি কেবল এটি চেষ্টা করেছি এবং এটি লুপ ফাংশনের জন্য সঠিকভাবে ইনলাইন সি কোড নির্গমন করছে না। কি খারাপ অবস্থা?
কনার ওল্ফ

ওহ, চরম অদ্ভুত। আমি প্রকল্পের সংকলিত Stino পরিবর্তে Arduino সম্পাদক decompiled *.elfথেকে, এবং তারপর আমি সঠিক ডিবাগিং প্রতীক পেতে। আমার মনে হয় আরডুইনো টেক্সট-এডিটর / বাটন-ম্যাক্রো (আমি এটি আইডিই বলতে অস্বীকার করি না কারণ এটি না) কিছু উদ্ভট ও বোকা কারণে, কেবল কম্পাইল করা মূল সি ++ ফাইল থেকে ডিবাগের তথ্যটি কেটে ফেলা হচ্ছে।
কনার ওল্ফ

সেখানে হয় একটি ব্যাখ্যা, এবং এটি একটি অস্থায়ী অবস্থান আইডিই কপি আপনার ফাইল পথ সঙ্গে করতে হয়। আপনি "ফিক্স" করতে পারেন যেখানে উৎস AVR-objdump কহন দ্বারা: avr-objdump -S -I/path/to/the/sketch/folder xxx.elf । যে স্কেচ হয় ফোল্ডার পাথ , না .ino ফাইল নিজেই। তারপরে আপনার ডাম্পে সি উত্স পাওয়া উচিত।
নিক গ্যামন

11

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

দ্রষ্টব্য: আপনি যদি ভাবছিলেন তবে রিসেট বোতামটির টিপস কোডটি পুনরায় চালু করে।


জানা ভাল. আমি আরও বিশদ এবং নিম্ন স্তরের কিছু সন্ধান করছিলাম । কল exit(0)করার সময় বিচ্ছিন্ন নির্দেশাবলী হ'ল (আইআইআরসি) __stop_program, cliএবং একটি স্পিনলক। আমি কীভাবে নিয়ন্ত্রণটি পাস হয় অর্থাৎ কল স্ট্যাক পপ ?, আইএসআর কল দিয়েছি তার ব্যাখ্যা দিয়ে তা যাচাই করতে চেয়েছিলাম?
asheeshr

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