وقفه چیست؟ – Interrupt
وقفه سیگنالی است که به پروسسور اعلام میکند باید تسک جاری را متوقف کرده و تسک آن وقفه را انجام دهد. برای آنکه بدانید وقفه چیست، اولویت بندی در وقفه چیست و کاربردهای وقفه کجاست در ادامه این مقاله با ما همراه باشید.
وقفه چیست؟
اگر بخواهیم در یک تعریف مختصر بگوییم وقفه چیست میتوان گفت از نظر فنی وقفه سیگنالی است که به پروسسور اعلام میکند باید تسک جاری که مشغول به انجام آن است را متوقف کرده و تسکی را انجام دهد که مربوط به آن وقفه است. برای آنکه مطلب برای شما قابل هضم باشد اجازه دهید به مثالی از دنیای واقعی بپردازیم. فرض کنید مشغول مطالعه یک کتاب هستید و در همین لحظه تلفن همراه شما زنگ میخورد. عکس العمل شما چیست؟
به احتمال بسیار زیاد مطالعه را متوقف کرده به تلفن همراهتان جواب میدهید و پس از پایان مکالمه، از همان جایی که مطالعه را قطع کرده بودید به ادامه مطالعه میپردازید. سیستم وقفه (Interrupt) هم دقیقا به همین شکل است. در مثال ذکر شده شما نقش پروسسور را دارید، مطالعه کتاب نقش کاری که پروسسور مشغول به انجام آن است را دارد و زنگ خوردن تلفن همراه همان رخداد وقفه است.
در سادهترین حالت، هنگامی که یک سیگنال وقفه میآید پروسسور تسک جاری را متوقف کرده، اطلاعات مربوط به اینکه تا کجای تسک را انجام داده در پشته (stack) ذخیره میکند و به اجرای روتین وقفه میپردازد. پس از اتمام روتین وقفه با استفاده از اطلاعات ذخیره شده در پشته، از جایی که تسک متوقف شده بود به ادامه تسک میپردازد. البته ممکن است این سناریو بر اساس اولویت تسکی که در حال انجام است و اولویت وقفهای که آمده تغییر کند.
وقفه خارجی (External Interrupt) چیست؟
در بحث میکروکنترلرها، وقفه خارجی (External Interrupt) وقفه ای است که از دنیای خارج میکروکنترلر (از طریق پینها) میآید. اگر در مورد پینهای میکروکنترلر (GPIO) به اطلاعات بیشتری نیاز دارید میتوانید به مقاله GPIO چیست مراجعه کنید.
درون خود میکروکنترلر منابع وقفه متعددی وجود دارد. به عنوان مثال وقفه تایمر، میتواند در پریودهای زمانی مشخصی به پروسسور اعلام وقفه کند. تایمر درون خود میکروکنترلر است و وقفه آن داخلی محسوب میشود. پریفرالهای متعددی درون میکروکنترلر وجود دارد که بسیاری از آنها امکان ایجاد وقفه را دارند مانند وقفه UART، وقفه SPI، وقفه I2C، وقفه ADC و .. که همگی از وقفههای داخلی محسوب میشوند.
وقفه تودرتو (Nested Interrupts)
در بخشهای قبلی گفتیم با وقوع سیگنال وقفه، پروسسور تسک جاری خود را متوقف کرده و به اجرای روتین وقفه میپردازد. حال فرض کنید در هنگام اجرای روتین وقفه، یک سیگنال وقفه دیگر برای پروسسور بیاد. در این حالت آیا پروسسور باید روند اجرای روتین وقفه قبلی که مشغول انجام آن هست را متوقف کند و به اجرای روتین وقفه جدید بپردازد یا نه؟
اگر واحد وقفه این امکان را فراهم کند که سیگنال یک وقفه اجازه داشته باشد روند اجرای وقفه قبلی را متوقف کند اصطلاحا میگویند از وقفه تودرتو پشتیبانی میکند.
به مثال تلفن همراه برگردیم. شما مشغول مطالعه کتاب هستید که تلفن همراه شما زنگ میخورد. شما مطالعه را متوقف کرده و به تماس پاسخ میدهید. همچنان که مشغول مکالمه هستید زنگ در خانه به صدا در میآید. شما به مخاطب میگویید یک لحظه گوشی را نگه دارد تا به زنگ خانه پاسخ دهید. سپس به ادامه مکالمه برمیگردید و پس از اتمام مکالمه به ادامه مطالعه باز خواهید گشت. در این مثال شما یک وقفه تودرتو را پیاده کردهاید.
برای پیادهسازی وقفه تودرتو پروسسور باید در هر سطحی اطلاعات مربوط به تسک در حال اجرا را در پشته ذخیره کرده و پس از اتمام پاسخدهی به روتین وقفه، اطلاعات را از پشته بازیابی کند تا بتواند به ادامه تسکی که آن را متوقف کرده بازگردد.
اولویت بندی در وقفه چیست (Priority of Interrupts)
برای آنکه بدانید اولویت بندی در وقفه چیست، فرض کنید وقفهای در حال اجراست (نام این وقفه را وقفه اول میگذاریم) و وقفه دیگری رخ میدهد (نام این وقفه را وقفه دوم میگذاریم). اگر وقفه تودرتو پشتیبانی میشود این سوال پیش میآید که وقفه دوم آن قدر مهم هست که اجازه متوقف کردن وقفه اول را داشته باشد یا نه. اگر این اجازه را ندارد باید منتظر بماند و اگر در هنگام انتظار وقفه دوم، وقفه دیگری نیز رخ داد (نام این وقفه را وقفه سوم را میگذاریم) و آن وقفه هم منتظر ماند پس از اتمام وقفه اول باید وقفه دوم اجرا شود یا وقفه سوم؟
پاسخ این سوالات در اولویت بندی وقفهها مشخص میشود. برخی از میکروکنترلرها امکان تعیین اولویت را برای وقفهها در اختیار شما قرار میدهند.
کاربرد وقفه (Interrupt)
اجازه دهید با مثالی از دنیای واقعی به شما نشان دهیم که کاربرد وقفه چیست. فرض کنید قرار است یک بسته با پیک به شما برسد اما زمان آن مشخص نیست. همچنین پیک پس از رسیدن به مقصد مدت زمان کوتاهی را منتظر شما میماند و اگر شما را ملاقات نکند بسته را بازمیگرداند. شما برای آنکه بتوانید بسته را تحویل بگیرید دو راه پیش رو دارید. راه اول اینکه کار و زندگی خود را رها کرده و دائما در محل قرار باشید یا حداقل هر چند دقیقه یکبار به آنجا سر بزنید. راه دوم آنکه شماره تماس خود را به پیک بدهید تا هر زمان رسید با شما تماس بگیرد. کدام را انتخاب میکنید؟
وقفه دقیقا کار همان تماس را برای پروسسورانجام میدهد. پروسسور میتواند به انجام تسکهای خود بپردازد و هرگاه اتفاق مورد نظر رخ دهد یک سیگنال وقفه به پروسسور ارسال میشود.
به عنوان یک مثال فنی بسیاری از سنسورهایی که خروجی دیجیتال دارند و یا ADCها، یک پین اینتراپت در خروجی خود دارند. هرگاه سنسور یک نمونه جدید را آماده کرده باشد حالت این پین را تغییر میدهد و شما مدت زمان محدودی برای خواندن دادهها دارید چون پس از آماده شدن داده بعدی داده فعلی از بین خواهد رفت. شما با اتصال این پین به یک پین ورودی میکروکنترلر و فعال کردن وقفه خارجی روی آن، میتوانید از آماده شدن دیتای جدید مطلع شوید و آن دیتا را بخوانید بدون آنکه پروسسور خود را مشغول چک کردن دائم آن پین کرده باشید.
در انتها
در این مقاله در مورد اینکه وقفه چیست، وقفه تودرتو یعنی چه، اولویت بندی وقفه چیست و اینکه وقفه چه کاربردهایی دارد صحبت کردیم. اگر نیاز به اطلاعات بیشتری در مورد وقفهها دارید میتوانید به منابعی مانند interrupt-wikipedia مراجعه کنید. از شما دعوت میکنیم نظرات خود راجع به این مقاله و یا تجربیات ارزشمندان در مورد کار با وقفهها را در بخش نظرات این نوشته با ما و دیگر دوستانتان به اشتراک بگذارید.
دیدگاهتان را بنویسید