এটি স্পষ্টভাবে নথিভুক্ত করা হয়েছে যে যখন বিশ্বব্যাপী ডেটা কোনও আইএসআর এবং মূল প্রোগ্রামের সাথে ভাগ করা হয়, তখন volatileমেমরির দৃশ্যমানতার গ্যারান্টি দেওয়ার জন্য ডেটা ঘোষণা করা দরকার (এবং এটি কেবলমাত্র 1 বাইট ডেটার জন্য যথেষ্ট; বড় কিছুরও পরমাণুর গ্যারান্টি রাখতে বিশেষ ব্যবস্থা প্রয়োজন) । এখানে আমাদের ভাল নিয়ম রয়েছে:
- কেবলমাত্র আইএসআরের বাইরে ব্যবহৃত ভেরিয়েবলগুলি অস্থির হওয়া উচিত নয়।
- কেবলমাত্র একটি আইএসআরের অভ্যন্তরে ব্যবহৃত ভেরিয়েবলগুলি অস্থির হওয়া উচিত নয়।
- কোনও আইএসআরের অভ্যন্তরে এবং বাইরে উভয় ক্ষেত্রেই চলকগুলি অস্থির হওয়া উচিত।
কিন্তু volatileযখন পরিবর্তনশীল থেকে 1 ISRs> অ্যাক্সেস করা হয়, কিন্তু বাহিরে ISRs ভাগ করা প্রয়োজন? উদাহরণস্বরূপ, আমার একটি ফাংশন রয়েছে যা staticভেরিয়েবল ব্যবহার করে অভ্যন্তরীণ পরিস্থিতি বজায় রাখে :
void func() {
static volatile long counter; // volatile or not?
// Do stuff with counter etc.
}
এই ফাংশনটি দুটি উপায়ে বলা হয়: পিন বিঘ্নিত থেকে এবং টাইমারঅন লাইব্রেরি থেকে :
attachInterrupt(0, func, CHANGE);Timer1.attachInterrupt(func);
কোনও পারমাণবিক সমস্যা নেই, যেহেতু কোনও আইএসআর প্রবেশ করা হয় তখন বাধা স্বয়ংক্রিয়ভাবে অক্ষম হয়ে যায় তবে volatileএটি আরও সংকলক প্রশ্ন: ক্যাশেড এবং কী নয়।
দুঃখের চেয়ে নিরাপদ অবশ্যই ...
volatileহওয়ার দরকার নেই , যেহেতু কোডটি উত্পন্ন হওয়ার ব্যতীত অন্য কোনও কারণে এটি সংশোধিত হয়নি; সংকলক "ধরে নিতে পারে" যে ISR রৈখিকভাবে কার্যকর করে এবং যতক্ষণ বাধা বাসা বাঁধে না ততক্ষণ তা করে does এটা বোধগম্য. ধন্যবাদ!