در ادامه دو بخش قبلی سعی می کنیم در این قسمت (واحد کنترل اینتراپت بخش سوم(آخر)) توضیحی در مورد نحوه اولویت بندی وقفه ها در این واحد ارائه کنیم
حق تقدم و اولویت
واحد کنترل اینتراپت شامل گروهی از رجیستر ها با ۸ بیت فضا برای هر منبع اینتراپت میباشد.
در پیکربندی اولیه ۷ بیت بالایی به شما اجازه میدهد که حق تقدم(Preemption) را مشخص کنید .هر چه این عدد کمتر باشه اهمیت اینتراپت بالاتر است .پس اگر یک اینتراپت در حال سرویس دهی باشد و اینتراپتی با حق تقدم پایین تری رخ دهد باعث می شود وضعیت اینتراپت فعلی ذخیره شود و به اینتراپت جدید سرویس دهی کند .زمانی که اینتراپت با حق تقدم پایین پایان یافت ادامه اینتراپت قبلی در دستور کار قرار می گیرد .
کم ارزش ترین بیت از فضای ۸ بیتی به اولویت(Priority) اختصاص میابد . اگر دو اینتراپت با حق تقدم یکسان رخ دهند, اینتراپت با اولویت کمتر اجرا می شود .این بدین معنی هست که ما ۱۲۸ حق تقدم داریم که هر کدام دو سطح اولویت دارند .
گروه ها و زیر گروه ها
به طور پیش فرض در واحد کنترل اینتراپت, ۷ بیت از رجیستر اولویت , حق تقدم را مشخص می کند و کم ارزش ترین بیت اولویت را مشخص می کند . مرز بین گروه اولویت و گروه حق تقدم را می توان با نوشت در برنامه اینتراپت و رجیستر ARIC تغییر داد
سه اینتراپت ریست و NMI و استثنا سخت در بعضی از میکروکنترلر ها دارای اولویت زیر ۰ هستند !!
کنترل اولویت زمان اجرا
سه رجیستر وجود دارد که می توانند به صورت پویا برای غیر فعال کردن منابع اینتراپت انتخاب شوند که عبارتند از PRIMASK , FAULTMASK و BASEPRI .
PRIMASK برای غیر فعال کردن همه اینتراپت ها به جز Hard fault و NMI
FAULTMASK برای غیر فعال کردن همه اینتراپت ها به جز NMI
BASEPRI برای غیر فعال کردن همه اینتراپت ها در حق تقدم مشخص شده است
این رجیستر ها MEMORY MAP نشده اند و در رجیستر های CPU قرار دارند و میتوانند فقط با دستور های MSR و MRS تغییر کنند
این هم آخرین بخش از کنترل وقفه امیدوارم کمکی کرده باشم برای درک بهتر از روند اجرای وقفه
سعی می کنم براتون یک مثال از راه اندازی وقفه هم درست کنم تا به صورت عملی این واحد رو ببینید
اگر سوالی داشتید در پرسیدنش شک نداشته باشید 😉
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
سلام مهندس لطفا یه مثال بصورت ریجستری از وقفه قرار بده ممنونم — مطالبت واقعا ارزشمنده ممنون از زحمت و وقت خیلی زیادی که صرف میکنی
سلام و خسته نباشید من از دو usart با وقفه برای ارتباط با یک دستگاه جانبی و کامپیوتر استفاده کردم و درست کار میکنه ودیتاها رد و بدل میشن ولی ظاهرا بعضی مواقع که تداخل وقفه پیش میاد یکی از uartها دیگ وقفه دریافت نمیزنه و دیتا دریافت نمیکنه. میدونید مشکل از کجاست. چون بعضیمواقع پیش میاد نتونستم دیباگ کنم
سلام
میخواستم بدونم اگه ما تو یک وقفه باشیم ولی تو مراحل انجام کد اون وقفه بخوریم چه اتفاقی میفته؟
ایا بر اساس تقدم صف میشن؟
اگه حق تقدمشون برابر باشه چی؟
با تشکر لطفا زود تر جواب بدید
سلام، بله وقغهها تقدم تاخر دارند. باید دریتاشیت و نوع وقفه را بررسی کنید. حتی وقتی روتین یک وقفهای وقفهی دیگر رخ دهد برای این هم پیش بینیهایی شده.
ممنون بابت وقتی که برای انتشار مطالب صرف می کنید./.