پس از توضیح مختصر در مورد پردازنده های ARM سعی میکنیم در این نوشته که به سه بخش تبدیل می شود به واحد کنترل کننده وقفه های برداری تو در تو(Nested Vector Interrupt Table) بپردازیم . این نوشته بیشتر به ساختار این واحد می پردازد و برای درک عملکرد وقفه ها مفید است . در این نوشته بیشتر بر روی سری CORTEX_M تمرکز میکنیم هر چند شباهت های بسیاری بین سری های مختلف است.
اگر جلسه اول را نخوندید اینجا کلیک کنید.
واحد کنترل کننده وقفه های برداری تو در تو(NVIC) برای پاسخ صحیح و سریع به وقفه ها و استثنا ها طراحی شده است . در سری Cortex_M3 و Cortex_M4 بعد از ۱۲ سیکل اولین خط برنامه وقفه تان (Interrupt Service Routine) اجرا می شود . این سری از میکروکنترلر ها قادر به پشتیبانی از ۲۵۶ اینتراپت هستند .
زمانی که یک وقفه رخ میدهد واحد NVIC باعث دو اتفاق به صورت موازی می شود :
۱- بردار وقفه ها (Interrupt Vector) توسط باس ICODE گرفته (Fetch)میشود .این بردار حاوی آدرس برنامه وقفه های مختلف (ISR) است .این آدرس وارد رجیستر (R15 (Program counter می شود و برنامه وقفه شروع به اجرا می شود .
۲- به طور همزمان پردازنده به صورت اتوماتیک رجیستر های xPSR,PC,LR,R12,R3,R2,R1,R0 را وارد(PUSH) پشته (Stack) می کند . پشته قسمتی از حافظه است که به صورت موقت مقادیر تابع ها را در خود ذخیره می کند و به صورت FILO(اولین مقدار وارد شده آخر از همه خارج می شود) عمل می کند .این عملکرد باعث می شود که برنامه وقفه از ۴ رجیستر R0-R3 برای انجام محاسبات استفاده کند و اگر نیاز به رجیستر بیشتری دارد باید مقادیر را وارد (PUSH) پشته و بازخوانی(POP) کند.
این کار ها نیاز به ۱۲ سیکل دارد . همه این عملکرد های توسط خود میکروکنترلر انجام می شود و نیازی به نوشتن کد ندارد!
آدرس برنامه وقفه ها در برداری به نام بردار وقفه که در شروع فضای آدرس قرار دارد موجود است .اولین ۴ بایت برای نگه داری مقدار اولیه رجیستر Stack(نشان دهنده پایان Stack!) استفاده میشود . این مقدار توسط کامپایلر و لینکر (بعدا در مورد اینها صحبت میکنیم) محاسبه شده و در رجیستر R13 قرار میگیرد . بردار وقفه ها به صورت از پیش تعیین شده در فایل startup قرار دارد .یک برچسب برای هر برنامه وقفه در بردار وقفه ها وجود دارد و برای نوشتن برنامه وقفه فقط کافی است شما یک تابع void با استفاده از نام یکسان با برچسب در برنامه C خود درست کنید .
برای مثال:
}(void RTC_IRQHandler(void
your code …..
{
زمانی که پروژه ساخته شد لینکر آدرس برنامه را در بردار وقفه به جای برچسب قرار می دهد .
اینتراپت خارجی
پایه های اینتراپت که برای اینتراپت های خارجی استفاده می شود , میتواند به لبه یا سطح حساس باشد.
به صورت پیش فرض حساسیت روی سطح است بدین معنی که زمان وقوع اینتراپت تا زمانی که پرچم اینتراپت پاک نشود به صورت پشت سر هم باعث ایجاد اینتراپت می شود .بعضی از قسمت های جانبی خود به خود پرچم را فعال می کنند که زمان نوشتن کد باید به آن توجه داشت .
استثناهای پردازنده های( ARM(CORTEX_M
به علاوه خط های اینتراپت واحدهای جانبی (Peripherals) , پردازنده های CORTEX_M دارای استثناهای داخلی هستند و ۱۵ قسمت از قسمت های بردار وقفه ها را تسخیر کرده اند.
اولین قسمت کنترل کننده ریست است . زمانی که میکروکنترلر ریست می شود , باعث می شود به ابتدای برنامه شما بپرد .دومین قسمت بردار به اینتراپت غیر قابل چشم پوشی(nonmaskable) تعلق دارد .نحوه عملکرد این قسمت بستگی به پردازنده مورد نظر شما دارد و ممکن است به طور مثال به یک پایه خارجی وصل باشد یا به یک واحد جانبی مثل سگ نگهبان !!
۴ قسمت بعدی استثناهای پردازنده های CORTEX_M برای کنترل خطا ها استفاده می شود که در بخش بعدی به آن ها می پردازیم
لطفا اگر سوالی یا هر گونه مشکلی در نوشته وجود داشت در قسمت نظرات مطرح کنید
منبع : کتاب The Designer’s Guide to the Cortex_M Processor Family
دوستان عزیز اگر به میکروکنترلرهای ARM LPC1668 علاقمند هستید میتوانید آموزش های آن را در لینک زیر دنبال کنید.
آموزش میکروکنترلرهای LPC1768 جلسه هشتم: وقفه ها در LPC1768
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
ممنون بابت وقتی که برای انتشار مطالب صرف می کنید./.