در این آموزش به بررسی pooling و همچنین intterupt به طور تخصصی در پلتفرمهای آردوینو خواهیم پرداخت. در ادامهی آموزش با مرجع تخصصی آدوینو ، دیجی اسپارک همراه باشید. اکثر سیستم های میکروکنترلر دارای ارتباط سریال ، SPI ، I2C ، مبدل آنالوگ به دیجیتال و . . . میباشند.گاهی اوغات یک سیستم خارجی ( مانند یک سنسور ) برای انجام عملیاتی مشخص به میکروکنترلر یا آردوینو متصل میشوند و از طریق دستورالعملهایی با آنها ارتباط برقرار شده و کنترل میشوند. به عنوان نمونه یک سیستم دماسنج دیجیتال، که دمای محیط را اندازهگیری میکند و پس از پایان اندازهگیری مقادیر را به میکروکنترلر ارسال میکند.
چگونه یک پردازنده اطلاعات مورد نیاز را از سیستمهای خارجی متصل به خود دریافت میکند ؟
این عمل را به دو طریق میتوان انجام داد:
- pooling
- intterupt
روش pooling که روش سادهای میباشد :
در این روش طبق بازههای زمانی خاص که برنامه نویس آنها را مشخص میکند ، میکروکنترلر یا آردوینو به سیستمخارجی ( سنسور یا …) رجوع میکند و اطلاعات مربوطه را دریافت میکند. در روش pooling میکروکنترلر باید مرتبا به سیستم خارجی رجوع کند و از سیستم مورد نظر درخواست اطلاعات کند. همانطور که مشاهده میکنید در روش pooling سیستم خارجی متصل به میکروکنترلر ، یک سیستم مجزا محسوب نمیشود و وابسته به میکروکنترلر میباشد.اشکال این روش در این است که بار پردازشی اضافه برای چک کردن دائم سیستم خارجی میباشد که باعث مصرف انرژی و منابع میکروکنترلر میشود.
روش interrupt :
وقفه یا intterupt یک سیگنال به ریزپردازنده است که به توجه و پاسخ سریع CPU نیاز دارد. هنگامی که یک وقفه رخ میدهد، پردازنده عملیات جاری خود را متوقف میکند تا به درخواست وقفه(کدهای خاصی که دربرنامه نوشته شده است) رسیدگی کند. پس از رسیدگی به درخواست مورد نظر و انجام آن ، برنامه از همانجایی که متوقف شده است شروع به اجرا میکند. استفاده از وقفه باعث مصرف کمتر انرژی ، بهینه تر شدن کد ، درک بهتر از کد و همچنین استفاده کمتر از منابع میکروکنترلر میشود.
نسبت دادن intrrupt و pooling به وقایع روزانه
فرض کنید منظر سرویس برای رفتن به سر کار باشید.سرویس شما راس ساعت ۸:۰۵ در مقابل منزلتان منتظر شماست. شما میخواهید ساعت ۸ از خانه خارج شوید و در بیرون خانه منتظر سرویس بایستید. دو راه کار پیش روی شماست :
۱- هنگامی که از خواب بیدار میشوید مدام به ساعت نگاه کنید تا وقتی ساعت ۸ شد از خانه خارج شوید ( کاری بسیار کسل کننده ) ( روش pooling ) .
۲- برای ساعت ۸ زنگ ساعت را تنظیم کنید که هنگام راس ساعت ۸ زنگ آن به صدا آید و شما را مطلع ساز ( روش interrupt ) .
مثالی حقیقی از عمل کرد وقفه
فرض کنید قصد داریدبرنامهای بنویسید که با هر بار فشار دادن یک کلید ، یک عدد LED روشن شود. اگر از pooling استفاده کنید باید مدام برنامه وضعیت کلید را چک کند و در صورت یک منطقی کلید ، LED روشن میشود. ولی در روش interrupt بدون چک کردن دائم وضعیت کلید ، هنگام فعال شدن کلید یک سیگنال به cpu فرستاده میشود و سپس LED روشن میشود.
روال پاسخ گویی به وقفه یا ( ISR ( interrupt service routine
قبل از توضیح این قسمت توجه شمارا به تعریف چند کلمهی خاص جلب میکنم :
stack : قسمتی از حافظه SRAM میباشد که دستوراتی جهت اجرای وقفه و فراخوانی میکروکنتلر در آن جا ذخیره میشود.
ثبات : به حافظههای سریع درون پردازنده ثبات یا Register میگویند.
Program counter : شمارنده برنامه میباشد که نشان میدهد میکروکنترلردر کدام قسمت از برنامه قرار دارد.
بردار وقفه : هر سطح وقفه یک محل رزرو شده در حافظه دارد که بردار وقفه (interrupt vector) نامیده می شود. همه بردارهای وقفه در جدولی به نام جدول بردار وقفه (interrupt vector table) نگهداری می شوند. به عنوان مثال جدول بردار وقفه یک میکروکنترلر را مشاهده میکنید:
تذکر : اگر چند وقفه به طور همزمان رخ دهد ، هرکدام که اولویت بالاتری دارد را اجرا میکند. همانطور که در جدول فوق مشاهده میکنید وقفه RESET در میکروکنترلر و آردوینو از اولویت بالاتری برخوردار میباشد و با اجرای آن میکروکنتلربه شروع آدرس برنامهی درون خود پرش میکند.
پس از آن که cpu سیگنال وقفه را دریافت کرد مراحل زیر را به ترتیب اجرا میکند:
۱- برنامه دستوری که در حال اجرای آن بوه است را متوقف نموده . سپس تمام ثبات ها ، Program counter و آدرس قسمتی از برنامه که در حال اجرای آن بوده است، در stack ذخیره میشوند.
۳- به جدول بردار وقفه ( جدولی همانند تصویر بالا ) مراجعه میکند و آدرس سرویس وقفه ( program address ) را پیدا میکند .
۳- سپس به آدرس بدست آمده از بردار وقفه پرش میکند و زیربرنامه موجود در آن آدرس بدست آمده را اجرا میکند.
۴-به stack بازگشته ثبات ها و آدرس همان جایی از برنامه که هنگام وقوع وقفه ، متوقف شده بود را دریافت میکند.
۵- سپس به همان آدرس پرش میکند و ادامهی برنامه را اجرا میکند ( به زبان ساده تر،به همان جایی که برنامه متوقف شده بود ، باز میگردد و شروع به اجرای برنامه میکند).
آموزش وقفه interrupt
انواع وقفه
- وقفه داخلی : وقفهای که بر اثر اجرای دستورات در ریزپردازنده رخ میدهد همانند وقفهی تقسیم بر صفر.
- وقفه خارجی : وقفهای که در اثر وقوع یک اتفاق خارجی از طرف سخت افزارهای منصل به پردازنده ایجاد میشود.همانند وقفهی یک کلید که به یکی از پینهای INT ( پینهای مرببوط به وقفه خارجی ) متصل است.
در بخش بعدی از آموش به وقفههای خارجی آردوینو خواهیم پرداخت.
[…] دو لینک زیر به آموزش وقفه در آردوینو پرداخته بخش اول بخش […]
[…] آموزش وقفه بخش اول […]
سلام. ممنون از شما. لغت pooling اشتباه است. درستش polling است.
با سلام و تشکر از توجه شما
کجای آموزش این اشتباه را دیدید؟
سلام.چه طوری میشه وقفه داخلی(نرم افزاری) ایجاد کرد؟
من می خواهم همواره در طول اجرای برنامه چک کند که اگر wifi قطع شد بیا و اینترنت رو دوباره وصل کن.
مثلا برنامه درحال روشن کردن یک چیزی است ولی یکدفعه اینترنت قطع می شود پس میکرو اول بیاید روشن کردن ان وسیله را قطع کند و سپس اینترنت را وصل کند و سپس دوباره بیاید و ان وسیله را روشن کند.
و بردمesp8266 است
ممنون می شوم راهنمایی ام کنید
۱ ) فرض کنید میکروکنترلر شما در حال اجرای برنامه اصلی ) Main Program ( میباشد. سپس یک وقفه
خارجی به سیستم وارد میشود )مانند فشردن یک کلی د( ، در این حالت میکروکنترلر شما برنامه اصلی را
متوقف کرده و تابع وقف ه ) ISR ( را اجرا م یکن د. اگر در حین اجرای تابع وقفه میکروکنترلر دوباره دچار
وقفه شود، عملکرد سیستم به چه صورت خواهد بود ؟ به طور کامل توضیح دهید .
۲ ) اگر تعداد وقفههای تو در تو بیش از دو تا باشد، سیستم چه واکنشی از خود نشان م یده د؟ )در صورتی
که بیش از دو پایه به عنوا ن وقفه در میکروکنترلر شما وجود داشته باش د(