> 1 টি আইএসআর থেকে ভেরিয়েবল অ্যাক্সেস করা হয়, তবে আইএসআরগুলির বাইরে ভাগ করা যায় না তখন কি অস্থির প্রয়োজন হয়?


9

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

  • কেবলমাত্র আইএসআরের বাইরে ব্যবহৃত ভেরিয়েবলগুলি অস্থির হওয়া উচিত নয়।
  • কেবলমাত্র একটি আইএসআরের অভ্যন্তরে ব্যবহৃত ভেরিয়েবলগুলি অস্থির হওয়া উচিত নয়।
  • কোনও আইএসআরের অভ্যন্তরে এবং বাইরে উভয় ক্ষেত্রেই চলকগুলি অস্থির হওয়া উচিত।

কিন্তু volatileযখন পরিবর্তনশীল থেকে 1 ISRs> অ্যাক্সেস করা হয়, কিন্তু বাহিরে ISRs ভাগ করা প্রয়োজন? উদাহরণস্বরূপ, আমার একটি ফাংশন রয়েছে যা staticভেরিয়েবল ব্যবহার করে অভ্যন্তরীণ পরিস্থিতি বজায় রাখে :

void func() {
    static volatile long counter; // volatile or not?
    // Do stuff with counter etc.
}

এই ফাংশনটি দুটি উপায়ে বলা হয়: পিন বিঘ্নিত থেকে এবং টাইমারঅন লাইব্রেরি থেকে :

  1. attachInterrupt(0, func, CHANGE);
  2. Timer1.attachInterrupt(func);

কোনও পারমাণবিক সমস্যা নেই, যেহেতু কোনও আইএসআর প্রবেশ করা হয় তখন বাধা স্বয়ংক্রিয়ভাবে অক্ষম হয়ে যায় তবে volatileএটি আরও সংকলক প্রশ্ন: ক্যাশেড এবং কী নয়।

দুঃখের চেয়ে নিরাপদ অবশ্যই ...

উত্তর:


9

volatile কেবলমাত্র সংকলকটির কোড জেনারেটরকে অবহিত করে যে ভেরিয়েবল কোডটি উত্পন্ন করা ব্যতীত অন্য কোনও কিছু দ্বারা সংশোধিত হতে পারে, সুতরাং এটির কোনও অনুলিপি সঠিক না বলে ধরে নেওয়া যায় না।

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

* এই ক্ষেত্রে :
আমি এখানে একটি সফ্টওয়্যার-রক্ষণাবেক্ষণ ভেরিয়েবল ধরে নিচ্ছি। যদি আমরা এমন কোনও চলকের কথা বলি যা একটি হার্ডওয়্যার ইভেন্ট দ্বারা আপডেট করা যায়, উদাহরণস্বরূপ একটি টাইমার রেজিস্টার, সমস্ত বেট বন্ধ রয়েছে: যাই হোক না কেন ভেরিয়েবলটি অস্থির।


সুতরাং, যতক্ষণ না আমি আরডুইনোর ডিফল্ট "ইন্টারপ্টগুলি বাসা বাঁধে না" আচরণটি পরিবর্তন না করি, ততক্ষণ ভেরিয়েবলটি volatileহওয়ার দরকার নেই , যেহেতু কোডটি উত্পন্ন হওয়ার ব্যতীত অন্য কোনও কারণে এটি সংশোধিত হয়নি; সংকলক "ধরে নিতে পারে" যে ISR রৈখিকভাবে কার্যকর করে এবং যতক্ষণ বাধা বাসা বাঁধে না ততক্ষণ তা করে does এটা বোধগম্য. ধন্যবাদ!
জুনাস পুলক্কা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.