কর্টেক্স এম0 এর সিএমএসআইএসে বাধা হ্যান্ডলারগুলি কীভাবে প্রয়োগ করা হয়?


9

আমার কাছে এলপিসি 1114 কিট রয়েছে। এর মধ্যে কীভাবে জিনিসগুলি করা হচ্ছে তা অনুসন্ধানের জন্য আমি কয়েক দিন ধরে কর্টেক্স এম 0 এর সিএমএসআইএস বাস্তবায়নটি খনন করছি। এখনও অবধি আমি বুঝতে পেরেছি যে প্রতিটি নিবন্ধকৃত কীভাবে ম্যাপ করা হয় এবং কীভাবে আমি এটি অ্যাক্সেস করতে পারি। তবে আমি জানি না কীভাবে এতে বাধা প্রয়োগ করা হয়। সিএমএসআইএস-এ বাধাগুলি সম্পর্কে আমি যা জানি, সেগুলি হ'ল স্টার্টআপ ফাইলটিতে কিছু বাধা হ্যান্ডলারের নাম রয়েছে। এবং আমি স্টার্টআপ ফাইলটিতে উল্লিখিত একই নামের সাথে কেবল একটি সি ফাংশন লিখে আমার নিজের হ্যান্ডলারগুলি লিখতে পারি। যা আমাকে বিভ্রান্ত করে তা হ'ল ব্যবহারকারী নির্দেশিকায়, বলা হয় যে সমস্ত জিপিআইও বহিরাগত বাধা উত্স হিসাবে ব্যবহার করা যেতে পারে। তবে স্টার্টআপ ফাইলে উল্লেখ করা হয়েছে মাত্র 4 পিআইও বাধা ts তাই আমাকে বল:

  1. অন্যান্য জিপিআইওর জন্য আমি কীভাবে বাহ্যিক বাধা হ্যান্ডলারগুলি প্রয়োগ করতে পারি?
  2. সিএমএসআইএস-এ কোথায় বাধা টেবিল ম্যাপ করা আছে?
  3. এনভিসি এবং এভিআর / পিআইসিগুলিতে বাধা প্রয়োগের মধ্যে প্রধান পার্থক্যগুলি কী কী? (এনভিসি ছাড়া ফ্ল্যাশের যে কোনও জায়গায় ম্যাপ করা যায়)

উত্তর:


14

নিম্নলিখিত তথ্য ইগরের দুর্দান্ত উত্তর ছাড়াও।

সি প্রোগ্রামিং দৃষ্টিকোণ থেকে, বাধা হ্যান্ডলারগুলি cr_startup_xxx.c ফাইলে সংজ্ঞায়িত করা হয় (যেমন এলপিসি 1343 এর জন্য cr_startup_lpc13.c ফাইল)। সমস্ত সম্ভাব্য বাধাপ্রাপ্ত হ্যান্ডলারগুলি সেখানে একটি WEAK ওরফে হিসাবে সংজ্ঞায়িত করা হয়। যদি আপনি কোনও বিঘ্নিত উত্সের জন্য আপনার নিজস্ব XXX_ হ্যান্ডলার () সংজ্ঞায়িত না করেন তবে এই ফাইলটিতে সংজ্ঞায়িত ডিফল্ট বাধা হ্যান্ডলার ফাংশন ব্যবহার করা হবে। লিঙ্কার cr_startup_xxx.c থেকে বাধা ভেক্টর টেবিলের সাথে চূড়ান্ত বাইনারিটিতে কোন ফাংশন অন্তর্ভুক্ত করবে তা নির্ধারণ করবে cr

বন্দরগুলি থেকে জিপিআইও বিঘ্নিত হওয়ার উদাহরণ জিপিও.সি.-এর ডেমো ফাইলগুলিতে প্রদর্শিত হয়। জিপিআইও বন্দরে এনসিভিতে একটি বাধা ইনপুট রয়েছে। বন্দরের প্রতিটি স্বতন্ত্র বিট সেই বন্দরে একটি বাধা তৈরি করতে সক্ষম / অক্ষম করা যায়। যদি আপনার উদাহরণস্বরূপ PIO1_4 এবং PIO1_5 পোর্টগুলিতে বাধা প্রয়োজন হয়, তবে আপনি GPIO0IE এ পৃথক PIO1_4 এবং PIO1_5 বিঘ্ন বিট সক্ষম করতে পারবেন। আপনার PIOINT0_Handler () বাধা হ্যান্ডলার ফাংশনটি আগুন লাগলে, GPIO0RIS রেজিস্টারটি পড়ে বাধাটি যথাযথভাবে পরিচালনা করে কোন PIO1_4 বা PIO1_5 (বা উভয়) বিঘ্নিত রয়েছে তা নির্ধারণ করা আপনার পক্ষে you


10

(দয়া করে নোট করুন যে 1 এবং 2 পয়েন্টগুলি বাস্তবায়নের বিশদ এবং আর্কিটেকচারাল সীমাবদ্ধতা নয়))

  1. বড় বড় এনএক্সপি চিপগুলিতে (যেমন এলপিসি 17 এক্সএক্সএক্সএক্স) বেশ কয়েকটি ডেডিকেটেড ইন্টারপ্রেট পিন রয়েছে (ইআইএনটিএন) যার নিজস্ব বাধা হ্যান্ডলার রয়েছে। বাকি জিপিআইওগুলিকে একটি সাধারণ বাধা (EINT3) ব্যবহার করতে হবে। তারপরে কোন পিনগুলি বাধাগ্রস্ত করেছে তা দেখতে আপনি বাধা স্ট্যাটাস রেজিষ্টারে পোল করতে পারেন।
  2. আমি এলপিসি 11 এক্সএক্সএক্সএক্সএক্সের সাথে খুব বেশি পরিচিত নই তবে জিপিআইও বন্দরটিতে এটির একটি বাধা রয়েছে বলে মনে হচ্ছে । নির্দিষ্ট পিনগুলি বের করার জন্য আপনাকে আবার স্ট্যাটাস রেজিস্টারটি পরীক্ষা করতে হবে। 12 টি পর্যন্ত পিন রয়েছে যা ওয়েকআপ উত্স হিসাবে কাজ করতে পারে। আমি নিশ্চিত নই যে আপনি সাধারণ বাধা হিসাবে তাদের হাইজ্যাক করতে পারেন (যেমন তারা কেবলমাত্র ঘুমের অবস্থাতেই ট্রিগার হবে)।
  3. ডিফল্ট হ্যান্ডলার টেবিলটি ঠিকানায় 0 (যা ফ্ল্যাশে রয়েছে) স্থাপন করা হয়েছে। প্রথম এন্ট্রিটি হ'ল এসপি রেজিস্ট্রারের রিসেট মান, দ্বিতীয়টি রিসেট ভেক্টর এবং বাকীটি অন্যান্য ব্যতিক্রম এবং বাধা ভেক্টর। প্রথম জনগুলির কয়েকটি (যেমন এনএমআই এবং হার্ডফল্ট) এআরএম দ্বারা স্থির করা হয়েছে, বাকিগুলি চিপ-নির্দিষ্ট। রানটাইমের সময় আপনাকে যদি ভেক্টর পরিবর্তন করতে হয় তবে আপনি এটিকে র‍্যামে পুনর্নির্মাণ করতে পারেন (আপনাকে প্রথমে টেবিলটি অনুলিপি করতে হবে)। এলপিসি ১১ এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএএমএক্সএক্সএক্সএক্সএক্স (0x10000000) এর শুরুতে রিম্যাপিং স্থির করা হয়, অন্যান্য চিপগুলি আরও নমনীয় হতে পারে।
  4. দক্ষ বিঘ্নিত হ্যান্ডলিংয়ের জন্য এন.সি.ভি. অনুকূলিত:
    • প্রতিটি বাধার জন্য প্রোগ্রামেবল অগ্রাধিকার স্তর 0-3 0 একটি উচ্চ-অগ্রাধিকারের বাধা নিম্ন-অগ্রাধিকারগুলি (বাসা বাঁধে)) উচ্চ-অগ্রাধিকারের বাধা শেষ হয়ে গেলে নিম্ন অগ্রাধিকারের কার্যকরকরণ পুনরায় শুরু হয়।
    • বিঘ্নিত এন্ট্রিতে প্রসেসরের স্টেটের স্বয়ংক্রিয় স্ট্যাকিং; এটি সরাসরি সিতে বাধাপ্রাপ্ত হ্যান্ডলারগুলি লেখার অনুমতি দেয় এবং সমাবেশের মোড়কের প্রয়োজনীয়তা সরিয়ে দেয়।
    • লেজ-শৃঙ্খলা: পপিং এবং রাষ্ট্রকে আবার ঠেলে দেওয়ার পরিবর্তে, পরবর্তী মুলতুবি বাধা অবিলম্বে পরিচালনা করা হবে
    • দেরিতে আগত: প্রসেসরের স্থিতি স্ট্যাক করার সময় যদি কোনও উচ্চ-অগ্রাধিকারের বাধা উপস্থিত হয়, তবে তা পূর্ববর্তী মুলতুবি স্থিতির পরিবর্তে তাৎক্ষণিকভাবে কার্যকর করা হবে।

আপনি যেহেতু পিআইসিগুলির সাথে পরিচিত, তাই এই অ্যাপটি দেখুন: নোট: পিআইসি মাইক্রোকন্ট্রোলার্স থেকে কর্টেক্স-এম 3 এ স্থানান্তরিত

এটি এম 3 সম্পর্কে, তবে বেশিরভাগ পয়েন্টগুলি এম 0-তেও প্রযোজ্য।


8

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

এলপিসিএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স পিনের 4 টি স্তর রয়েছে, জিপিআইও 0.0 থেকে জিপিআইও 0.n পর্যন্ত সমস্ত পিন একই বিঘ্নিত নম্বর ভাগ করে এবং জিপিআইও 3.0 থেকে জিপিআইও 3.এম পর্যন্ত সমস্ত পিন একই বিঘ্নিত নম্বরটি ভাগ করে।

এলপিসি 11 xxx এ জিপিআইও বিঘ্নিতকরণের জন্য ছয়টি পদক্ষেপ রয়েছে steps

  1. পিন সংযোগ ব্লক রেজিস্টারগুলিকে সংশোধন করে পিন ফাংশন সেট আপ করুন।
  2. জিপিআইও ডেটা দিকনির্দেশ রেজিস্টার (ডিফল্ট মান ইনপুট) সংশোধন করে পিনের দিকটি সেট আপ করুন।
  3. প্রতিটি পৃথক পিনের জন্য বিঘ্ন সেটআপ করুন, আপনাকে জিপিআইও ইন্টারপ্রেট মাস্ক রেজিস্টার জিপিআইওএনআইতে যেতে হবে এবং বিটটি সেট করতে হবে (যা পিনের সাথে মিলে যায়) লজিক 1।
  4. জিপিআইও আন্তঃব্যক্তিক অর্থে নিখরচায় GPIOnIBE এবং GPIOnIS রেজিস্টার সংশোধন করে উত্থিত প্রান্ত বা প্রান্ত প্রান্ত বা উভয় জন্য বাধা সেট আপ করুন।
  5. সিএমএসআইএস ফাংশনগুলি ব্যবহার করে নেস্টেড ভেক্টরড ইন্টারপেন কন্ট্রোলটিতে বাধা উত্সটি PIO_0 / PIO_1 / PIO_2 / PIO_3 সক্ষম করুন।
  6. সিএমএসআইএস ফাংশন ব্যবহার করে বাধা অগ্রাধিকার সেট করুন।

কোড বাস্তবায়ন। আপনার দুটি ফাংশন প্রয়োজন: একটি উপরের পদক্ষেপের 6 টি আরম্ভ করুন এবং দ্বিতীয়টি হ'ল বিঘ্নিত হ্যান্ডলার, যা স্টার্ট-আপ কোডগুলিতে startup_LPC11xx.sফাইল হিসাবে সংজ্ঞায়িত হ্যান্ডলার হিসাবে একই নাম হওয়া প্রয়োজন । নামগুলি থেকে শুরু PIOINT0_IRQHandlerকরে PIOINT3_IRQHandler। আপনি যদি আলাদা নাম ব্যবহার করেন তবে আপনাকে স্টার্ট-আপ ফাইলটিতে নাম পরিবর্তন করতে হবে।

/*Init the GPIO pin for interrupt control */
void GPIO_Init(){
    LPC_IOCON-> =..              //Pin configuration register
    LPC_GPIO1->FIODIR = ...      //GPIO Data direction register
    LPC_GPIO1->FIOMASK = ..      //GPIO Data mask register - choose  the right pin
    LPC_GPIO1->GPIOnIE = ..      //Set up falling or rising edge 
    NVIC_EnableIRQ(PIO_1);       //Call API to enable interrupt in NVIC
    NVIC_SetPriority(PriorityN); //Set priority if needed
}


/*Must have the same name as listed in start-up file startup_LPC11xx.s */
void PIOINT1_IRQHandler(void){
   //Do something here
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.