কিভাবে এআরএম কর্টেক্স এ 9-তে সমালোচনা বিভাগগুলি প্রয়োগ করা যায়


15

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

আমার সমালোচনা বিভাগগুলি এই সিপিইউর জন্য সঠিকভাবে প্রয়োগ করা যেতে পারে না তা দেখার জন্য আমার পদ্ধতির বিষয়ে কিছু প্রতিক্রিয়া চাই want আমি জিসিসি ব্যবহার করছি আমার সন্দেহ আছে যে এখানে কিছু সূক্ষ্ম ত্রুটি রয়েছে।

এছাড়াও, এমন কোনও ওপেনসোর্স লাইব্রেরি রয়েছে যেটিতে এআরএম (বা এমনকি ভাল লাইটওয়েট স্পিনলক / সেমফোর লাইব্রেরি) রয়েছে?

#define ARM_INT_KEY_TYPE            unsigned int
#define ARM_INT_LOCK(key_)   \
asm volatile(\
    "mrs %[key], cpsr\n\t"\
    "orr r1, %[key], #0xC0\n\t"\
    "msr cpsr_c, r1\n\t" : [key]"=r"(key_) :: "r1", "cc" );

#define ARM_INT_UNLOCK(key_) asm volatile ("MSR cpsr_c,%0" : : "r" (key_))

কোডটি নিম্নরূপ ব্যবহৃত হয়েছে:

/* lock interrupts */
ARM_INT_KEY_TYPE key;
ARM_INT_LOCK(key);

<access registers, shared globals, etc...>

ARM_INT_UNLOCK(key);

"কী" এর ধারণাটি হল নেস্টেড সমালোচনা বিভাগগুলি মঞ্জুরি দেওয়া এবং এগুলি পুনরায় অনুবর্তনকারী কার্যগুলি তৈরি করতে ফাংশনের শুরু এবং শেষের দিকে ব্যবহৃত হয়।

ধন্যবাদ!


1
দয়া করে infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dht0008a/… উল্লেখ করুন এটি এমবেডড asm বিটিডব্লুতে করবেন না। নিবন্ধ হিসাবে এটি একটি ফাংশন করুন।
জেসন হু

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

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

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

আমি বেশ নিশ্চিত যে আপনার এটি ব্যবহার ldrexএবং strexসঠিকভাবে করার প্রয়োজন হবে। স্পিনলক কীভাবে ব্যবহার করতে হয় এবং কীভাবে প্রয়োগ করতে হয় তা এখানে একটি ওয়েবপৃষ্ঠা আপনাকে দেখায় । ldrexstrex

উত্তর:


14

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

int32_t atomic_swap(int32_t *dest, int32_t new_value)
{
  int32_t old_value;
  do
  {
    old_value = __LDREXW(&dest);
  } while(__STREXW(new_value,&dest);
  return old_value;
}

উপরের মত একটি ফাংশন দেওয়া, কেউ সহজেই এর মতো কিছু মাধ্যমে সহজেই একটি মিটেক্স প্রবেশ করতে পারে

if (atomic_swap(&mutex, 1)==0)
{
   ... do stuff in mutex ... ;
   mutex = 0; // Leave mutex
}
else
{ 
  ... couldn't get mutex...
}

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

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

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

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


7

সমালোচনামূলক বিভাগগুলি করার এটি একটি ভারী হাতের উপায়; বাধা অক্ষম করুন। যদি আপনার সিস্টেমে ডেটা ত্রুটিগুলি / পরিচালনা করে তবে এটি কাজ করতে পারে না। এটি বিঘ্নিত বিলম্বকে আরও বাড়িয়ে তুলবে। লিনাক্স irqflags.h কিছু ম্যাক্রো যে এই হ্যান্ডেল হয়েছে। cpsieএবং cpsidনির্দেশাবলী হয়তো দরকারী; তবে, তারা রাষ্ট্র সংরক্ষণ করে না এবং বাসা বাঁধার অনুমতি দেয় না। cpsএকটি রেজিস্টার ব্যবহার করে না।

জন্য কর্টেক্স-এ সিরিজ, ldrex/strexআরও দক্ষ এবং একটি গঠনের কাজ করতে পারেন mutex সমালোচনামূলক বিভাগের জন্য অথবা তারা সাথে ব্যবহার করা যাবে লক-বিনামূল্যে সমালোচনামূলক ধারা পরিত্রাণ পেতে আলগোরিদিম।

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

আমার সন্দেহ আছে যে এখানে কিছু সূক্ষ্ম ত্রুটি রয়েছে।

mrs %[key], cpsr
orr r1, %[key], #0xC0  ; context switch here?
msr cpsr_c, r1

আপনাকে নিশ্চিত করতে হবে যে ক্রমটি কখনই প্রাক-খালি করা যায় না । অন্যথায়, আপনি বাধা সক্ষম হওয়া সহ দুটি মূল ভেরিয়েবল পেতে পারেন এবং লক প্রকাশটি ভুল হবে be আপনি এআরএমভি 5 তে ধারাবাহিকতা নিশ্চিত করতে কী মেমরির সাহায্যে swpনির্দেশিকাটি ব্যবহার করতে পারেন , তবে এই নির্দেশটি কর্টেক্স-এ-তে মুলতুবি করা হয়েছে কারণ এটি মাল্টি-সিপিইউ সিস্টেমে আরও ভাল কাজ করে।ldrex/strex

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

এছাড়াও, এমন কোনও ওপেনসোর্স লাইব্রেরি রয়েছে যেটিতে এআরএম (বা এমনকি ভাল লাইটওয়েট স্পিনলক / সেমফোর লাইব্রেরি) রয়েছে?

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


2

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

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

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

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

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

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

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

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

আমি এগুলি কীভাবে এমনভাবে প্রয়োগ করব যা আমি নির্দেশিত সমস্ত সম্ভাব্য সমস্যাগুলির সমাধান করে:

#define ARM_INT_KEY_TYPE            unsigned int
#define ARM_INT_LOCK(key_)   \
asm volatile(\
    "mrs %[key], cpsr\n\t"\
    "ands %[key], %[key], #0xC0\n\t"\
    "cpsid if\n\t" : [key]"=r"(key_) :: "memory", "cc" );
#define ARM_INT_UNLOCK(key_) asm volatile (\
    "tst %[key], #0x40\n\t"\
    "beq 0f\n\t"\
    "cpsie f\n\t"\
    "0: tst %[key], #0x80\n\t"\
    "beq 1f\n\t"\
    "cpsie i\n\t"
    "1:\n\t" :: [key]"r" (key_) : "memory", "cc")

-mcpu=cortex-a9কমপ্লেক্স নিশ্চিত করে নিন কারণ কমপক্ষে কিছু জিসিসি সংস্করণ (আমার মতো) পুরানো এআরএম সিপিইউতে ডিফল্ট রয়েছে যা সমর্থন করে না cpsieএবং cpsid

আমি ব্যবহৃত andsমাত্র পরিবর্তে andমধ্যে ARM_INT_LOCKতাই এটি একটি 16 বিট নির্দেশ যদি এই বুড়ো আঙ্গুলের কোড ব্যবহার করা হয় না। "cc"ক্লোবারটি যে কোনওভাবেই প্রয়োজনীয়, সুতরাং এটি কঠোরভাবে পারফরম্যান্স / কোড আকারের বেনিফিট।

0এবং 1হয় স্থানীয় লেবেল , রেফারেন্স জন্য।

এগুলি আপনার সংস্করণগুলির মতো সমস্ত উপায়ে ব্যবহারযোগ্য হবে। ARM_INT_LOCKঠিক যেমন ফাস্ট / ছোট আপনার মূল এক হিসাবে হয়। দুর্ভাগ্যক্রমে, আমি খুব ARM_INT_UNLOCKকম নির্দেশাবলী কাছাকাছি যে কোনও জায়গায় নিরাপদে করার উপায় নিয়ে আসতে পারিনি ।

যদি আইআরকিউ এবং এফআইকিউগুলি অক্ষম থাকে তখন আপনার সিস্টেমে বাধা রয়েছে, এটি সহজ করা যেতে পারে। উদাহরণস্বরূপ, যদি তারা সর্বদা একসাথে অক্ষম থাকে তবে আপনি এটির মতো cbz+ একত্রিত করতে cpsie ifপারেন:

#define ARM_INT_UNLOCK(key_) asm volatile (\
    "cbz %[key], 0f\n\t"\
    "cpsie if\n\t"\
    "0:\n\t" :: [key]"r" (key_) : "memory", "cc")

বিকল্পভাবে, আপনি যদি এফআইকিউগুলির বিষয়ে মোটেও চিন্তা করেন না তবে এটি কেবল তাদের সক্ষম / সম্পূর্ণভাবে অক্ষম করার জন্য ড্রপ করার অনুরূপ।

আপনি অন্য কিছুই জানেন তাহলে কি লক এবং আনলক মধ্যে CPSR অন্যান্য রাষ্ট্র বিট কোনো পরিবর্তন, তারপর আপনি ব্যবহার খুব আপনার মূল কোডে অনুরূপ কিছু দিয়ে অগ্রসর হতে পারে, উভয় সঙ্গে ব্যতীত "memory"এবং "cc"clobbers উভয় ARM_INT_LOCKএবংARM_INT_UNLOCK


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