এটি এমন একটি প্রশ্ন যা আমার বাবা আমাকে সবসময় জিজ্ঞাসা করতেন। " কেন এটি কেবল সমস্ত নির্দেশাবলীর মধ্য দিয়ে চলে না এবং শেষে থামছে না? "
আসুন একটি প্যাথলজিকাল উদাহরণ দেখুন। নিম্নলিখিত কোডটি PIC18 এর জন্য মাইক্রোচিপের সি 18 সংকলকটিতে সংকলিত ছিল:
void main(void)
{
}
এটি নিম্নলিখিত এসেমব্লার আউটপুট উত্পাদন করে:
addr opco instruction
---- ---- -----------
0000 EF63 GOTO 0xc6
0002 F000 NOP
0004 0012 RETURN 0
.
. some instructions removed for brevity
.
00C6 EE15 LFSR 0x1, 0x500
00C8 F000 NOP
00CA EE25 LFSR 0x2, 0x500
00CC F000 NOP
.
. some instructions removed for brevity
.
00D6 EC72 CALL 0xe4, 0 // Call the initialisation code
00D8 F000 NOP //
00DA EC71 CALL 0xe2, 0 // Here we call main()
00DC F000 NOP //
00DE D7FB BRA 0xd6 // Jump back to address 00D6
.
. some instructions removed for brevity
.
00E2 0012 RETURN 0 // This is main()
00E4 0012 RETURN 0 // This is the initialisation code
আপনি দেখতে পাচ্ছেন, মেইন () বলা হয় এবং শেষে একটি রিটার্ন স্টেটমেন্ট থাকে যদিও আমরা তা স্পষ্টভাবে সেখানে নিজেরাই রাখিনি। যখন প্রধান ফিরে আসে, সিপিইউ পরবর্তী নির্দেশনা কার্যকর করে যা কোডের শুরুতে ফিরে যাওয়ার জন্য কেবল একটি গোটো। প্রধান () কেবল বার বার বলা হয়।
এখন, এটি বলার পরে, লোকেরা সাধারণত জিনিসগুলি করত এমন নয়। আমি এমন কোনও এমবেডেড কোড লিখিনি যা প্রধান () কে এই জাতীয়ভাবে প্রস্থান করতে দেয়। বেশিরভাগ ক্ষেত্রে, আমার কোডটি এর মতো দেখতে লাগবে:
void main(void)
{
while(1)
{
wait_timer();
do_some_task();
}
}
সুতরাং আমি সাধারণত কখনই প্রধান () থেকে বেরিয়ে আসি না।
"ঠিক আছে" আপনি বলছেন। এগুলি অত্যন্ত আকর্ষণীয় যে সংকলকটি নিশ্চিত করে যে কোনও শেষের বিবৃতি কখনও নেই। কিন্তু আমরা যদি বিষয়টি জোর করে বলি তবে কী ঘটে? আমি যদি আমার এসেম্বলারের হাত দিয়ে কোড করি এবং শুরুতে কোনও লাফ না রেখে দিয়েছি?
ঠিক আছে, স্পষ্টতই সিপিইউ কেবলমাত্র পরবর্তী নির্দেশাবলী কার্যকর করতে থাকবে। এগুলিকে এরকম কিছু দেখাবে:
addr opco instruction
---- ---- -----------
00E6 FFFF NOP
00E8 FFFF NOP
00EA FFFF NOP
00EB FFFF NOP
.
. some instructions removed for brevity
.
7EE8 FFFF NOP
7FFA FFFF NOP
7FFC FFFF NOP
7FFE FFFF NOP
প্রধান () এ শেষ নির্দেশনার পরে পরবর্তী মেমরি ঠিকানা খালি is FLASH মেমরি সহ একটি মাইক্রোকন্ট্রোলারে, একটি খালি নির্দেশে 0xFFFF মান থাকে। কমপক্ষে একটি পিআইসি-তে, সেই বিকল্প কোডটি 'না' বা 'কোনও অপারেশন' হিসাবে ব্যাখ্যা করা হয়। এটি কেবল কিছুই করে না। সিপিইউ শেষ পর্যন্ত স্মৃতি থেকে নীচে n সমস্ত ন্যাপগুলি চালিয়ে যেতে থাকবে।
এর পরে কি?
শেষ নির্দেশে, সিপিইউর নির্দেশিকা পয়েন্টারটি 0x7FFe হয়। সিপিইউ তার নির্দেশ পয়েন্টারে 2 যোগ করলে, এটি 0x8000 পায়, যা কেবল 32k ফ্ল্যাশ সহ একটি পিকের ওভারফ্লো হিসাবে বিবেচিত হয়, এবং তাই এটি 0x0000 এর কাছাকাছি আবৃত হয়, এবং সিপিইউ আনন্দের সাথে কোডের শুরুতে নির্দেশাবলী কার্যকর করতে থাকে , যেমন এটি পুনরায় সেট করা হয়েছে।
আপনি পাওয়ারটি ডাউন করার প্রয়োজনীয়তা সম্পর্কেও জিজ্ঞাসা করেছিলেন। মূলত আপনি যা চান তা করতে পারেন এবং এটি আপনার আবেদনের উপর নির্ভর করে।
আপনার যদি এমন অ্যাপ্লিকেশন থাকে যা পাওয়ার পরে কেবল একটি কাজ করার দরকার পড়ে এবং অন্য কিছু না করে আপনি কিছুক্ষণ সময় দিতে পারেন (1); মূল () এর শেষে যাতে সিপিইউ লক্ষণীয় কিছু করা বন্ধ করে দেয়।
যদি অ্যাপ্লিকেশনটির সিপিইউটি পাওয়ার জন্য প্রয়োজন হয়, তবে, সিপিইউর উপর নির্ভর করে সম্ভবত বিভিন্ন স্লিপ মোড উপলব্ধ। তবে, সিপিইউগুলির আবার জেগে ওঠার অভ্যাস রয়েছে, তাই আপনাকে নিশ্চিত করতে হবে যে ঘুমের কোনও সময়সীমা ছিল না, এবং কোনও ওয়াচ কুকুর টাইমার সক্রিয় নয় ইত্যাদি have
এমনকি আপনি এমন কিছু বাহ্যিক সার্কিটরিও সংগঠিত করতে পারেন যা সিপিইউকে সম্পূর্ণরূপে নিজস্ব শক্তি কেটে দেওয়ার অনুমতি দেয়। এই প্রশ্নটি দেখুন: অন-অফ টগল স্যুইচটিকে ল্যাচিং হিসাবে একটি ক্ষণিকের পুশ বোতামটি ব্যবহার করা ।