কর্টেক্স (এআরএম) মাইক্রোকন্ট্রোলারগুলিতে ডাব্লুএফআই (ওয়েট-ফর-ইন্টারপ্ট) এর জন্য সেরা প্যাটার্ন


18

আমি ইএফএম গেকো নিয়ন্ত্রকগুলি (http://energymicro.com/) ব্যবহার করে ব্যাটারি চালিত সফ্টওয়্যারটি বিকাশ করতে চাইছি এবং নিয়ন্ত্রকটি ঘুমানোর জন্য চাইবেন যখনই এটির জন্য কার্যকর কিছু নেই। ডাব্লুএফআই (ইন্টারপ্রেটের জন্য অপেক্ষা করুন) নির্দেশাবলী এই উদ্দেশ্যে ব্যবহৃত হয়; এটি কোনও প্রকার বাধাগ্রস্ত না হওয়া অবধি প্রসেসরটিকে ঘুমাতে দেবে।

যদি ঘুম কোথাও কোনও কিছু সঞ্চয় করে রাখে, তবে লোড-এক্সক্লুসিভ / স্টোর-এক্সক্লুসিভ ক্রিয়াকলাপগুলি এমন কিছু করতে ব্যবহার করতে পারে:

  // ড্যান্ট_স্লিপ 2 এর সাথে লোড হয়ে যায় যে কোনও সময় এটি ঘটে
  // কমপক্ষে একবারে প্রধান লুপটিকে চক্র করতে বাধ্য করা উচিত। যদি বাধা দেয়
  // ঘটে যা নিম্নলিখিত বিবৃতি চলাকালীন এটি 2 এ রিসেট হয়ে যায়,
  // আচরণ এমন হবে যেন এর পরে বাধা ঘটেছে।

  store_exclusive (লোড_ এক্সক্লুসিভ (ডান_স্লিপ) >> 1);

  যখন (! dont_sleep)
  {
    // পরবর্তী বিবৃতি এবং store_exclusive এর মধ্যে যদি বাধা ঘটে তবে ঘুমোবেন না
    load_exclusive (SLEEP_TRIGGER);
    যদি (! না ঘুমো)             
      store_exclusive (SLEEP_TRIGGER);
  }

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

  যদি (! না ঘুমো)
    WFI ();

'if' এবং 'wfi' এর মধ্যে একটি বাধা সৃষ্টি হতে পারে এবং স্লিপ না ঘুমানোর ঝুঁকিটি চালায়, তবে ডাব্লুএইচপি আরও এগিয়ে যেতে পারে এবং যাইহোক কার্যকর করতে পারে। এটি প্রতিরোধের সেরা প্যাটার্নটি কী? ডাব্লুএফআই চালানোর ঠিক আগে প্রসেসরের বাধা রোধ করতে প্রাইমস্ককে 1 এ সেট করুন এবং এরপরেই সাফ করবেন? নাকি এর থেকে আরও ভাল কৌশল আছে?

সম্পাদনা

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

  যদি (ঘুম না)
    Sev (); / * নিম্নলিখিত ডাব্লুএফই পরিষ্কার ইভেন্ট পতাকা তৈরি করবে কিন্তু ঘুমাবে না * /
  WFE ();

প্রতিটি বিঘ্নিত যা ঘুমোচ্ছে না সেটগুলিও একটি এসইভি নির্দেশ কার্যকর করতে হবে, সুতরাং "যদি" পরীক্ষার পরে যদি বাধা ঘটে তবে ডাব্লুএফইই ইভেন্টের পতাকা সাফ করবে তবে ঘুমাতে যাবে না। ভালো দৃষ্টান্তের মতো শব্দটি কি শোনাচ্ছে?


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

@ মার্ক: সমস্যাটি হ'ল যদি "যদি (! ডান_স্লিপ)" এবং "ডাব্লুএফআই" এর মধ্যে একটি বাধা নেওয়া হয়, ডাব্লুএফআই বাস্তবায়িত হয় তখন বাধা শর্তটি আর মুলতুবি থাকে না, তবে বাধাগ্রস্থ থাকতে পারে না কারণ ঘুম এমন কিছু করেছিলেন যা অন্য লৌকিক চলমান মূল লুপকে ন্যায়সঙ্গত করে তুলবে। আমার সাইপ্রেস পিএসওসি অ্যাপ্লিকেশনটিতে, কোনও মূল বা লাইন কোডটি ঘুমানোর সময় বাধা দেওয়ার কারণে বাধা দেওয়ার কারণে স্ট্যাকের সাথে সংযোগ স্থাপন করতে পারে, তবে এটি বেশ আইকি বলে মনে হয় এবং আমি বুঝতে পারি যে এআরএম এই জাতীয় স্ট্যাক ম্যানিপুলেশনগুলিকে নিরুৎসাহিত করে।
সুপারক্যাট

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

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

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

উত্তর:


3

আমি dont_sleepজিনিসটি পুরোপুরি বুঝতে পারি নি , তবে একটি জিনিস যা আপনি চেষ্টা করতে পারেন তা হ'ল পেন্ডসভি হ্যান্ডলারের "মূল কাজ" করুন, এটি সর্বনিম্ন অগ্রাধিকারে সেট করুন। তারপরে প্রতি বার কিছু করার প্রয়োজন হলে কেবল অন্যান্য হ্যান্ডলারের কাছ থেকে একটি পেন্ডএসভি শিডিউল করুন। এটি কীভাবে করবেন তা এখানে দেখুন (এটি এম 1 এর জন্য তবে এম 3 খুব আলাদা নয়)।

আপনি ব্যবহার করতে পারেন এমন আরও একটি জিনিস (সম্ভবত পূর্বের পদ্ধতির সাথে একসাথে) হ'ল স্লিপ অন-এক্সিট বৈশিষ্ট্য। আপনি যদি এটি সক্ষম করে থাকেন তবে আপনাকে ডাব্লুএফআই কল না করে প্রসেসরটি শেষ আইএসআর হ্যান্ডলারটি থেকে বেরিয়ে আসার পরে ঘুমাতে যাবে। এখানে কিছু উদাহরণ দেখুন ।


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

1
@ মার্ক আমি অবশ্যই ডক্সে সেই বিটটি মিস করেছি, এটি সম্পর্কে আপনার কিছু লিঙ্ক / পয়েন্টার রয়েছে? মূল জেগে ওঠা বাধা সংকেতের কি হবে? বিঘ্ন পুনরায় সক্ষম না করা পর্যন্ত এটি কী স্থির থাকে?
ইগোর স্কোচিনস্কি

এ এস এম সহায়িকা এখানে: infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489c/... বল্কল-M3 জন্য আরও সুনির্দিষ্ট তথ্য এখানে: infocenter.arm.com/help/ index.jsp? টপিক = / com.arm.doc.dui0552a /… সংক্ষেপে যখন কোনও মুখোশযুক্ত বাধা বিঘ্নিত হয়ে পড়ে তখন কোর জেগে ওঠে এবং ডাব্লুএফআইয়ের নির্দেশের পরে ক্রিয়াকলাপ চালিয়ে যায়। যদি আপনি মুলতুবি বিঘ্নিত বাধা বিঘ্ন পরিষ্কার না করেই আরেকটি ডাব্লুএফআই জারির চেষ্টা করে থাকেন তবে ডাব্লুএফআইআই একটি এনওপি হিসাবে কাজ করবে (ডাব্লুএফআইয়ের জাগ্রত শর্তটি সত্য বলে মূলটি ঘুমাবে না)।
চিহ্নিত করুন

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

10

এটি একটি সমালোচনা বিভাগের ভিতরে রাখুন। আইএসআরগুলি চলবে না, তাই আপনি ডাব্লুএফআইয়ের আগে ডান_স্লিপ পরিবর্তনের ঝুঁকিটি চালান না, তবে তারা এখনও প্রসেসরকে জাগিয়ে তুলবে এবং সমালোচনামূলক বিভাগটি শেষ হওয়ার সাথে সাথে আইএসআরগুলি কার্যকর করা হবে।

uint8 interruptStatus;
interruptStatus = EnterCriticalSection();
if (!dont_sleep)
  WFI();
ExitCriticalSection(interruptStatus);

আপনার বিকাশের পরিবেশের সম্ভবত সমালোচনামূলক বিভাগের কার্য রয়েছে তবে এটি প্রায় এর মতো:

এন্টারক্রিটিক্যালসেকশনটি হ'ল:

MRS r0, PRIMASK /* Save interrupt state. */
CPSID i /* Turn off interrupts. */
BX lr /* Return. */

এক্সিট ক্রিটিক্যালসেকশনটি হ'ল:

MSR PRIMASK, r0 /* Restore interrupt states. */
BX lr /* Return. */

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

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

1
@ কেনজি চিংড়ির উত্তরটি লিনাক্স আলোচনার সূত্রে নির্দেশ করে যা আমার আগের প্রশ্নের উত্তর দেয়। আমি তার উত্তরটি সম্পাদনা করেছিলাম এবং আপনার এটি স্পষ্ট করে জানাতে।
কর্নেলিউ জুজু

@ কর্নেলিউউজুজু আপনার নিজের আলোচনার জন্য অন্য কারও জবাব সম্পাদনা করা কোনও দুর্দান্ত ধারণা নয়। 'কেবলমাত্র লিঙ্ক' উত্তরটি উন্নত করতে উদ্ধৃতি যুক্ত করা আলাদা বিষয়। যদি আপনার জিতে আসল প্রশ্ন থাকে তবে এটি একটি প্রশ্ন হিসাবে জিজ্ঞাসা করুন এবং এটির সাথে লিঙ্ক করুন link
শন হোলিহানে

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

7

আপনার ধারণাটি ঠিক আছে, লিনাক্স ঠিক এটি প্রয়োগ করে। এখানে দেখুন ।

উপরের বর্ণিত আলোচনার থ্রেড থেকে দরকারী উক্তিটি ব্যাখ্যা করতে যে ডাব্লুএফআই এমনকি বাধা নিষ্ক্রিয় করেও কেন কাজ করে:

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

আপনার কোডটি কতটা ভাল তা বিবেচনা না করেই, যদি আপনি বাধাগুলি নিষ্ক্রিয় না করেন তবে আপনার ঘুমের প্রস্তুতি নেওয়া এবং প্রকৃতপক্ষে ঘুমাতে যাওয়ার মধ্যে সর্বদা একটি দৌড় থাকবে, যার ফলশ্রুতিতে ঘুম ভাঙার ঘটনা ঘটে in

এ কারণেই আমি যে সমস্ত এআরএম সিপিইউগুলি সম্পর্কে অবগত রয়েছি তারা মূল সিপিইউতে মুখোশ দেওয়া থাকলেও তারা জেগে উঠবে (সিপিএসআর আই বিট।)

অন্য যে কোনও কিছু এবং আপনার নিষ্ক্রিয় মোড ব্যবহার করা ভুলে যাওয়া উচিত।


1
আপনি ডাব্লুএফআই বা ডাব্লুএফই নির্দেশের সময় বাধা অক্ষম করার কথা উল্লেখ করছেন? এই উদ্দেশ্যে আপনি ডাব্লুএফআই বা ডাব্লুএফই ব্যবহার করার মধ্যে কোনও অর্থপূর্ণ পার্থক্য দেখছেন?
সুপারক্যাট

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

2

ধরে নিচ্ছি যে:

  1. মূল থ্রেড ব্যাকগ্রাউন্ড টাস্কগুলি চালায়
  2. বাধা কেবলমাত্র উচ্চ অগ্রাধিকারের কাজগুলি চালায় এবং কোনও পটভূমি কাজ করে না
  3. মূল থ্রেডটি যে কোনও সময় বাধা দেওয়া যায় (এটি সাধারণত বাধা দেয় না)

তারপরে সমাধানটি হ'ল পতাকাটির বৈধতা এবং ডাব্লুএফআইয়ের মধ্যে বাধা রোধ করতে PRIMASK ব্যবহার করা:

mask_interrupts();
if (!dont_sleep)
    wfi();
unmask_interrupts();

0

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


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

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