মাইক্রোকন্ট্রোলার এবং এফএসএম উদাহরণগুলিতে বিঘ্নিত হ্যান্ডলিং


9

প্রাথমিক প্রশ্ন

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

  • বিঘ্ন আগে বাধা নিষ্ক্রিয় করুন এবং তারপরে গুরুত্বপূর্ণ বিভাগের পরে তাদের পুনরায় সক্ষম করুন।
  • সংশ্লিষ্ট আইএসআর-এর অভ্যন্তরে একটি পতাকা লাগান এবং (বাধা নিষ্ক্রিয় করার পরিবর্তে) পতাকাটিকে সমালোচনামূলক বিভাগের আগে মিথ্যাতে সেট করুন এবং একে একে সত্যে পুনরায় সেট করুন after আইএসআর কোড কার্যকর করা থেকে রোধ করতে।
  • দুজনের কেউই নয়, তাই পরামর্শগুলি স্বাগত!

আপডেট: বাধা এবং রাষ্ট্রের চার্ট

আমি একটি নির্দিষ্ট পরিস্থিতি সরবরাহ করব। আসুন ধরে নেওয়া যাক আমরা একটি রাষ্ট্রীয় চার্ট প্রয়োগ করতে চাই, যা 4 টি ব্লক দ্বারা রচিত:

  1. স্থানান্তর / প্রভাব।
  2. প্রস্থান শর্ত
  3. প্রবেশের ক্রিয়াকলাপ।
  4. ক্রিয়াকলাপ করুন।

এক অধ্যাপক আমাদের এটাই বিশ্ববিদ্যালয়ে পড়িয়েছিলেন। সম্ভবত, এটি করার সর্বোত্তম উপায় নয় এই স্কিমটি অনুসরণ করে:

while(true) {

  /* Transitions/Effects */
  //----------------------------------------------------------------------
  next_state = current_state;

  switch (current_state)
  {
    case STATE_A:
      if(EVENT1) {next_state = STATE_C}
      if(d == THRESHOLD) {next_state = STATE_D; a++}
      break;
    case STATE_B:
      // transitions and effects
      break;
    (...)
  }

  /* Exit activity -> only performed if I leave the state for a new one */
  //----------------------------------------------------------------------
  if (next_state != current_state)
  {
    switch(current_state)
    {
      case STATE_A:
        // Exit activity of STATE_A
        break;
      case STATE_B:
        // Exit activity of STATE_B
        break;
        (...)
    }
  }

  /* Entry activity -> only performed the 1st time I enter a state */
  //----------------------------------------------------------------------
  if (next_state != current_state)
  {
    switch(next_state)
    {
      case STATE_A:
        // Entry activity of STATE_A
        break;
      case STATE_B:
        // Entry activity of STATE_B
        break;
      (...)
    }
  }

  current_state = next_state;

  /* Do activity */
  //----------------------------------------------------------------------
  switch (current_state)
  {
    case STATE_A:
      // Do activity of STATE_A
      break;
    case STATE_B:
      // Do activity of STATE_B
      break;
    (...)
  }
}

আসুন আমরাও ধরে নিই যে, বলুন STATE_A, আমি বাটনের সেট (ডিবাউস সিস্টেম ইত্যাদি) এর মধ্য থেকে আসা কোনও বাধার প্রতি সংবেদনশীল হতে চাই। যখন কেউ এই বোতামগুলির একটি টিপুন, একটি বাধা তৈরি করা হয় এবং ইনপুট পোর্ট সম্পর্কিত পতাকাটি একটি পরিবর্তনশীলতে অনুলিপি করা হয় buttonPressed। যদি কোনওভাবে ডেবিউন 200 এমএসে সেট করা থাকে (ওয়াচডগ টাইমার, টাইমার, কাউন্টার, ...) আমরা নিশ্চিত যে 200 এমএসের buttonPressedআগে কোনও নতুন মান দিয়ে আপডেট করা যাবে না। এটিই আমি আপনাকে জিজ্ঞাসা করছি (এবং নিজেকে :) অবশ্যই)

আমার কি ডিও ক্রিয়াকলাপে বাধা STATE_Aদেওয়ার এবং ছাড়ার আগে অক্ষম করার দরকার আছে?

/* Do activity */
//-------------------------------------
switch (current_state)
{
  case STATE_A:
    // Do activity of STATE_A
    Enable_ButtonsInterrupt(); // and clear flags before it
    // Do fancy stuff and ...
    // ... wait until a button is pressed (e.g. LPM3 of the MSP430)
    // Here I have my buttonPressed flag ready!
    Disable_ButtonsInterrupt();
    break;
  case STATE_B:
    // Do activity of STATE_B
    break;
  (...)
}

একটি উপায় যে আমি নিশ্চিত যে পরবর্তী পুনরাবৃত্তিতে এ পরবর্তী সময় আমি execxute ব্লক 1 (রূপান্তরটি / প্রভাব) আমি নিশ্চিত যে অবস্থার পরিবর্তনের বরাবর পরীক্ষা করা am পরবর্তী বিঘ্ন পূর্ববর্তী মূল্য আছে ওভাররাইট থেকে আসছে নেই am সালে buttonPressedযে আমি প্রয়োজন (যদিও এটি অসম্ভব যে কারণ এটি ঘটতে পারে কারণ 250 এমএস অবশ্যই বয়ে যেতে পারে)।


3
আপনার পরিস্থিতি সম্পর্কে আরও না জেনে একটি সুপারিশ করা শক্ত। তবে এম্বেড থাকা সিস্টেমে কখনও কখনও বাধা নিষ্ক্রিয় করা প্রয়োজন। বাধা কেবল অল্প সময়ের জন্য অক্ষম রাখা বাঞ্ছনীয় যাতে যাতে বাধা না যায়। সমস্ত বাধা না দিয়ে কেবলমাত্র নির্দিষ্ট বাধা অক্ষম করা সম্ভব। আপনার বর্ণিত পতাকা-অভ্যন্তরীণ-আইএসআর কৌশলটি আমি কখনও স্মরণ করতে পারি না তাই এটিই আপনার সেরা সমাধান কিনা তা নিয়ে আমি সংশয়ী।
kkrambo

উত্তর:


17

প্রথম কৌশলটি সামগ্রিক ফার্মওয়্যারটি স্থপতি করা যাতে কোনও সময়ে বাধা আসার জন্য এটি ঠিক for বিঘ্নগুলি বন্ধ করে রাখা যাতে অগ্রভাগের কোডটি পারমাণবিক ক্রম চালাতে পারে অল্প পরিমাণে। এর চারপাশে প্রায়শই কোনও স্থাপত্য পদ্ধতি রয়েছে।

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

মনে রাখবেন যে যদি না আপনি চক্র বা মেমরির অবস্থানগুলিতে (অবশ্যই ঘটতে পারেন) কঠোর না হন, অন্যথায় আপনি কোডটির স্পষ্টতা এবং রক্ষণাবেক্ষণের জন্য অনুকূলিত করতে চান। উদাহরণস্বরূপ, যদি আপনার কাছে 16 বিট মেশিন থাকে যা একটি ঘড়ির টিক বিঘ্নিত 32 বিট কাউন্টার আপডেট করে, আপনি নিশ্চিত করতে হবে যে অগ্রভাগের কোডটি যখন কাউন্টারটি পড়বে তখন এর দুটি অংশটি সামঞ্জস্যপূর্ণ। একটি উপায় হ'ল বিঘ্ন বন্ধ করা, দুটি শব্দ পড়া এবং তারপরে আবার বাধা চালু করা। যদি বাধা বিচ্ছিন্নতা সমালোচনা না করে, তবে এটি পুরোপুরি গ্রহণযোগ্য।

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

অথবা, পতাকার পরিবর্তে এক-শব্দের কাউন্টার ব্যবহার করুন। অগ্রভাগের কোডটি পৃথক পরিবর্তনশীল রাখে যাতে এটিতে সিস্টেমটি আপডেট করে এমন সর্বশেষ কাউন্টার থাকে counter এটি একবারে কয়টি টিককে পরিচালনা করতে হবে তা নির্ধারণের জন্য এটি সংরক্ষণ করা মানকে লাইভ কাউন্টার থেকে একটি স্বাক্ষরযুক্ত বিয়োগফল করে। এটি অগ্রভাগের কোডটি একবারে 2 টি এন -1 ইভেন্ট মিস করতে দেয় , যেখানে এনএলু আঞ্চলিকভাবে হ্যান্ডল করতে পারে এমন একটি স্থানীয় শব্দে বিটের সংখ্যা।

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


7

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

এইভাবে বাধাগুলি নিষ্ক্রিয় করা, যা একক প্রসেসর নির্দেশের দ্বারা সর্বাধিক পরিচালিত হয় (এবং এটি একটি সংকলক অভ্যন্তরীণ ফাংশন ব্যবহার করে বলা হয়), এটি আপনি নিতে পারেন এমন সবচেয়ে নিরাপদ বেট।

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

যদি আপনার সমালোচনামূলক বিভাগটি কার্যকর করা হয় না তবে কেবলমাত্র একটি বাধা প্রয়োজন, তবে অন্যটি কার্যকর করা উচিত, অন্য পদ্ধতির ব্যবহারযোগ্য বলে মনে হচ্ছে।

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

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


5

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

সংশ্লিষ্ট আইএসআর-এর অভ্যন্তরে একটি পতাকা লাগান এবং (বাধা নিষ্ক্রিয় করার পরিবর্তে) পতাকাটিকে সমালোচনামূলক বিভাগের আগে মিথ্যাতে সেট করুন এবং একে একে সত্যে পুনরায় সেট করুন after আইএসআর কোড কার্যকর করা থেকে রোধ করতে।

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

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

ফ্ল্যাগ ওয়েটি করার এটির মূল সমস্যাটি হ'ল আপনি কোনওভাবে বাধা কার্যকর করবেন না - যা পরবর্তীকালে ফলাফল হতে পারে। বেশিরভাগ মাইক্রোকন্ট্রোলাররা বিশ্বব্যাপী বাধা নিষ্ক্রিয় হওয়ার পরেও বাধা পতাকাগুলি ট্র্যাক করবে এবং আপনি যখন বাধা পুনরায় সক্ষম করবেন তখন বাধা কার্যকর করবে:

  • সমালোচনামূলক বিভাগের সময় যদি কোনও বাধা ঘটে না, তার পরে কোনওটিই কার্যকর করা হয় না।
  • সমালোচনামূলক বিভাগের সময় যদি কোনও বাধা ঘটে থাকে তবে তার পরে একটি কার্যকর করা হয়।
  • সমালোচনামূলক বিভাগের সময় যদি একাধিক বাধা ঘটে থাকে তবে তার পরে কেবল একটি কার্যকর করা হয়।

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

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

এটি এমন একটি খুব, খুব কম পরিস্থিতি বাদ দেওয়া উচিত যেখানে আপনার একটি নিরবচ্ছিন্ন কোড বিভাগের প্রয়োজন হতে পারে।


আমি যে পরিস্থিতিতে কাজ করছি তার পরিস্থিতিটি আরও ভালভাবে ব্যাখ্যা করার জন্য পোস্টটি আপডেট করেছি :)
উম্বের্তো ডি

1
আপনার উদাহরণ কোডে, আমি যখন প্রয়োজন হবে না তখন নির্দিষ্ট বাটনটি বিঘ্নিত নিষ্ক্রিয় করার বিষয়টি বিবেচনা করব এবং প্রয়োজনে এটি সক্ষম করব enable এটি প্রায়শই করা ডিজাইন দ্বারা এটি কোনও সমস্যা নয়। গ্লোবাল বাধা ত্যাগ করুন যাতে প্রয়োজনে আপনি পরে কোডে অন্যান্য বাধা যুক্ত করতে পারেন। অন্যথায়, আপনি যখন রাজ্য A তে যান তখন কেবল পতাকাটি পুনরায় সেট করুন এবং অন্যথায় এটি উপেক্ষা করুন। যদি বোতামটি টিপানো হয় এবং পতাকা সেট করা হয় তবে কে যত্ন করে? আপনি রাষ্ট্র এ ফিরে না আসা পর্যন্ত এটিকে উপেক্ষা করুন
অ্যাডাম ডেভিস

হ্যাঁ! এটি একটি সমাধান হতে পারে কারণ আসল নকশায় আমি প্রায়শই এলপিএম 3 (এমএসপি 430) এ বৈশ্বিক বাধা সক্ষম করে থাকি এবং আমি এলপিএম 3 থেকে প্রস্থান করি, কার্যকর হওয়া আবার শুরু হয়, সাথে সাথে কোনও বাধা সনাক্ত করা যায়। সুতরাং একটি সমাধান হ'ল আপনি যা উপস্থাপন করেছেন যা আমি মনে করি কোডের দ্বিতীয় অংশে প্রতিবেদন করা হয়েছে: একটি রাষ্ট্রের প্রয়োজনের ক্রিয়াকলাপটি শুরু করা মাত্রই বাধা সক্ষম করুন এবং ট্রানজিশনস ব্লকে যাওয়ার আগে অক্ষম করব। অন্য কোনও সম্ভাব্য সমাধানটি "ক্রিয়াকলাপটি ব্লক করুন" ছাড়ার আগে বাধা নিষ্ক্রিয় করা এবং কিছুক্ষণ (কখন?) পরে পুনরায় সক্ষম করা উচিত?
উম্বের্তো ডি

1

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

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


0

আপনার বিবেচনায় নেওয়া দরকার এমন একটি সূক্ষ্ম পার্থক্য। আপনি বাধা বা "উপেক্ষা" এবং বাধা হ্যান্ডলিং "বিলম্ব" চয়ন করতে পারেন।

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

কখনও কখনও আমরা বাধা উপেক্ষা করতে চাই। সর্বোত্তম উপায় হ'ল হার্ডওয়্যার স্তরে বাধা রোধ করা। প্রায়শই একটি বিঘ্নিত নিয়ন্ত্রক বা অনুরূপ থাকে যেখানে আমরা বলতে পারি কোন ইনপুটগুলিতে বাধা সৃষ্টি করা উচিত।

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