HardFault
HardFault
آب سردی بر پیکر برنامه نویسان میکروکنترلرها.
اگر دوست دارید بدونید چطور مشکلات مربوط به ایجاد شدن این دسته از خطاها در برنامه رو پیدا کنید با ما همراه باشید .
کنترلرهای مبتنی بر Cortex عموما Handler های ویژه ای برای مدیریت خطاهای ایجاد شده در سیستم کنترلر برای ما دارند .بطور مثال ایجاد Excpetion هایی برای تشخیص نوع خطا .
از معروف ترین سرویس های مربوط به Handler ها HardFault هست .ولی چرا عموما همه به این سرویس برخورد می کنند نه به سرویس های دیگه مثل MemManage_Handler یا BusFault_Handler ؟
جواب سادست و از دو بخش تشکیل میشه :
1- اصلا فعال نشده اون قسمت ها .
2- خود اون قسمت ها ایجاد خطا کردند .
مکانیزم استفاده شده در میکروکنترلرها بدین صورت هست که بعد از تشخیص خطا exception fault متناظر با اون خطا فعال میشه ( تریگر میشه ) و یکی از Handler ها بسته به پیکره بندی رجیسترهای مربوط به خطا ها اجرا میشه .
در ادامه قرار بهتون توضیح بدیم چطور از این fault exception استفاده کنیم و خطارو پیدا کنیم و برطرف کنیم .
Fault Exception ها دسترسی های غیرمجاز به حافظه و رفتار نادرست و غیرمجاز برنامه هارو گیر میندازند .شرایط زیر می تونند توسط Fault Exception ها تشخیص داده بشند :
- HardFault :
خطای پیش فرضی هست که می تونه به دلایلی همچون ایجاد یک خطا هنگام پردازش یک خطای دیگر یا خطا و استثنائی رخ داده که توسط دیگر مکانیزم ها که در زیر لیست می شوند قابل گیر انداختن ( مربوط به بقیه ) نبوده باشد .
- MemManage :
این نوع خطا موقعی رخ داده که دسترسی به قسمتی از حافظه زده شده که از طریق MPU یا Memory Management Unit نباید به این قسمت بنا به شرایطی دسترسی زده می شده که یک نقض دسترسی به حافظه رخ داده است .به طور مثال اگر قسمتی از حافظه را با استفاده از MPU به عنوان فقط خواندنی و نوشتنی مشخص کرده باشیم و بخواهیم از این قسمت از حافظه کدی اجرا کنیم چون خلاف ویژگی هست که تنظیم کردیم یک نقض رخ خواهد داد .
- BusFault :
خطایی که موقع Fetch کردن دستورات مربوط به دسترسی زدن به حافظه ، خواندن و نوشتن اطلاعات ،Fetch کردن وکتور وقفه و یا عملیات Register Stacking هنگام ورود و خروج از وقفه ها رخ می دهد توسط این قسمت گرفته می شود .
- UsageFault :
تشخیص یک دستور تعریف نشده برای پروسسور ،دسترسی Align نشده به حافظه برای load/store چندتایی .یا اگر تشخیص تقسیم بر صفر کردن فعال باشد . موارد گفته شده توسط این قسمت گرفته می شود .
شماره exception ها و اولویت بندی آنها :
Exception | Exception Number | Priority | IRQ Number | Activation |
HardFault | 3 | -1 | -13 | – |
MemManage fault | 4 | Configurable | -12 | Synchronous |
BusFault | 5 | Configurable | -11 | Synchronous when precise, asynchronous when imprecise. |
UsageFault | 6 | Configurable | -10 | Synchronous |
همانطور که در جدول بالا مشاهده می کنید اولویت HardFault همیشه ثابت و مقدار (1-) دارد و همیشه فعال می باشد .
این اولویت بالاتر از بقیه Exception ها و وقفه ها می باشد ولی کم تر از Non-Maskable Interrupt یا NMI .
بنابراین HardFault در زمانی که هر یک از Exception های دیگر غیر فعال باشد یا در هنگام پروسس خود دچار خطا شود اجرا خواهد شد و خطای مورد نظر را می گیرد .
بقیه Exception های موجود در لیست و جدول بالا اولویت قابل پیکره بندی دارند . و بعد از ریست این استثنائات غیرفعال هستند و می توانند توسط رجیستر System Control Block یا SCB فعال شوند .