আমি এই মুহুর্তে কর্টেক্স এম0 / এম 4 এর জন্য কোডিং করছি এবং আমরা সি ++ তে যে পদ্ধতিটি ব্যবহার করছি (সেখানে কোনও সি ++ ট্যাগ নেই, সুতরাং এই উত্তরটি অফ-টপিক হতে পারে) নীচে রয়েছে:
আমরা CInterruptVectorTable
এমন একটি ক্লাস ব্যবহার করি যার মধ্যে সমস্ত বিঘ্নিত পরিষেবা রুটিন থাকে যা নিয়ামকের আসল বিঘ্নিত ভেক্টরে সঞ্চিত থাকে:
#pragma location = ".intvec"
extern "C" const intvec_elem __vector_table[] =
{
{ .__ptr = __sfe( "CSTACK" ) }, // 0x00
__iar_program_start, // 0x04
CInterruptVectorTable::IsrNMI, // 0x08
CInterruptVectorTable::IsrHardFault, // 0x0C
//[...]
}
ক্লাসটি CInterruptVectorTable
বিঘ্নিত ভেক্টরগুলির বিমূর্ততা প্রয়োগ করে, তাই আপনি রানটাইম চলাকালীন বিঘ্নিত ভেক্টরগুলিতে বিভিন্ন ফাংশন বাঁধতে পারেন।
এই শ্রেণীর ইন্টারফেসটি দেখতে এই রকম:
class CInterruptVectorTable {
public :
typedef void (*IsrCallbackfunction_t)(void);
enum InterruptId_t {
INTERRUPT_ID_NMI,
INTERRUPT_ID_HARDFAULT,
//[...]
};
typedef struct InterruptVectorTable_t {
IsrCallbackfunction_t IsrNMI;
IsrCallbackfunction_t IsrHardFault;
//[...]
} InterruptVectorTable_t;
typedef InterruptVectorTable_t* PinterruptVectorTable_t;
public :
CInterruptVectorTable(void);
void SetIsrCallbackfunction(const InterruptId_t& interruptID, const IsrCallbackfunction_t& isrCallbackFunction);
private :
static void IsrStandard(void);
public :
static void IsrNMI(void);
static void IsrHardFault(void);
//[...]
private :
volatile InterruptVectorTable_t virtualVectorTable;
static volatile CInterruptVectorTable* pThis;
};
আপনাকে ভেক্টর টেবিলের মধ্যে সঞ্চিত ফাংশনগুলি তৈরি করতে হবে static
কারণ this
ভেক্টর টেবিল কোনও বস্তু নয় বলে নিয়ামক একটি- পয়েন্টার সরবরাহ করতে পারে না । সুতরাং সমস্যাটি পেতে আমাদের কাছে স্ট্যাটিক- pThis
পয়েন্টার রয়েছে CInterruptVectorTable
। স্থিতিশীল বাধা ফাংশনগুলির একটিতে প্রবেশ করার পরে, এটির pThis
একটি অবজেক্টের সদস্যদের অ্যাক্সেস পাওয়ার জন্য পয়েন্টারটি অ্যাক্সেস করতে পারে CInterruptVectorTable
।
এখন প্রোগ্রামে, আপনি SetIsrCallbackfunction
কোনও ফাংশনটিতে একটি ফাংশন পয়েন্টার সরবরাহ করতে ব্যবহার করতে পারেন static
যা যখন কোনও বাধা ঘটে তখন ডাকা হয় called পয়েন্টারগুলিতে সংরক্ষণ করা হয় InterruptVectorTable_t virtualVectorTable
।
এবং একটি বাধা ফাংশন বাস্তবায়ন দেখে মনে হচ্ছে:
void CInterruptVectorTable::IsrNMI(void) {
pThis->virtualVectorTable.IsrNMI();
}
সুতরাং এটি static
অন্য শ্রেণীর একটি পদ্ধতি কল করবে (যা হতে পারে private
), যা এরপরে static
this
সেই অবজেক্টের সদস্য-ভেরিয়েবলগুলিতে অ্যাক্সেস পেতে অন্য পয়েন্টার থাকতে পারে (কেবলমাত্র একটি)।
আমি অনুমান করি যে আপনি IInterruptHandler
অবজেক্টগুলিতে পয়েন্টার পছন্দ এবং সঞ্চয় করতে এবং ইন্টারফেস করতে পারবেন , সুতরাং আপনাকে এই static
this
সমস্ত শ্রেণিতে পয়েন্টার লাগবে না । (সম্ভবত আমরা আমাদের স্থাপত্যের পরবর্তী পুনরাবৃত্তিতে এটি চেষ্টা করি)
অন্য পদ্ধতিটি আমাদের পক্ষে ঠিক কাজ করে, কারণ কেবল বাধা হ্যান্ডলারের বাস্তবায়নের জন্য অনুমোদিত অবজেক্টগুলি static
this
হ'ল হার্ডওয়্যার বিমূর্ততা স্তরটির অভ্যন্তর এবং আমাদের সাধারণত প্রতিটি হার্ডওয়্যার ব্লকের জন্য কেবল একটি অবজেক্ট থাকে তাই এটি পয়েন্টারগুলির সাথে কাজ করে সূক্ষ্মভাবে কাজ করে । এবং হার্ডওয়্যার বিমূর্ততা স্তর বিঘ্নগুলির জন্য আরও একটি বিমূর্ততা সরবরাহ করে, যার নাম ICallback
এটি ডিভাইস স্তরটিতে হার্ডওয়ারের উপরে প্রয়োগ করা হয়।
আপনি কি বিশ্বব্যাপী ডেটা অ্যাক্সেস করেন? নিশ্চিত যে আপনি এটি করেছেন তবে আপনি বেশিরভাগ প্রয়োজনীয় বিশ্বব্যাপী ডেটা- this
পয়েন্টার এবং বাধা ফাংশনগুলির মতো ব্যক্তিগত করতে পারেন ।
এটি বুলেটপ্রুফ নয়, এবং এটি ওভারহেড যুক্ত করে। আপনি এই পদ্ধতির ব্যবহার করে একটি আইও-লিংক স্ট্যাক প্রয়োগ করতে সংগ্রাম করবেন। তবে আপনি যদি সময়গুলির সাথে অত্যন্ত কঠোর না হন তবে এটি সর্বত্র থেকে অ্যাক্সেসযোগ্য গ্লোবাল ভেরিয়েবলগুলি ব্যবহার না করে মডিউলগুলিতে বিঘ্ন এবং যোগাযোগের একটি নমনীয় বিমূর্ততা পেতে বেশ ভাল কাজ করে।