واحد کنترل اینتراپت بخش دوم(NVIC)

در ادامه بخش اول در مورد نحوه عملکرد واحد  کنترل کننده وقفه های برداری تو در تو به قسمت استثناهای داخلی میکرو رسیدیم که در این بخش در مورد آنها صحبت می کنیم.

جلسه اول را اینجا مطالعه کنید.

واحد کنترل اینتراپت

۱- خطای کارکرد (Usage fault)

این خطا زمانی به وجود می آید که یک کد اشتباه اجرا شود . علت معمول این اشتباه زمانی است که به پردازنده یک opcode اشتباه داده شود . بیشتر کامپایلر ها توانی تولید کد برای محدوده وسیعی از هسته های ARM را دارا هستند پس امکان دارد کامپایلر به صورت اشتباهی پیکر بندی شده باشد .

دلایل دیگری که می تواند باعث این استثنا شوند به شرح زیر هستند :

۱- دستور ناشناخته

۲- آدرس بازگشت اشتباه

۳- دسترسی اشتباه به حافظه بدون صف آرایی

۲- خطای باس (Bus fault)

خطای باس زمانی اتفاق می افتد که خطایی روی ماتریکس باس پیشرفته (AHB bus matrix) دیده شود .

دلایل دیگر این استثنا به صورت زیر می باشد :

۱- محدوده حافظه اشتباه

۲- انتقال دیتا اشتباه . به طور مثال نوشتن بایت در ورد یا بالعکس

۳- خطای مدیریت حافظه (Memory Manager Fault)

مدیریت خافظه یک واحد در پردازنده های سری Cortex-M که زمان طراحی میکروکنترلر میتواند به آن اضافه شود .این واحد کنترل کننده نحوه دسترسی به قسمت های مختلف حافظه با توجه به حالت کاری (Operating mode) آن است

حتما در ادامه این مطلب را هم بخوانید:  آموزش میکروکنترلرهای LPC1768 جلسه اول: معرفی ARM و هسته Cortex-M3

۴- خطای سخت (Hard fault)

این خطا به دو صورت میتواند اتفاق بیوفتد اول زمانی که یک ارور باس به وجود آید و در حال خواندن بردار وقفه باشیم و دوم زمانی است که خطاهای دیگر غیر فعال باشند و خطا تبدیل به خطای سخت می شود.

واحد کنترل اینتراپت Nvic

فعال کردن استثناها

خطای سخت همیشه فعال است و تنها با تغییرات در رجیستر FAULTMASK می تواند غیر فعال شود . استثنا های دیگر باید توسط رجیستر های SCB , SHC , SR فعال شوند

در این بخش سعی کردیم توضیح مختصری در مورد استثناهای پردازنده های Cortex-M بدیم

در قسمت بعدی و آخرین بخش واحد کنترل اینتراپت به اولویت بندی اینتراپت ها و نحوه میدریت اینتراپت ها در موارد خاص توسط این واحد می پردازیم

لطفا هر گونه نظر و پیشنهادی دارید در قسمت نظرات مطرح کنید

آموزش های میکروکنترلرهای ARM را اینجا دنبال کنید.

درباره ی علیرضا صادقی

یک دیدگاه

  1. من که نفهمیدم چرا hard fault در برنامه دارم . وقتی شروع به مقدار دهی رحیستر های کنترلی fmc میکنم این اتفاق میفته . میتونید راهنمایی کنین .

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *