আরডুইনো ইউনো এবং অনুরূপ বোর্ডগুলিতে কীভাবে বাধা কাজ করে?


11

এটিএমগা 328 পি প্রসেসর ব্যবহার করে কীভাবে আরডুইনো ইউনো এবং সম্পর্কিত বোর্ডগুলিতে বাধা কাজ করে তা দয়া করে ব্যাখ্যা করুন। বোর্ডগুলি যেমন:

  • ইউএনও
  • ক্ষুদ্র
  • ন্যানো
  • প্রো মিনি
  • Lilypad

বিশেষ করে আলোচনা করুন:

  • কি জন্য বাধা ব্যবহার করতে হবে
  • একটি বিঘ্নিত পরিষেবা রুটিন (আইএসআর) কীভাবে লিখবেন
  • সময় সমস্যা
  • সমালোচনা বিভাগ
  • ডাটাতে পারমাণবিক অ্যাক্সেস

দ্রষ্টব্য: এটি একটি রেফারেন্স প্রশ্ন

উত্তর:


25

টিএল; ডিআর:

একটি বিঘ্নিত পরিষেবা রুটিন (আইএসআর) লেখার সময়:

  • এটি ছোট রাখুন
  • ব্যবহার করবেন না delay ()
  • সিরিয়াল প্রিন্ট করবেন না
  • ভেরিয়েবলগুলি মূল কোডটিকে অস্থির করে তুলুন
  • প্রধান কোডের সাথে ভাগ করা ভেরিয়েবলগুলি "সমালোচনামূলক বিভাগগুলি" দ্বারা সুরক্ষিত হতে পারে (নীচে দেখুন)
  • বাধা বন্ধ বা চালু করার চেষ্টা করবেন না

বাধা কী?

বেশিরভাগ প্রসেসরের বাধা থাকে। বাধা আপনাকে অন্য কিছু করার সময় "বাহ্যিক" ইভেন্টগুলিতে সাড়া দেয়। উদাহরণস্বরূপ, আপনি যদি রাতের খাবার রান্না করেন তবে আপনি 20 মিনিট ধরে রান্না করতে আলু রাখতে পারেন। 20 মিনিটের জন্য ঘড়ির দিকে না তাকিয়ে আপনি একটি টাইমার সেট করতে পারেন, এবং তারপরে টিভি দেখতে যান। যখন টাইমার বেজে যায় তখন আপনি আলু দিয়ে কিছু করার জন্য আপনার টিভি দেখায় "বাধা" দেন।


বাধা উদাহরণ

const byte LED = 13;
const byte SWITCH = 2;

// Interrupt Service Routine (ISR)
void switchPressed ()
{
  if (digitalRead (SWITCH) == HIGH)
    digitalWrite (LED, HIGH);
  else
    digitalWrite (LED, LOW);
}  // end of switchPressed

void setup ()
{
  pinMode (LED, OUTPUT);  // so we can update the LED
  pinMode (SWITCH, INPUT_PULLUP);
  attachInterrupt (digitalPinToInterrupt (SWITCH), switchPressed, CHANGE);  // attach interrupt handler
}  // end of setup

void loop ()
{
  // loop doing nothing
}

এই উদাহরণটি দেখায় যে কীভাবে প্রধান লুপটি কিছু করছে না, আপনি পিন ডি 2 টিতে স্যুইচ করা থাকলে 13 টি পিনের এলইডি চালু বা বন্ধ করতে পারেন।

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

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


পিন নম্বরগুলিকে বিঘ্নিত সংখ্যায় রূপান্তর করা

বিঘ্নিত ভেক্টর সংখ্যাগুলিকে পিন সংখ্যায় রূপান্তর করতে সহজ করার জন্য আপনি digitalPinToInterrupt()একটি পিন নম্বর পাস করে ফাংশনটিতে কল করতে পারেন । এটি উপযুক্ত বাধা নম্বর, বা NOT_AN_INTERRUPT(-1) প্রদান করে।

উদাহরণস্বরূপ, ইউনোতে বোর্ডে পিন ডি 2 বিঘ্নিত হয় 0 (নীচের টেবিল থেকে INT0_vect)।

সুতরাং এই দুটি লাইন একই প্রভাব রয়েছে:

  attachInterrupt (0, switchPressed, CHANGE);    // that is, for pin D2
  attachInterrupt (digitalPinToInterrupt (2), switchPressed, CHANGE);

তবে দ্বিতীয়টি পড়া সহজ এবং বিভিন্ন আরডুইনো ধরণের কাছে আরও বহনযোগ্য।


উপলভ্য বাধা

নীচে আটমেগা 328 এর জন্য অগ্রাধিকার ক্রমে বিঘ্নগুলির একটি তালিকা রয়েছে:

 1  Reset
 2  External Interrupt Request 0  (pin D2)          (INT0_vect)
 3  External Interrupt Request 1  (pin D3)          (INT1_vect)
 4  Pin Change Interrupt Request 0 (pins D8 to D13) (PCINT0_vect)
 5  Pin Change Interrupt Request 1 (pins A0 to A5)  (PCINT1_vect)
 6  Pin Change Interrupt Request 2 (pins D0 to D7)  (PCINT2_vect)
 7  Watchdog Time-out Interrupt                     (WDT_vect)
 8  Timer/Counter2 Compare Match A                  (TIMER2_COMPA_vect)
 9  Timer/Counter2 Compare Match B                  (TIMER2_COMPB_vect)
10  Timer/Counter2 Overflow                         (TIMER2_OVF_vect)
11  Timer/Counter1 Capture Event                    (TIMER1_CAPT_vect)
12  Timer/Counter1 Compare Match A                  (TIMER1_COMPA_vect)
13  Timer/Counter1 Compare Match B                  (TIMER1_COMPB_vect)
14  Timer/Counter1 Overflow                         (TIMER1_OVF_vect)
15  Timer/Counter0 Compare Match A                  (TIMER0_COMPA_vect)
16  Timer/Counter0 Compare Match B                  (TIMER0_COMPB_vect)
17  Timer/Counter0 Overflow                         (TIMER0_OVF_vect)
18  SPI Serial Transfer Complete                    (SPI_STC_vect)
19  USART Rx Complete                               (USART_RX_vect)
20  USART, Data Register Empty                      (USART_UDRE_vect)
21  USART, Tx Complete                              (USART_TX_vect)
22  ADC Conversion Complete                         (ADC_vect)
23  EEPROM Ready                                    (EE_READY_vect)
24  Analog Comparator                               (ANALOG_COMP_vect)
25  2-wire Serial Interface  (I2C)                  (TWI_vect)
26  Store Program Memory Ready                      (SPM_READY_vect)

অভ্যন্তরীণ নাম (যা আপনি আইএসআর কলব্যাক সেট আপ করতে ব্যবহার করতে পারেন) বন্ধনীগুলিতে রয়েছে।

সতর্কতা: আপনি যদি বিঘ্নিত ভেক্টরের নামটি ভুলভাবে বানান করেন, এমনকি কেবল মূলধনকে ভুল করে (একটি সহজ জিনিস) দ্বারা বিঘ্নিত রুটিন বলা হবে না , এবং আপনি একটি সংকলক ত্রুটি পাবেন না।


বাধা ব্যবহার করার কারণ

আপনি বাধা ব্যবহার করতে পারেন যে প্রধান কারণগুলি হ'ল:

  • পিন পরিবর্তনগুলি সনাক্ত করতে (যেমন রোটারি এনকোডার, বোতাম টিপুন)
  • ওয়াচডগ টাইমার (যেমন 8 সেকেন্ডের পরে যদি কিছু না ঘটে তবে আমাকে বাধা দিন)
  • টাইমার বিঘ্ন - টাইমার তুলনা / উপচে পড়া জন্য ব্যবহৃত
  • এসপিআই ডেটা স্থানান্তর
  • আই 2 সি ডেটা স্থানান্তর
  • USART ডেটা স্থানান্তর
  • এডিসি রূপান্তর (ডিজিটালের সাথে এনালগ)
  • EEPROM ব্যবহারের জন্য প্রস্তুত
  • ফ্ল্যাশ মেমরি প্রস্তুত

সিরিয়াল পোর্ট, এসপিআই পোর্ট বা আই 2 সি পোর্টে ডেটা প্রেরণ বা প্রাপ্ত হওয়ার সময় কোনও প্রোগ্রামকে অন্য কিছু করতে "ডেটা স্থানান্তর" ব্যবহার করা যেতে পারে।

প্রসেসর জাগো

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

কী-প্যাড বা অনুরূপ কোনও কী চাপলে প্রসেসরটি জাগাতে পিন-পরিবর্তন বিঘ্নগুলি ব্যবহার করা যেতে পারে।

প্রসেসরটি টাইমার বিঘ্ন (যেমন: একটি টাইমার একটি নির্দিষ্ট মানের কাছে পৌঁছানো, বা উপচে পড়া) এবং আগত আই 2 সি ম্যাসেজের মতো কিছু অন্যান্য ইভেন্টের মাধ্যমেও জাগ্রত হতে পারে।


বাধা সক্ষম / অক্ষম করা

"রিসেট" বিঘ্ন অক্ষম করা যায় না। তবে অন্যান্য বাধা বিশ্বব্যাপী বাধা পতাকা সাফ করে সাময়িকভাবে অক্ষম করা যায়।

বাধা সক্ষম করুন

"ফাংশন কল" বাধা "বা" sei "এর মাধ্যমে আপনি বাধা সক্ষম করতে পারেন:

interrupts ();  // or ...
sei ();         // set interrupts flag

বাধা অক্ষম করুন

আপনার যদি বাধা নিষ্ক্রিয় করতে হয় তবে আপনি বিশ্বব্যাপী বাধা পতাকাটিকে "পরিষ্কার" করতে পারেন:

noInterrupts ();  // or ...
cli ();           // clear interrupts flag

উভয় পদ্ধতির একই প্রভাব রয়েছে, ব্যবহার করে interrupts/ ব্যবহার করা noInterruptsতাদের চারপাশের উপায়টি মনে রাখা একটু সহজ।

আরডুইনোতে ডিফল্ট হ'ল বিঘ্ন সক্ষম করার জন্য। তাদের দীর্ঘ সময় ধরে অক্ষম করবেন না বা টাইমারগুলির মতো জিনিসগুলি ঠিক মতো কাজ করবে না।

বাধা কেন অক্ষম করবেন?

কোডের সময়-সমালোচনামূলক টুকরো থাকতে পারে যা আপনি বাধা দিতে চান না, উদাহরণস্বরূপ টাইমার বিঘ্নিত হয়ে।

এছাড়াও যদি কোনও আইএসআর দ্বারা মাল্টি-বাইট ক্ষেত্রগুলি আপডেট করা হয় তবে আপনাকে বাধা নিষ্ক্রিয় করতে হবে যাতে আপনি "পরমাণুভাবে" ডেটা পান। অন্যথায় আপনি যখন অন্যটি পড়ছেন তখন একটি বাইট আইএসআর দ্বারা আপডেট করা যেতে পারে।

উদাহরণ স্বরূপ:

noInterrupts ();
long myCounter = isrCounter;  // get value set by ISR
interrupts ();

অস্থায়ীভাবে বিঘ্নগুলি বন্ধ করে দেওয়া নিশ্চিত করে যে আমরা এর মান অর্জন করার সময় ইসর কাউন্টার (একটি আইএসআরের অভ্যন্তরে একটি কাউন্টার সেট) পরিবর্তন হয় না।

সতর্কতা: আপনি যদি নিশ্চিত হন না যে বাধা ইতিমধ্যে চালু আছে কি না, তবে আপনার বর্তমান অবস্থাটি সংরক্ষণ এবং পরে এটি পুনরুদ্ধার করা দরকার। উদাহরণস্বরূপ, মিলিস () ফাংশনের কোডটি এটি করে:

unsigned long millis()
{
  unsigned long m;
  uint8_t oldSREG = SREG;    // <--------- save status register

  // disable interrupts while we read timer0_millis or we might get an
  // inconsistent value (e.g. in the middle of a write to timer0_millis)
  cli();
  m = timer0_millis;
  SREG = oldSREG;            // <---------- restore status register including interrupt flag

  return m;
}

উল্লিখিত রেখাগুলি বর্তমান এসআরজি (স্থিতি রেজিস্ট্রার) সংরক্ষণ করুন যাতে বাধা পতাকা অন্তর্ভুক্ত রয়েছে। আমরা টাইমার মান অর্জন করার পরে (যা 4 বাইট দীর্ঘ) আমরা স্থিতি রেজিস্টারটি কেমন ছিল তা ফিরিয়ে দিয়েছি।


পরামর্শ

ফাংশন নাম

ফাংশন cli/ seiএবং রেজিস্টার এসআরইজি এভিআর প্রসেসরগুলির জন্য নির্দিষ্ট। আপনি যদি অন্য প্রসেসরগুলি যেমন এআরএম ব্যবহার করেন তবে ফাংশনগুলি কিছুটা আলাদা হতে পারে।

বিশ্বব্যাপী অক্ষম করা বনাম একটি অক্ষমতা অক্ষমকরণ

আপনি যদি ব্যবহার করেন তবে সমস্ত বিঘ্ন cli()অক্ষম করুন (টাইমার বিঘ্ন, সিরিয়াল বাধা ইত্যাদি)।

তবে আপনি যদি কেবল একটি নির্দিষ্ট বাধা নিষ্ক্রিয় করতে চান তবে আপনাকে সেই নির্দিষ্ট বাধা উত্সের জন্য বাধা-সক্ষম পতাকা সাফ করা উচিত। উদাহরণস্বরূপ, বাহ্যিক বাধা জন্য কল করুন detachInterrupt()


বাধা অগ্রাধিকার কি?

যেহেতু 25 টি বাধা রয়েছে (রিসেট ব্যতীত) এটি সম্ভব যে একাধিক বাধা ঘটনা একবারে ঘটতে পারে বা কমপক্ষে, পূর্ববর্তীটি প্রক্রিয়া করার আগে ঘটতে পারে। এছাড়াও বাধা অক্ষম থাকাকালীন একটি বাধা ইভেন্ট ঘটতে পারে।

অগ্রাধিকার ক্রম হল ক্রম যেখানে প্রসেসর বাধা ইভেন্টগুলির জন্য পরীক্ষা করে। তালিকা যত বেশি হবে তত বেশি অগ্রাধিকার হবে। সুতরাং, উদাহরণস্বরূপ, একটি বাহ্যিক বাধা অনুরোধ 0 (পিন ডি 2) বহিরাগত বাধা অনুরোধ 1 (পিন ডি 3) এর আগে পরিবেশন করা হবে।


বাধা অক্ষম থাকা অবস্থায় বাধা সৃষ্টি করতে পারে?

বাধা ইভেন্টগুলি (যা ইভেন্টটিকে লক্ষ্য করা) যে কোনও সময় ঘটতে পারে এবং প্রসেসরের অভ্যন্তরে একটি "বিঘ্নিত ইভেন্ট" পতাকা সেট করে বেশিরভাগ স্মরণ করা হয়। যদি বাধাগুলি অক্ষম করা হয়, তবে অগ্রাধিকার ক্রমে যখন আবার সক্ষম করা হয় তখন সেই বাধা হ্যান্ডেল করা হবে।


আপনি কীভাবে বাধা ব্যবহার করবেন?

  • আপনি একটি আইএসআর (বিঘ্নিত পরিষেবার রুটিন) লিখুন। বাধা যখন ঘটে তখন এটিকে বলা হয়।
  • আপনি প্রসেসরটিকে বলুন যখন আপনি বাধা দিতে বাধা দিতে চান।

একটি আইএসআর লেখা

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

// Interrupt Service Routine (ISR)
void switchPressed ()
{
 flag = true;
}  // end of switchPressed

তবে যদি কোনও লাইব্রেরি ইতিমধ্যে কোনও আইএসআরকে "হুক" সরবরাহ না করে থাকে তবে আপনি নিজের মতো করে তৈরি করতে পারেন:

volatile char buf [100];
volatile byte pos;

// SPI interrupt routine
ISR (SPI_STC_vect)
{
byte c = SPDR;  // grab byte from SPI Data Register

  // add to buffer if room
  if (pos < sizeof buf)
    {
    buf [pos++] = c;
    }  // end of room available
}  // end of interrupt routine SPI_STC_vect

এই ক্ষেত্রে আপনি "আইএসআর" ম্যাক্রো ব্যবহার করেন এবং প্রাসঙ্গিক বিঘ্নিত ভেক্টরের নাম সরবরাহ করুন (আগের টেবিল থেকে)। এই ক্ষেত্রে আইএসআর একটি এসপিআই ট্রান্সফার সমাপ্তি পরিচালনা করছে। (দ্রষ্টব্য, কিছু পুরানো কোড আইএসআর এর পরিবর্তে সিগনাল ব্যবহার করে, তবে সিগনাল হ্রাস করা হয়নি)।

একটি বাধা সঙ্গে একটি আইএসআর সংযুক্ত

ইতিমধ্যে লাইব্রেরি দ্বারা পরিচালিত বাধা জন্য, আপনি কেবল ডকুমেন্টেড ইন্টারফেস ব্যবহার করুন। উদাহরণ স্বরূপ:

void receiveEvent (int howMany)
 {
  while (Wire.available () > 0)
    {
    char c = Wire.receive ();
    // do something with the incoming byte
    }
}  // end of receiveEvent

void setup ()
  {
  Wire.onReceive(receiveEvent);
  }

এই ক্ষেত্রে আই 2 সি লাইব্রেরিটি অভ্যন্তরীণভাবে আগত আই 2 সি বাইটগুলি হ্যান্ডেল করার জন্য ডিজাইন করা হয়েছে এবং তারপরে আগত ডেটা স্ট্রিমের শেষে আপনার সরবরাহিত ফাংশনটি কল করুন call এক্ষেত্রে রিসিভএভেন্ট কঠোরভাবে আইএসআর নয় (এটির একটি যুক্তি রয়েছে) তবে এটি ইনবিল্ট আইএসআর বলে।

আরেকটি উদাহরণ হ'ল "বাহ্যিক পিন" বাধা দেওয়া।

// Interrupt Service Routine (ISR)
void switchPressed ()
{
  // handle pin change here
}  // end of switchPressed

void setup ()
{
  attachInterrupt (digitalPinToInterrupt (2), switchPressed, CHANGE);  // attach interrupt handler for D2
}  // end of setup

এই ক্ষেত্রে সংযুক্তি আন্তঃবিধ ফাংশনটি একটি অভ্যন্তরীণ টেবিলের সাথে স্যুইচপ্রেসড ফাংশনটি যুক্ত করে এবং প্রসেসরের উপযুক্ত বাধা পতাকাগুলি কনফিগার করে।

একটি বাধা হ্যান্ডেল করতে প্রসেসর কনফিগার করা

পরবর্তী পদক্ষেপ, আপনার একবার আইএসআর হয়ে গেলে, প্রসেসরকে বলা হয় যে আপনি এই বিশেষ শর্তটি একটি বাধা বাড়াতে চান।

উদাহরণস্বরূপ, বাহ্যিক বাধা 0 (ডি 2 বাধা) এর জন্য আপনি এরকম কিছু করতে পারেন:

EICRA &= ~3;  // clear existing flags
EICRA |= 2;   // set wanted flags (falling level interrupt)
EIMSK |= 1;   // enable it

আরও পঠনযোগ্য হ'ল সংজ্ঞায়িত নামগুলি ব্যবহার করতে হবে:

EICRA &= ~(bit(ISC00) | bit (ISC01));  // clear existing flags
EICRA |= bit (ISC01);    // set wanted flags (falling level interrupt)
EIMSK |= bit (INT0);     // enable it

EICRA (এক্সটার্নাল ইন্টারপান কন্ট্রোল রেজিস্টার এ) এটিমেগা 328 ডেটাশিট থেকে এই টেবিল অনুযায়ী সেট করা হবে। এটি আপনার পছন্দসই বাধার সঠিক ধরণের সংজ্ঞা দেয়:

  • 0: INT0 এর নিম্ন স্তরের একটি বিঘ্নিত অনুরোধ উত্পন্ন করে (LOW বাধা দেওয়া)।
  • 1: INT0 এ যে কোনও যৌক্তিক পরিবর্তন একটি বিঘ্নিত অনুরোধ উত্পন্ন করে (পরিবর্তিত বাধা)।
  • 2: INT0 এর পতনশীল প্রান্তটি একটি বিঘ্নিত অনুরোধ উত্পন্ন করে (FALLING বিঘ্নিত)।
  • 3: INT0 এর ক্রমবর্ধমান প্রান্ত একটি বিঘ্নিত অনুরোধ উত্পন্ন করে (RISING বিঘ্নিত)।

EIMSK (বাহ্যিক বাধা মাস্ক রেজিস্টার) আসলে বাধা সক্ষম করে।

ভাগ্যক্রমে আপনার এই সংখ্যাগুলি মনে রাখার দরকার নেই কারণ সংযুক্তি আন্তঃবিঘ্নী এটি আপনার জন্য করে। তবে এটি যা ঘটছে তা হ'ল এবং অন্যান্য বাধাগুলির জন্য আপনাকে "ম্যানুয়ালি" বাধা পতাকা সেট করতে হতে পারে।


নিম্ন-স্তরের আইএসআরগুলি বনাম লাইব্রেরি আইএসআরগুলি

আপনার জীবনকে সহজতর করার জন্য কিছু সাধারণ বিঘ্নিত হ্যান্ডলারগুলি লাইব্রেরি কোডের অভ্যন্তরে থাকে (উদাহরণস্বরূপ INT0_vect এবং INT1_vect) এবং তারপরে আরও একটি ব্যবহারকারী-বান্ধব ইন্টারফেস সরবরাহ করা হয় (উদাহরণস্বরূপ সংযুক্তি আন্তঃবিধ)। সংযুক্তি আসলে যা করে তা হ'ল আপনার চাওয়া বাধা হ্যান্ডলারের ঠিকানাটি একটি ভেরিয়েবলে সংরক্ষণ করা এবং তারপরে যখন প্রয়োজন হয় তখন INT0_vect / INT1_vect থেকে কল করুন। এটি হ্যান্ডলারকে কল করার জন্য উপযুক্ত রেজিস্টার পতাকাগুলিও সেট করে sets


আইএসআরগুলিতে বাধা দেওয়া যায় কি?

সংক্ষেপে, না, আপনি না হয়ে থাকলে না।

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

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

তবে আপনি অবশ্যই আইএসআর-এর ভিতরে বাধা চালু করতে পারেন , যেমন:

// Interrupt Service Routine (ISR)
void switchPressed ()
{
  // handle pin change here
  interrupts ();  // allow more interrupts

}  // end of switchPressed

সাধারণত এটি করার জন্য আপনার বেশ ভাল কারণের প্রয়োজন হবে কারণ এখন অন্য একটি বাধাপ্রাপ্ত হওয়ার ফলে পিন চেঞ্জে পুনরাবৃত্ত কল আসতে পারে, সম্ভবত সম্ভবত অনাকাঙ্ক্ষিত ফলাফল রয়েছে।


আইএসআর কার্যকর করতে কতক্ষণ সময় লাগে?

ডাটাশিট অনুসারে, একটি বিঘ্নিত পরিসেবা করতে সর্বনিম্ন সময় হ'ল 4 ঘড়ি চক্র (বর্তমান প্রোগ্রামের কাউন্টারটিকে স্ট্যাকের উপরে ঠেলাতে) তারপরে কোডটি এখন বিঘ্নিত ভেক্টরের অবস্থানে কার্যকর করা হয়। এটিতে সাধারণত বিঘ্নিত রুটিন যেখানে সরাসরি আরও একটি 3 টি চক্র থাকে সেখানে লাফ দেয়। সংকলক দ্বারা উত্পাদিত কোড পরীক্ষা করে দেখা যায় যে "আইএসআর" ঘোষণার সাহায্যে কোনও আইএসআর কার্যকর করতে প্রায় 2.625 take সেবন করতে পারে, এবং কোড নিজেই যা কিছু করে। সঠিক পরিমাণ নির্ভর করে যে কতগুলি রেজিস্টার সংরক্ষণ এবং পুনরুদ্ধার করা দরকার on সর্বনিম্ন পরিমাণ হবে 1.1875 .s।

বাহ্যিক বাধা (যেখানে আপনি সংযুক্তি ব্যবহার করেন) আরও কিছু করেন এবং মোট 5.125 ডিগ্রি নেন (একটি 16 মেগাহার্জ ঘড়ি নিয়ে চলছে)।


প্রসেসরের কোনও আইএসআর প্রবেশ করা কতক্ষণ আগে?

এটি কিছুটা ভিন্ন হয়। উপরে বর্ণিত পরিসংখ্যানগুলি আদর্শ এমন যেখানে বাধা অবিলম্বে প্রক্রিয়া করা হয়। কয়েকটি কারণ এতে বিলম্ব করতে পারে:

  • প্রসেসরটি ঘুমিয়ে থাকলে, সেখানে "জেগে উঠুন" সময় নির্ধারিত হয়, যা বেশ কয়েক মিলি সেকেন্ড হতে পারে, যখন ঘড়ির গতিবেগকে আবার গতিবেগিত করা হয়। এই সময়টি ফিউজ সেটিংসের উপর নির্ভর করবে এবং ঘুম কত গভীর।

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

  • কিছু কোড বাধা বন্ধ করে দেয়। উদাহরণস্বরূপ, কলকে মিলিস () সংক্ষেপে বিঘ্ন বন্ধ করে দেয়। সুতরাং একটি বাধা সার্ভিস করার সময় সময় বাধা বন্ধ হয়ে যাওয়ার দৈর্ঘ্যের দ্বারা বাড়ানো হবে।

  • বাধা কেবলমাত্র কোনও নির্দেশের শেষে পরিবেশন করা যেতে পারে, সুতরাং যদি কোনও বিশেষ নির্দেশ যদি তিনটি ঘড়ি চক্র নেয়, এবং সবে শুরু হয়েছে, তবে বাধা কমপক্ষে কয়েক ঘন্টা চক্রের ক্ষেত্রে বিলম্বিত হবে।

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

  • যেহেতু বাধাগুলির একটি অগ্রাধিকার থাকে তাই আপনার আগ্রহী বাধা দেওয়ার আগে একটি উচ্চ-অগ্রাধিকারের বাধা দেওয়া যেতে পারে।


পারফরম্যান্স বিবেচনা

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


বাধা কীভাবে সারিবদ্ধ?

দুটি ধরণের বাধা রয়েছে:

  • কিছু একটি পতাকা সেট করে এবং তাদের অগ্রাধিকার ক্রমে পরিচালনা করা হয়, এমনকি যদি তাদের ইভেন্টটি বন্ধ হয়ে যায়। উদাহরণস্বরূপ, পিন ডি 2 এ একটি উত্থান, পতন বা পরিবর্তনের স্তর বাধাদান।

  • অন্যরা কেবল তখনই পরীক্ষা করা হয় যদি তারা "এখনই" ঘটছে। উদাহরণস্বরূপ, পিন ডি 2 এ একটি নিম্ন-স্তরের বাধা।

যেগুলি পতাকা সেট করে থাকে সেগুলি সারিবদ্ধ হিসাবে গণ্য হতে পারে, যেহেতু বাধা রুটিন প্রবেশের সময় অবধি বিঘ্নিত পতাকাটি স্থির থাকে, সেই সময় প্রসেসর পতাকা সাফ করে। অবশ্যই, কেবলমাত্র একটি পতাকা রয়েছে, যদি প্রথমটি প্রক্রিয়া করার আগে একই বিঘ্নিত পরিস্থিতি আবার ঘটে, তবে এটি দুটিবার পরিবেশন করা হবে না।

সচেতন হওয়ার মতো কিছু হ'ল আপনি বাধা হ্যান্ডলারটি সংযুক্ত করার আগে এই পতাকাগুলি সেট করা যেতে পারে। উদাহরণস্বরূপ, পিন ডি 2-তে একটি উঠতি বা পতনের স্তরের বাধাকে "পতাকাঙ্কিত" করা সম্ভব হবে, এবং তারপরে আপনি কোনও সংযুক্তি করার সাথে সাথে অবিলম্বে বাধা ফেলা শুরু করে, এমনকি ঘটনাটি এক ঘন্টা আগে ঘটে থাকলেও। এটি এড়াতে আপনি ম্যানুয়ালি পতাকা সাফ করতে পারেন। উদাহরণ স্বরূপ:

EIFR = bit (INTF0);  // clear flag for interrupt 0
EIFR = bit (INTF1);  // clear flag for interrupt 1

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


আইএসআর লেখার ইঙ্গিত

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

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

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

একটি পরীক্ষা দেখায় যে, 16 মেগাহার্টজ এটমেগ 328 প্রসেসরে, মাইক্রোতে কল আসতে () 3.5625 µ সেবন করে। মিলিতে একটি কল () লাগে 1.9375 µ সে। বর্তমান টাইমার মান রেকর্ডিং (সংরক্ষণ করা) একটি আইএসআর-এ করা যুক্তিসঙ্গত জিনিস। বিলম্বিত মিলিসেকেন্ডগুলি সন্ধান করা অতিবাহিত মাইক্রোসেকেন্ডের চেয়ে দ্রুত (মিলিসেকেন্ড গণনাটি কেবল একটি ভেরিয়েবল থেকে পুনরুদ্ধার করা হয়)। তবে মাইক্রোসেকেন্ড গণনাটি টাইমার 0 টাইমারের বর্তমান মান যুক্ত করে প্রাপ্ত করা হবে (যা ক্রমবর্ধমান রাখবে) একটি সংরক্ষিত "টাইমার 0 ওভারফ্লো গণনা" এ যুক্ত করুন।

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

  • দেরি করার চেষ্টা করবেন না, যেমন: delay (100);
  • আপনি কল থেকে মিলিতে সময় পেতে পারেন তবে তা বাড়বে না, তাই এটি বাড়ার জন্য অপেক্ষা করে দেরি করার চেষ্টা করবেন না।
  • সিরিয়াল প্রিন্টগুলি করবেন না (উদাঃ Serial.println ("ISR entered");)
  • সিরিয়াল পড়ার চেষ্টা করবেন না।

পিন পরিবর্তন বাধা দেয়

পিনগুলিতে আপনি বাহ্যিক ইভেন্টগুলি সনাক্ত করতে পারেন এমন দুটি উপায়। প্রথমটি হ'ল বিশেষ "বাহ্যিক বাধা" পিন, ডি 2 এবং ডি 3। এই সাধারণ বিঘ্নিত বাধা ইভেন্টগুলি, প্রতি পিনে একটি। আপনি প্রতিটি পিনের জন্য সংযুক্তি আন্তঃবিধ ব্যবহার করে তাদের কাছে যেতে পারেন। আপনি বাধাদানের জন্য একটি উত্থান, পতন, পরিবর্তন বা নিম্ন-স্তরের শর্ত নির্দিষ্ট করতে পারেন।

তবে সমস্ত পিনের জন্য "পিন চেঞ্জ" বাধা রয়েছে (এটমেগা 328 এ, অন্যান্য প্রসেসরের সমস্ত পিন অগত্যা নয়)। এগুলি পিনের গ্রুপগুলিতে কাজ করে (D0 থেকে D7, D8 থেকে D13 এবং A0 থেকে A5)। বাহ্যিক ইভেন্ট বাধাদানের চেয়ে এগুলিও কম অগ্রাধিকার। তবে তারা বাহ্যিক বিঘ্নগুলির চেয়ে কিছুটা মজাদারভাবে ব্যবহার করতে পারে কারণ তাদের ব্যাচে বিভক্ত করা হয়েছে। সুতরাং বাধা আগুনগুলি যদি আপনার নিজের কোডটিতে কাজ করতে হয় তবে ঠিক কোন পিনটি বিঘ্ন ঘটায়।

উদাহরণ কোড:

ISR (PCINT0_vect)
 {
 // handle pin change interrupt for D8 to D13 here
 }  // end of PCINT0_vect

ISR (PCINT1_vect)
 {
 // handle pin change interrupt for A0 to A5 here
 }  // end of PCINT1_vect

ISR (PCINT2_vect)
 {
 // handle pin change interrupt for D0 to D7 here
 }  // end of PCINT2_vect


void setup ()
  {
  // pin change interrupt (example for D9)
  PCMSK0 |= bit (PCINT1);  // want pin 9
  PCIFR  |= bit (PCIF0);   // clear any outstanding interrupts
  PCICR  |= bit (PCIE0);   // enable pin change interrupts for D8 to D13
  }

একটি পিন পরিবর্তন বাধা হ্যান্ডেল করতে আপনার প্রয়োজন:

  • গ্রুপে কোন পিনটি নির্দিষ্ট করুন। এটি পিসিএমএসকেএন ভেরিয়েবল (যেখানে নীচের টেবিল থেকে এন 0, 1 বা 2 হয়)। আপনার একাধিক পিনে বাধা থাকতে পারে।
  • বাধা যথাযথ গ্রুপ সক্ষম করুন (0, 1 বা 2)
  • উপরোক্ত হিসাবে বাধা হ্যান্ডলার সরবরাহ করুন

পিনের সারণী -> পিন পরিবর্তন নাম / মাস্ক

D0    PCINT16 (PCMSK2 / PCIF2 / PCIE2)
D1    PCINT17 (PCMSK2 / PCIF2 / PCIE2)
D2    PCINT18 (PCMSK2 / PCIF2 / PCIE2)
D3    PCINT19 (PCMSK2 / PCIF2 / PCIE2)
D4    PCINT20 (PCMSK2 / PCIF2 / PCIE2)
D5    PCINT21 (PCMSK2 / PCIF2 / PCIE2)
D6    PCINT22 (PCMSK2 / PCIF2 / PCIE2)
D7    PCINT23 (PCMSK2 / PCIF2 / PCIE2)
D8    PCINT0  (PCMSK0 / PCIF0 / PCIE0)
D9    PCINT1  (PCMSK0 / PCIF0 / PCIE0)
D10   PCINT2  (PCMSK0 / PCIF0 / PCIE0)
D11   PCINT3  (PCMSK0 / PCIF0 / PCIE0)
D12   PCINT4  (PCMSK0 / PCIF0 / PCIE0)
D13   PCINT5  (PCMSK0 / PCIF0 / PCIE0)
A0    PCINT8  (PCMSK1 / PCIF1 / PCIE1)
A1    PCINT9  (PCMSK1 / PCIF1 / PCIE1)
A2    PCINT10 (PCMSK1 / PCIF1 / PCIE1)
A3    PCINT11 (PCMSK1 / PCIF1 / PCIE1)
A4    PCINT12 (PCMSK1 / PCIF1 / PCIE1)
A5    PCINT13 (PCMSK1 / PCIF1 / PCIE1)

বাধা হ্যান্ডলার প্রক্রিয়াজাতকরণ

বাধা হ্যান্ডলারটি কাজ করতে হবে যে মুখোশটি যদি একের অধিক নির্দিষ্ট করে (উদাহরণস্বরূপ যদি আপনি ডি 8 / ডি 9 / ডি 10-এ বিঘ্নিত করতে চান) তবে কোন পিনটি বাধা সৃষ্টি করেছে caused এটি করার জন্য আপনাকে সেই পিনের পূর্বের অবস্থাটি সংরক্ষণ করতে হবে এবং যদি এই নির্দিষ্ট পিনটি পরিবর্তিত হয় তবে (ডিজিটালরিড বা অনুরূপ করে) কাজ করা উচিত।


আপনি সম্ভবত যে কোনওভাবে বাধা ব্যবহার করছেন ...

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

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


বাধা সক্ষম করার পরে পরবর্তী নির্দেশ কার্যকর করা

আরডুইনো ফোরামে কিছুটা আলোচনা এবং গবেষণা করার পরে, আপনি বাধা সক্ষম করার পরে কী ঘটে তা আমরা স্পষ্ট করে জানিয়েছি। আমি তিনটি প্রধান উপায় এটি ভাবতে পারি যে আপনি বাধা সক্ষম করতে পারেন, যা আগে সক্ষম ছিল না:

  sei ();  // set interrupt enable flag
  SREG |= 0x80;  // set the high-order bit in the status register
  reti  ;   // assembler instruction "return from interrupt"

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

এটি আপনাকে এই জাতীয় কোড লিখতে দেয়:

sei ();
sleep_cpu ();

যদি এই গ্যারান্টিটির জন্য না হয় তবে প্রসেসরটি ঘুমানোর আগে বাধা আসতে পারে এবং তারপরে কখনও জাগ্রত হতে পারে না।


খালি বাধা দেয়

আপনি যদি কেবলমাত্র প্রসেসরটি জাগাতে কোনও বাধা চান, তবে বিশেষভাবে কিছু না করেন তবে আপনি EMPTY_INTERRUPT সংজ্ঞায়িত, উদাহরণস্বরূপ ব্যবহার করতে পারেন।

EMPTY_INTERRUPT (PCINT1_vect);

এটি কেবল একটি "রেটি" (বিঘ্নিত থেকে ফিরে) নির্দেশনা উত্পন্ন করে। যেহেতু এটি নিবন্ধগুলি সংরক্ষণ বা পুনরুদ্ধার করার চেষ্টা করে না এটি এটি জাগ্রত করার জন্য কোনও বাধা পাওয়ার সবচেয়ে দ্রুততম উপায়।


সমালোচনা বিভাগ (পারমাণবিক পরিবর্তনশীল অ্যাক্সেস)

ভেরিয়েবল সম্পর্কিত কিছু সূক্ষ্ম সমস্যা রয়েছে যা বিঘ্নিত পরিষেবা রুটিনগুলি (আইএসআর) এবং প্রধান কোড (এটি, কোডটি কোনও আইএসআরে নয়) এর মধ্যে ভাগ করা হয়।

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

প্রথম ... আপনি কখন "অস্থির" ভেরিয়েবল ব্যবহার করবেন?

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

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

যেমন।

volatile int counter;

কোনও পরিবর্তনশীলটিকে অস্থির হিসাবে চিহ্নিত করা সংকলকটিকে প্রসেসরের রেজিস্ট্রারে ভেরিয়েবলের বিষয়বস্তু "ক্যাশে" না করতে বলার দরকার হয়, তবে যখন প্রয়োজন হয় তখন সর্বদা স্মৃতি থেকে পড়ুন। এটি প্রক্রিয়াকরণটি কমিয়ে দিতে পারে, এজন্য প্রয়োজন নেই যখন আপনি কেবল প্রতিটি পরিবর্তনশীলকে অস্থির করে তুলেন না।

একটি উদ্বায়ী ভেরিয়েবল অ্যাক্সেস করার সময় বাধা বন্ধ করুন

উদাহরণস্বরূপ, countকিছু সংখ্যার সাথে তুলনা করতে, তুলনা চলাকালীন বিঘ্নগুলি বন্ধ করুন যদি এক বাইটের countISR দ্বারা আপডেট করা হয় এবং অন্য বাইট না করে।

volatile unsigned int count;

ISR (TIMER1_OVF_vect)
  {
  count++;
  } // end of TIMER1_OVF_vect

void setup ()
  {
  pinMode (13, OUTPUT);
  }  // end of setup

void loop ()
  {
  noInterrupts ();    // <------ critical section
  if (count > 20)
     digitalWrite (13, HIGH);
  interrupts ();      // <------ end critical section
  } // end of loop

ডাটা শিট পড়ুন!

প্রসেসরের ডেটা শীট থেকে বিঘ্ন, টাইমার ইত্যাদি সম্পর্কে আরও তথ্য পাওয়া যাবে।

http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf


আরও উদাহরণ

স্থান বিবেচনা (পোস্ট আকার সীমা) আমার আরও উদাহরণ কোডের তালিকা প্রতিরোধ করে। আরও উদাহরণ কোডের জন্য আমার পৃষ্ঠা বাধা সম্পর্কে দেখুন ।


একটি খুব দরকারী রেফারেন্স - এটি একটি চিত্তাকর্ষক দ্রুত উত্তর ছিল।
ডেটা হান ব্যাগ

এটি একটি রেফারেন্স প্রশ্ন ছিল। আমার কাছে উত্তরটি প্রস্তুত ছিল এবং উত্তরটি খুব বেশি দীর্ঘ না হলে এটি আরও দ্রুততর হত, সুতরাং আমাকে এটি আবার ছাঁটাই করতে হয়েছিল। আরও তথ্যের জন্য লিঙ্কযুক্ত সাইটটি দেখুন।
নিক গ্যামন

"স্লিপ মোড" সম্পর্কে আরডুইনোকে 500 মিমি ঘুমানোর পক্ষে কী দক্ষ?
ডেটা হা

@ নিক গ্যামন আমার ধারণা, সিপিইউর জন্য শক্তিটি চালু বা বন্ধ (অটোমেশন বা না দিয়ে) একটি অপ্রচলিত বাধা হিসাবে সংজ্ঞায়িত করা যেতে পারে - আপনি যদি এটি করতে চান তবে। "আমার কাছে উত্তরটি প্রস্তুত ছিল" - আপনি এই মুহুর্তের সমস্ত যাদুটি বের করে ফেললেন আমার মনে হয়েছিল এটি ছিল।
ডেটা হান ব্যাগ

1
আমি ভীত যে সত্য নয়। আমার কাছে একটি উদাহরণ রয়েছে যা পাওয়ার-ডাউন মোড থেকে উঠতে পিন পরিবর্তন বিঘ্ন ব্যবহার করে। এছাড়াও আমি আমার পৃষ্ঠায় বাধা সম্পর্কে উল্লেখ করেছি বলে আটমেল নিশ্চিত করেছে যে কোনও বাহ্যিক বাধা প্রসেসরকে জাগিয়ে তুলবে (উদা / পতন / পরিবর্তন এবং নিম্ন)।
নিক গ্যামন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.