نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی پرتال اطلاعاتی

وقفه ها و موارد خاص. نمونه های وقفه

مکانیسم اولویت (PM) نشان می دهد که کدام دستگاه ها باید ابتدا سرویس شوند. MP وظایف زیر را حل می کند:

    اولویت هر برنامه ای که توسط پردازنده اجرا می شود را رفع می کند.

    RFP را از VU با بالاترین اولویت شناسایی می کند.

    به برنامه اجازه می دهد در صورت وقوع یک درخواست با اولویت بالا قطع شود.

قطع کردن روال سرویس وقفه، وقفه تودرتو نامیده می شود.

برنج. 6.4 نمونه ای از CPU در حالت وقفه تو در تو.

شکل 6.4 نمونه ای از وقفه تودرتو را نشان می دهد:

    قبل از تی 1 بدون حقوق

    تی 1 → RFP از VU4

    تی 2 → RFP از VU3

    تی 3 → RFP از VU2

    تی 4 → تعمیر و نگهداری VU2 تکمیل شده است

    تی 5 → RFP از VU1

    تی 6 → تعمیر و نگهداری VU1 تکمیل شده است

    تی 7 → تعمیر و نگهداری کامل VU3

    تی 8 → تعمیر و نگهداری VU4 ​​تکمیل شده است

نقطه ضعف: با فرکانس بالای دریافت حقوق، CPU به طور موثر کار نمی کند، زیرا زمان زیادی از CPU صرف ZP، بازیابی رجیسترهای پردازنده، انتقال از یک برنامه به برنامه دیگر می شود.

با روشن کردن حافظه بافر می توانید فرکانس ZP را کاهش دهید.

هنگام تخصیص اولویت ها به VU، شرایط زیر در نظر گرفته می شود:

    هرچه سرعت دستگاه بیشتر باشد، اولویت بیشتری به آن اختصاص می یابد.

    بالاترین اولویت به دستگاهی اختصاص داده می شود که داده ها را نمی توان از آن بازیابی کرد (معمولا یک تایمر).

    در خانواده کامپیوتر مکینتاشاولویت برنامه در کلمه دوم VI مشخص شده است.

    در خانواده کامپیوتر IBMکامپیوتراولویت برنامه با استفاده از یک LSI ویژه (مدار مجتمع بزرگ) - یک کنترل کننده وقفه قابل برنامه ریزی تنظیم می شود.

اجرای فنی وقفه های بردار اولویت تو در تو چند سطحی در یک کامپیوتر بر اساس یک کانال مبادله داده تک بون.

پیاده سازی VIهای چند سطحی در کامپیوترهای خانوادهIBM .

برای اجرای چند سطحی VI در یک کامپیوتر خانواده IBM LSI را اعمال کرد اینتل 8259آ.

مشخصات bis Intel 8259a.

    تعداد سطوح RFP = 8.

    تعداد سطوح را می توان با ریز مدارهای آبشاری به 64 افزایش داد

    حالت خدمات حقوق، سطوح اولویت، WUA به صورت برنامه ریزی شده تنظیم می شوند.

    پیاده سازی فنی وقفه های برداری اولویت در یک کامپیوتر با کانال های تبادل داده های ترانک ایزوله (خانواده IBMAT: حالت های عملکرد کنترل کننده وقفه قابل برنامه ریزی (SCP)،

نمودار اتصال کنترل پنل به گذرگاه سیستم،

طرح اتصال کنترل پنل به گذرگاه سیستم VU.

برنج. 6.7 طرح اتصال کنترل پنل به باس سیستم و کنترل پنل.

تخصیص پین LSI:

    دی7- دی0 - خروجی های استپر موتور، برای دریافت اطلاعات کنترل از CPU و انتقال اطلاعات وضعیت به CPU استفاده می شود.

    آ0 - ورودی آدرس، آدرس دهی رجیسترهای داخلی کنترلر (2 آدرس).

    ~ Cs (تراشه انتخاب کنید) - انتخاب یک کریستال، ارتباط کنترل کننده با گذرگاه سیستم را فعال یا غیرفعال می کند.

    • ~Cs= 0 - یک اتصال وجود دارد، ~ Cs= 1 - بدون اتصال.

اولین کنترل پنل از آدرس ها استفاده می کند - 20 ساعت, 21 ساعت.

کنترل پنل دوم از آدرس ها استفاده می کند - آ0 ساعت, آ1 ساعت.

    ~ RD, ~ WR- ورودی، خروجی (سیگنال های ShU)، به خطوط اصلی متصل می شوند ~ IORو ~IOW.

    INT(خروجی) - سیگنال ZP به CPU.

    ~ INTA (تأیید وقفه)- سیگنال RP از CPU.

    CAS2, CAS1, CAS0 - اتوبوس آبشاری برای کنترل کننده اصلی وقفه، این خطوط خروجی و برای Slave، ورودی هستند.

    ~ SP/~ RU- نشان دهنده اصلی (1) یا slave (0) کنترل پنل است.

    IR0... IR7 - ورودی درخواست های وقفه از VU.

ترکیب عملکردی و مدل برنامه کنترل پنل.

قطع کنید- این تغییر در نظم طبیعی اجرای برنامه است که با نیاز سیستم به پاسخگویی به عملکرد دستگاه های خارجی و همچنین خطاها و موقعیت های ویژه ای که در طول اجرای برنامه ایجاد می شود همراه است. این یک برنامه ویژه نامیده می شود - کنترل کننده وقفه، مخصوص هر موقعیتی که به وجود آمده است که پس از اجرای آن عملیات برنامه قطع شده از سر گرفته می شود.

مکانیسم وقفه توسط سخت افزار و نرم افزار مناسب کامپیوتر ارائه می شود.

طبقه بندی وقفه در شکل نشان داده شده است. 7.1.


برنج. 7.1.

درخواست های وقفه سخت افزاری به طور ناهمزمان با توجه به عملکرد ریزپردازنده ایجاد می شود و با عملکرد دستگاه های خارجی مرتبط است.

درخواست از وقفه های غیر قابل پوششبه در ورودی می رسد NMIریزپردازنده است و توسط نرم افزار قفل نمی شود. معمولاً این ورودی برای درخواست وقفه از مدارهای کنترل برق یا خطاهای کشنده ورودی / خروجی استفاده می شود.

برای پرس و جو وقفه های پوشیده شدهورودی INT ریزپردازنده استفاده می شود. رفتار درخواست وقفهدر این ورودی را می توان با پاک کردن بیت IF در مسدود کرد ثبت پرچمریزپردازنده

نرم افزار قطع می کندبه طور دقیق، استثنا یا موارد خاص نامیده می شوند. آنها با موقعیت های خاصی که در حین اجرای برنامه ایجاد می شوند (فقدان صفحه در RAM، نقض حفاظت، سرریز)، یعنی با موقعیت هایی که برنامه نویس نمی تواند پیش بینی کند، یا با وجود یک دستور ویژه INT n در ارتباط هستند. برنامه ای که توسط برنامه نویس برای فراخوانی توابع سیستم عامل یا BIOS که کار با دستگاه های خارجی را پشتیبانی می کنند استفاده می شود. در ادامه، هنگام بحث در مورد کار سیستم وقفه، برای وقفه ها و استثناهای سخت افزاری از عبارت واحد «وقفه» استفاده می کنیم، مگر اینکه خلاف آن مشخص شده باشد.

وقفه های نرم افزاری از انواع زیر هستند.

نقض (انکار)- یک مورد خاص که ریزپردازنده می تواند قبل از وقوع خطای واقعی آن را تشخیص دهد (به عنوان مثال، عدم وجود صفحه در RAM). پس از پردازش تخلف، برنامه با راه اندازی مجدد دستوری که باعث نقض شده است، اجرا می شود.

دام- یک مورد خاص که پس از پایان اجرای دستور شناسایی می شود (به عنوان مثال، وجود دستور INT n در برنامه یا پرچم تنظیم شده TF در ثبت پرچم). پس از پردازش این وقفه، اجرای برنامه با دستور بعدی ادامه می یابد.

تصادف در(خروج از فرآیند) آنقدر خطای جدی است که برخی از زمینه های برنامه از بین رفته و ادامه آن غیرممکن است. تعیین علت حادثه غیرممکن است، بنابراین برنامه از پردازش حذف می شود. هشدارها شامل خطاهای سخت افزاری و مقادیر ناسازگار یا نامعتبر در جداول سیستم هستند.

دستور رسیدگی را قطع کنید

وقفه ها و استثناها در مرزهای دستورالعمل تشخیص داده می شوند و برنامه نویس ممکن است به وضعیت ثبت کار داخلی و دستگاه های خط لوله اهمیتی ندهد.

در پاسخ به درخواست های وقفه، ریزپردازنده باید منبع خود را شناسایی کند، حداقل زمینه برنامه فعلی را حفظ کند و به یک برنامه خاص - کنترل کننده وقفه، تغییر مکان دهد. پس از انجام سرویس وقفه، MP به برنامه قطع شده برمی گردد و باید طوری از سر گرفته شود که انگار وقفه ای وجود نداشته است.

پردازش درخواست وقفه شامل موارد زیر است:

  • اقدامات "بازتابی" پردازنده، که برای همه وقفه ها و موارد خاص یکسان است و برنامه نویس نمی تواند آنها را کنترل کند.
  • اجرای کنترل کننده ایجاد شده توسط برنامه نویس.

برای اینکه ریزپردازنده بتواند منبع وقفه را شناسایی کند و کنترل کننده مربوط به درخواست دریافتی را پیدا کند، به هر درخواست وقفه شماره مخصوص به خود اختصاص داده می شود. نوع وقفه).

نوع وقفهبرای نرم افزار قطع می کندمعرفی شده از داخل ریزپردازنده؛ به عنوان مثال، صفحه خارج از حافظه وقفه از نوع 14 است. برای وقفه های فراخوانی شده توسط دستورالعمل INT n، نوع در خود دستورالعمل موجود است. برای وقفه های سخت افزاری پوشانده شده، نوع از وارد می شود کنترل کننده وقفه اولویتدر گذرگاه داده وقفه غیر قابل پوششنوع 2 اختصاص داده شده است.

در کل، ریزپردازنده 256 را متمایز می کند انواع وقفه... بنابراین، همه آنها می توانند در 1 بایت رمزگذاری شوند.

اقدامات "رفلکس" ریزپردازنده در پردازش درخواست وقفهتوسط سخت افزار MP انجام می شود و شامل:

  • تعریف نوع وقفه ;
  • ذخیره متن برنامه قطع شده (برخی اطلاعات که به شما امکان می دهد به برنامه قطع شده بازگردید و اجرای آن را ادامه دهید). حداقل رجیسترها همیشه به صورت خودکار ذخیره می شوند EIPو CS، تعیین نقطه بازگشت به برنامه قطع شده، و ثبت پرچم EFLAGS. اگر یک کنترل کننده وقفه با استفاده از گیت وظیفه فراخوانی شود، بخش وضعیت TSS وظیفه قطع شده به طور کامل در حافظه ذخیره می شود.
  • تعریف آدرس کنترل کننده وقفهو انتقال کنترل به اولین فرمان این هندلر.

پس از آن، برنامه اجرا می شود - کنترل کننده وقفهمطابق با درخواست دریافت شده این برنامه توسط یک برنامه نویس برنامه یا سیستم نوشته شده و در حافظه قرار می گیرد. کنترل کننده وقفه باید با دستور I پایان یابد RET، که در طول آن انتقال به ادامه برنامه قطع شده با بازیابی زمینه آن به طور خودکار اتفاق می افتد.

برای فراخوانی کنترل کننده وقفه، ریزپردازنده هنگام کار در حالت واقعیاستفاده می کند جدول برداری وقفهو در حالت محافظت شده - جدول توصیفگر وقفه.


برنج. 7.3.

محتویات رجیستر IDTr در بخش های TSS ذخیره نمی شود و با تغییر کار تغییر نمی کند. برنامه ها نمی توانند دسترسی داشته باشند IDTاز آنجا که تنها بیت TI نشانگر جدول v انتخابگربخش فقط بین جداول انتخاب می کند Gdtو LDT.

حداکثر محدودیت برای جدول توصیفگر وقفه 256 * 8 - 1 = 2047 است.

امکان تنظیم حد پایین تر وجود دارد، اما این توصیه نمی شود. اگر به دستگیره خارج از محدوده دسترسی داشته باشید IDT، پردازنده تا زمانی که سیگنالی را در ورودی دریافت کند وارد حالت خاموش شدن می شود NMIیا تنظیم مجدد

V IDTفقط توصیفگرهای انواع زیر را می توان ذخیره کرد:

  • دروازه تله،
  • دروازه وقفه، دروازه وظیفه.

تایمر نگهبان

اغلب، نویز الکتریکی تولید شده توسط تجهیزات اطراف باعث می شود که میکروکنترلر آدرس اشتباهی را نشان دهد، پس از آن رفتار آن غیرقابل پیش بینی می شود (ریزکنترلر "خارج از کنترل" است). برای نظارت بر چنین شرایطی، تایمرهای نگهبان اغلب در میکروکنترلر گنجانده می شوند.

این دستگاه در صورتی که محتویات آن در مدت زمان معینی (معمولاً از ده ها میلی ثانیه تا چند ثانیه) به روز نشود، باعث ریست شدن میکروکنترلر می شود. اگر تغییر محتوای پیشخوان برنامه با برنامه مشخص شده مطابقت نداشته باشد، دستور اصلاح تایمر Watchdog اجرا نمی شود. در این حالت، تایمر نگهبان، میکروکنترلر را بازنشانی کرده و آن را به حالت اولیه خود تنظیم می کند.

بسیاری از توسعه دهندگان از تایمرهای نگهبان در برنامه های خود استفاده نمی کنند، زیرا نیازی به استفاده از آنها برای مبارزه با اثرات نویز الکتریکی نمی بینند، به عنوان مثال، هنگام قرار دادن یک میکروکنترلر در یک نمایشگر پرتو کاتدی در نزدیکی یک ترانسفورماتور که میرایی را فراهم می کند. مسیر برگشت تیر، یا کنار کویل های جرقه زنی در خودرو. در الکترونیک مدرن، اغتشاشات الکتریکی بعید به نظر می رسد، اگرچه گاهی اوقات در موقعیت هایی مانند موارد ذکر شده در بالا رخ می دهند.

استفاده از تایمر نگهبان برای پنهان کردن مشکلات نرم افزاری توصیه نمی شود. در حالی که این تایمر می تواند احتمال خطاهای نرم افزاری را کاهش دهد، بعید است که تمام دلایل احتمالی خطا را از بین ببرد. به جای تکیه بر سخت افزار برای جلوگیری از اشکالات نرم افزاری، بهتر است نرم افزار را در موقعیت های مختلف با دقت بیشتری تست کنید.

بسیاری از کاربران بر این باورند که وقفه‌ها سخت‌افزاری هستند که بهتر است به حال خود رها شوند، زیرا استفاده از آن‌ها به دانش عالی پردازنده برای توسعه یک کنترل کننده وقفه نیاز دارد. در غیر این صورت، هنگامی که یک وقفه رخ می دهد، سیستم "به خواب می رود" یا "پدال" می شود. این احساس معمولاً پس از تجربه وقفه‌ها برای رایانه شخصی به توسعه‌دهنده می‌رسد که دارای تعدادی ویژگی است که ایجاد یک کنترل کننده وقفه را دشوار می‌کند. بسیاری از این مشکلات در سخت افزار مبتنی بر میکروکنترلر رخ نمی دهد. استفاده از وقفه در این تجهیزات می تواند طراحی و کاربرد آن را بسیار ساده کند.

اگر هرگز با وقفه ها برخورد نکرده اید، این سوال پیش می آید - چیست؟ در یک سیستم کامپیوتری، وقفه راه‌اندازی یک برنامه فرعی ویژه (به نام «کنترل وقفه» یا «روال سرویس وقفه») است که توسط یک سیگنال سخت‌افزاری راه‌اندازی می‌شود. در حین اجرای این زیربرنامه، اجرای برنامه جاری متوقف می شود. اصطلاح درخواست وقفه به این دلیل استفاده می شود که گاهی اوقات برنامه از تایید وقفه و اجرای فوری کنترل کننده وقفه امتناع می ورزد (شکل 2.19).


وقفه در یک سیستم کامپیوتری شبیه به وقفه در زندگی روزمره است. یک مثال کلاسیک از این وقفه، تماس تلفنی هنگام تماشای یک برنامه تلویزیونی است. وقتی تلفن زنگ می زند، سه گزینه دارید. اولین مورد این است که تماس را نادیده بگیرید. دوم این است که به تماس پاسخ دهید، اما بگویید که بعداً تماس خواهید گرفت. سوم پاسخ به تماس، به تعویق انداختن تمام امور جاری است. سیستم کامپیوتری همچنین دارای سه پاسخ از این قبیل است که می تواند در پاسخ به درخواست سخت افزار خارجی مورد استفاده قرار گیرد.

اولین پاسخ ممکن - "به یک وقفه پاسخ ندهید تا زمانی که کار فعلی کامل نشده است" - با غیرفعال کردن (پوشاندن) سرویس درخواست وقفه اجرا می شود. پس از تکمیل کار، یکی از دو گزینه ممکن است: تنظیم مجدد ماسک و فعال کردن سرویس، که منجر به تماس با کنترل کننده وقفه می شود، یا تجزیه و تحلیل ارزش بیت ها ("نظرسنجی"). نشان دهنده رسیدن درخواست های وقفه و اجرای مستقیم برنامه سرویس بدون فراخوانی کنترل کننده وقفه است. این روش مدیریت وقفه زمانی استفاده می‌شود که نیاز به ارائه زمان اجرای مشخصی از برنامه اصلی باشد، زیرا هر وقفه می‌تواند اجرای رابط مورد نیاز را نقض کند.

برنج. 2.18 - اجرای وقفه.

پوشاندن طولانی‌مدت وقفه‌ها توصیه نمی‌شود، زیرا در این مدت چندین رویداد که باعث وقفه می‌شود ممکن است با هم همپوشانی داشته باشند و تنها یکی از آنها شناسایی می‌شود. مدت زمان مجاز پوشش بستگی به کاربرد خاص میکروکنترلر و نوع و فرکانس چنین رویدادهایی دارد. توصیه نمی شود وقفه ها را برای مدتی بیشتر از نیمی از حداقل دوره مورد انتظار توالی رویدادهایی که درخواست وقفه دارند غیرفعال کنید.

کنترل کننده وقفه همیشه دنباله ای از اقدامات زیر را ارائه می دهد:

2. کنترل کننده وقفه و سخت افزاری که باعث درخواست شده است را بازنشانی کنید.

3. داده ها را پردازش کنید.

4. محتویات ثبات های زمینه را بازیابی کنید.

5. به برنامه قطع شده برگردید.

ثبات های زمینه، ثبات هایی هستند که وضعیت اجرای فعلی برنامه اصلی را تعیین می کنند. معمولاً اینها شامل شمارنده برنامه، ثبت وضعیت و انباشته‌ها می‌شود. سایر رجیسترهای پردازنده، مانند ثبات های فهرست، می توانند در حین پردازش وقفه استفاده شوند، بنابراین محتویات آنها نیز باید ذخیره شود. همه رجیسترهای دیگر مختص یک میکروکنترلر خاص و کاربرد آن هستند.

پس از تنظیم مجدد، کنترل کننده وقفه آماده پذیرش درخواست بعدی است و تجهیزات ایجاد کننده وقفه در صورت لزوم آماده ارسال درخواست هستند. اگر یک درخواست وقفه جدید وارد شود، رجیستر پوشش وقفه پردازنده از پردازش وقفه جلوگیری می کند، اما ثبت وضعیت وقفه این درخواست را دریافت می کند و منتظر سرویس آن می ماند. پس از تکمیل پردازش وقفه فعلی، ماسک وقفه پاک می شود و درخواست تازه دریافت شده برای پردازش ارسال می شود.

اجرای وقفه های تودرتو با برخی از انواع میکروکنترلرهایی که پشته ندارند، دشوار است. این وقفه ها همچنین می توانند باعث مشکلات سرریز پشته شوند. مشکل سرریز برای میکروکنترلرها به دلیل مقدار محدود حافظه و پشته داده آنها مرتبط است: دنباله ای از وقفه های تودرتو می تواند منجر به این واقعیت شود که داده های بیشتری از حد مجاز به پشته منتقل می شود.

در نهایت، وقفه پردازش می شود. مثال دوم تلویزیون نشان می دهد که شما می توانید به سرعت به درخواست وقفه با پذیرش داده های لازم پاسخ دهید، که پس از حل مشکل فعلی استفاده می شود. در میکروکنترلرها، این کار با ذخیره داده های دریافتی در یک آرایه حافظه و سپس پردازش آنها پس از اتمام اجرای برنامه اصلی انجام می شود. این روش خدمات سازش خوبی بین مدیریت فوری وقفه به طور کامل، که می تواند زمان زیادی طول بکشد، و نادیده گرفتن وقفه است، که می تواند منجر به از دست رفتن اطلاعات در مورد رویدادی شود که باعث وقفه شده است.

بازیابی رجیسترهای متن و اجرای دستور بازگشت وقفه، پردازنده را به حالت قبل از وقوع وقفه باز می‌گرداند.

در نظر بگیرید که وقتی یک وقفه پردازش می شود چه اتفاقی برای محتویات ثبات های مختلف می افتد. محتویات ثبت وضعیت معمولاً قبل از پردازش وقفه به طور خودکار با محتویات پیشخوان نرم افزار ذخیره می شود. این کار نیازی به ذخیره برنامه‌نویسی آن در حافظه با استفاده از دستورالعمل‌های انتقال و سپس بازیابی آن پس از بازگشت به برنامه اصلی را از بین می‌برد. با این حال، چنین صرفه جویی خودکار در همه انواع میکروکنترلرها اجرا نمی شود، بنابراین، باید به سازماندهی مدیریت وقفه توجه ویژه ای شود.

اگر محتویات ثبت وضعیت قبل از شروع اجرای کنترل کننده وقفه ذخیره شود، در دستور بازگشت به طور خودکار بازیابی می شود.

اگر هنگام اجرای سرویس وقفه، محتویات سایر رجیسترهای پردازنده تغییر کند، باید قبل از تغییر در حافظه ذخیره شود و قبل از بازگشت به برنامه اصلی بازیابی شود. حفظ تمام رجیسترهای پردازنده برای جلوگیری از خطاهای غیرقابل پیش بینی که بومی سازی آنها بسیار دشوار است، معمول است.

آدرسی که هنگام پرش به کنترل کننده وقفه در شمارنده برنامه بارگذاری می شود "بردار وقفه" نامیده می شود. چندین نوع بردار وجود دارد. آدرسی که هنگام راه اندازی میکروکنترلر (ریست) در شمارنده برنامه بارگذاری می شود "بردار تنظیم مجدد" نامیده می شود. بردارهای مختلفی را می توان برای وقفه های مختلف مشخص کرد که نیاز به روتین سرویس برای تعیین علت وقفه را از بین می برد. استفاده از یک بردار توسط وقفه های مختلف معمولاً برای میکروکنترلرها مشکلی ایجاد نمی کند، زیرا اغلب میکروکنترلر یک برنامه واحد را اجرا می کند. تفاوت میکروکنترلر با یک کامپیوتر شخصی که در حین کار با آن می توان منابع مختلفی از وقفه ها را اضافه کرد. (اگر تا به حال دو دستگاه را به COM1 و COM3 متصل کرده اید، پس می دانید که این در مورد چیست). در میکروکنترلری که سخت افزار آن به خوبی شناخته شده است، در اشتراک گذاری بردارهای وقفه نباید مشکلی وجود داشته باشد.

آخرین چیزی که باید در نظر بگیرید وقفه های نرم افزاری است. دستورالعمل های پردازنده وجود دارد که می توان از آنها برای شبیه سازی وقفه های سخت افزاری استفاده کرد. واضح‌ترین کاربرد این دستورات فراخوانی روتین‌های سیستمی است که در یک مکان دلخواه در حافظه قرار دارند یا برای دسترسی به آنها نیاز به پرش‌های بین‌بخشی دارند. این ویژگی در خانواده ریزپردازنده‌های اینتل i86 پیاده‌سازی شده است و در سیستم‌های ورودی/خروجی پایه (BIOS) و سیستم عامل DOS رایانه‌های شخصی برای فراخوانی روال‌های سیستم بدون نیاز به تعمیر نقطه ورودی استفاده می‌شود. درعوض، بردارهای وقفه متفاوتی برای انتخاب دستوری که باید در زمان وقوع چنین وقفه نرم افزاری اجرا شود، استفاده می شود.

شاید پس از خواندن این فصل، مکانیسم وقفه برای شما قابل درک تر شود یا برعکس. فقط بیشتر گیج خواهید شد. شرح هر میکروکنترلر نشان می دهد که چگونه استفاده از وقفه ها می تواند کاربرد آن را ساده کند.

موقعیتی وجود دارد که شما نیاز دارید کارهای مختلف زیادی را روی یک دستگاه جانبی آویزان کنید، اما تنها یک مورد وجود دارد و باید کاری در مورد آن انجام شود.

یک مثال ساده یک تایمر و وقفه سرریز آن است.
ما می توانیم سرعت شاتر و وقفه را برای انجام برخی عملیات تنظیم کنیم. اما اگر در یک لحظه از زمان بخواهیم تایمر وقفه یک عملیات را انجام دهد و سپس یک عملیات دیگر را انجام دهد. بله، به میزان لازم، بسته به ایالت. و تنها یک بردار وجود دارد.

یا مثلا USART. بسته به حالت وقفه هنگام ورود یک بایت، ممکن است به راحتی نیاز به اجرای کدهای مختلف داشته باشیم. در یک حالت - صدور سلام، در حالت دیگر - ارسال فحاشی به حمام. در سومی ضربه به سر. و تنها یک بردار وجود دارد.

البته می توانید یک ساختار سوئیچ کیس را به کنترل کننده وقفه اضافه کنید و با انتخاب حالت، به قسمت مورد نظر کد بروید، اما این کاملاً دست و پا گیر است و مهمتر از همه اینکه بسته به اینکه زمان انتقال متفاوت خواهد بود. ترتیبی که نظرسنجی مقایسه سوئیچ-مورد ساختارها را طی خواهد کرد.

یعنی در یک سوئیچ از فرم:

1 2 3 4 5 6 7 سوئیچ (x) (1: اقدام 1 2: اقدام 2 3: اقدام 3 4: اقدام 4)

سوئیچ (x) (1: اقدام 1 2: اقدام 2 3: اقدام 3 4: اقدام 4)

یک مقایسه متوالی x، ابتدا با 1، سپس با 2، سپس با 3، و به همین ترتیب تا زمانی که همه گزینه ها شمارش شوند، وجود خواهد داشت. در این حالت، واکنش به Action 1 سریعتر از واکنش به Action 4 خواهد بود. این امر به ویژه هنگام محاسبه فواصل زمانی دقیق روی تایمر مهم است.

اما یک راه حل ساده برای این مشکل وجود دارد - پرش شاخص. کافی است قبل از اینکه منتظر بمانیم تا وقفه از قبل در متغیرها بارگذاری شود (یا می توانید مستقیماً در ثبت شاخص Z) جهتی را که باید بردار خود را تغییر مسیر دهیم و پرش شاخص را در کنترل کننده وقفه وارد کنیم، کافی است. و وایلا! انتقال در جایی خواهد بود که شما نیاز دارید، بدون هیچ مقایسه ای بین گزینه ها.

در حافظه، متغیرهایی را برای یک بردار شناور ایجاد کنید:

Timer0_Vect_L: .byte 1; دو بایت آدرس، High و Low Timer0_Vect_H: .byte 1

آماده شدن برای منتظر ماندن برای یک وقفه ساده است، ما متغیر خود را با آدرس مورد نظر می گیریم و بارگذاری می کنیم

CLI; بخش بحرانی وقفه OFF LDI R16، کم (Timer_01)؛ آدرس را بگیرید و STS Timer0_Vect_L, R16 را ذخیره کنید. آن را به یک سلول حافظه. LDI R16، High (Timer_01)؛ به طور مشابه، اما با بردار ارشد STS Timer0_Vect_H، R16 SEI. وقفه روشن است

تمام است، می توانید تایمر را راه اندازی کنید و منتظر وقفه ما باشید. در موارد دیگر هم همینطور است.

و هندلر به این صورت است:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 ؛ ===============================; وارد کردن وقفه سرریز از Timer0؛ ============================ TIMER_0: PUSH ZL; ثبت فهرست را در پشته PUSH ZH ذخیره کنید. از آنجا که ما از آن PUSH R2 استفاده می کنیم. R2 را ذخیره کنید، زیرا ما آن را نیز در R2، SREG خراب می کنیم. ثبت پرچم PUSH R2 را بازیابی و ذخیره کنید. اگر این کار را انجام ندهید، 100٪ اشکالات LDS ZL، Timer0_Vect_L را دریافت خواهید کرد. بارگذاری آدرس بردار جدید LDS ZH، Timer0_Vect_H. هر دو بایت CLR R2; R2 OR R2, ZL را پاک می کنیم. بررسی بردار برای صفر. در غیر این صورت، بیایید آنالوگ OR R2، ZH را درک کنیم. بازنشانی "a. چک از طریق عملیات OR BREQ Exit_Tm0 می رود؛ با انباشته شدن نتیجه در R2؛ بنابراین محتویات Z را خراب نمی کنیم و مجبور نیستیم؛ دوباره آن را بارگذاری کنید IJMP؛ با یک بردار جدید ترک می کنیم. ؛ از وقفه خارج شوید Exit_Tm0: POP R2؛ ثبت پرچم OUT SREG، R2 POP R2 را خارج کرده و بازیابی می کنیم؛ R2 POP ZH را بازیابی می کنیم؛ بازیابی Z POP ZL RETI؛ بردار اضافی 1 Timer_01: NOP؛ اینها بردارهای NOP جدید ما هستند. در اینجا ما می‌توانیم هر کاری را NOP انجام دهیم؛ ترجیحاً نه برای مدت طولانی - در وقفه NOP؛ اگر از هر NOP دیگری استفاده می‌کنیم؛ رجیسترها، آن‌ها را نیز در پشته RJMP Exit_Tm0 ذخیره می‌کنیم؛ این یک انتقال برای خروج از وقفه است؛ به‌ویژه از طریق انجام می‌شود. RJMP به طوری که؛ بردار اضافی 2؛ ده بایت را در کد برگشتی ذخیره کنید :))) Timer_02: NOP NOP NOP NOP NOP RJMP Exit_Tm0؛ بردار اضافی 3 Timer_03: NOP NOP NOP NOP NOP RJMP Exit_Tm0

؛ ===============================; وارد کردن وقفه سرریز از Timer0؛ ============================ TIMER_0: PUSH ZL; ثبت فهرست را در پشته PUSH ZH ذخیره کنید. از آنجا که ما از آن PUSH R2 استفاده می کنیم. R2 را ذخیره کنید، زیرا ما آن را نیز در R2، SREG خراب می کنیم. ثبت پرچم PUSH R2 را بازیابی و ذخیره کنید. اگر این کار را انجام ندهید، 100٪ اشکالات LDS ZL، Timer0_Vect_L را دریافت خواهید کرد. بارگذاری آدرس بردار جدید LDS ZH، Timer0_Vect_H. هر دو بایت CLR R2; R2 OR R2, ZL را پاک می کنیم. بررسی بردار برای صفر. در غیر این صورت، بیایید آنالوگ OR R2، ZH را درک کنیم. بازنشانی "a. چک از طریق عملیات OR BREQ Exit_Tm0 می رود؛ با انباشته شدن نتیجه در R2؛ بنابراین محتویات Z را خراب نمی کنیم و مجبور نیستیم؛ دوباره آن را بارگذاری کنید IJMP؛ با یک بردار جدید ترک می کنیم. ؛ از وقفه خارج شوید Exit_Tm0: POP R2؛ ثبت پرچم OUT SREG، R2 POP R2 را خارج کرده و بازیابی می کنیم؛ R2 POP ZH را بازیابی می کنیم؛ بازیابی Z POP ZL RETI؛ بردار اضافی 1 Timer_01: NOP؛ اینها بردارهای NOP جدید ما هستند. در اینجا ما می‌توانیم هر کاری را NOP انجام دهیم؛ ترجیحاً نه برای مدت طولانی - در وقفه NOP؛ اگر از هر NOP دیگری استفاده می‌کنیم؛ رجیسترها، آن‌ها را نیز در پشته RJMP Exit_Tm0 ذخیره می‌کنیم؛ این یک انتقال برای خروج از وقفه است؛ به‌ویژه از طریق انجام می‌شود. RJMP به طوری که؛ بردار اضافی 2؛ ده بایت را در کد برگشتی ذخیره کنید :))) Timer_02: NOP NOP NOP NOP NOP RJMP Exit_Tm0؛ بردار اضافی 3 Timer_03: NOP NOP NOP NOP NOP RJMP Exit_Tm0

پیاده سازی برای RTOS
اما اگر برنامه ما به گونه ای ساخته شده باشد که تمام کدها از طریق مدیر RTOS از طریق زنجیره وظایف بچرخند، چه؟ محاسبه این که چگونه این زنجیره ها در ارتباط با یکدیگر انجام می شوند، بسیار دشوار است. و هر یک از آنها می توانند سعی کنند تایمر را در اختیار بگیرند (البته نه خودسرانه، از زمان ارسال ما، ما در حال نوشتن برنامه هستیم، اما پیگیری به موقع دشواری همه چیز دشوار خواهد بود).
در محورهای اصلی مدرن، مکانیسم حذف متقابل برای این مورد وجود دارد - mutex. آن ها این یک نوع پرچم شلوغ است. اگر فرآیندی مثلاً با یک UART ارتباط برقرار کند، آنگاه فرآیند دیگری جرات نمی‌کند یک بایت را در آنجا بچسباند و با وظیفه‌شناسی منتظر می‌ماند تا اولین فرآیند UART را آزاد کند، که با یک پرچم نشان داده می‌شود.

در مورد من، مکانیسم های حذف متقابل وجود ندارد، اما می توان آنها را اجرا کرد. حداقل یک ظاهر حداقلی داشته باشید. من نمی‌خواهم اجرای کامل همه این آشغال‌ها را انجام دهم، زیرا هدف من حفظ اندازه هسته در 500-800 بایت است.
ساده ترین راه برای رزرو یک بایت بیشتر در حافظه، متغیر busy است. و هنگامی که یک فرآیند یک منبع را تصاحب می کند، در این متغیر زمانی را می نویسد که تقریباً آن را آزاد می کند. زمان به تیک تایمر سیستم می رود که من 1 میلی ثانیه دارم.
اگر هر فرآیند دیگری سعی کند به همان منبع سخت افزاری دسترسی پیدا کند، ابتدا به وضعیت کار خود نگاه می کند، مدت زمانی را که در آن مشغول خواهد بود حساب می کند و برای این مدت سیگار می کشد - خود را در صف تایمر بارگذاری می کند. آنجا او دوباره چک می کند و غیره. این ساده ترین گزینه است.

مشکل اینجاست که اگر تعداد زیادی از افراد علاقه مند به یک بردار وجود داشته باشند، آنگاه این فرآیندها به دور و بر خود ادامه خواهند داد، مانند یک جوان کوبنده در اطراف تنها توالت میدان در طول جشن های تعطیلات. مثانه کسی تحمل نمی کند - الگوریتم خراب می شود. و چه کسی در اینجا انجیر دارد، می توانید حدس بزنید، tk. شبیه سازی آن دشوار خواهد بود.

راه حل مشکل اضافه کردن یک زنجیره معمولی دیگر است، این بار برای دسترسی به منبع. به طوری که او اصلاً بیکار نمی ماند. آن ها یکی بیرون پرید، سپس دومی، سومی، و به همین ترتیب تا زمانی که همه فرآیندها نیاز آنها به نوعی USART را برطرف کنند.
نقطه ضعف واضح است - یک صف دیگر حافظه اضافی، کد اضافی، زمان اضافی است. البته می توانید منحرف شوید و کد توزیع کننده زنجیره اصلی در صف را روی vector تنظیم کنید. اما در اینجا باید همه چیز را با دقت اشکال زدایی کنید، زیرا در حالت وقفه فراخوانی می شود! بله، و دست و پا گیر است، تنها زمانی لازم است که متقاضیان زیادی داشته باشیم.

راه حل دوم این است که متغیر busy time را کنار بگذارید و فقط Flag Busy! و فرآیندی که سعی در تماس با آن دارد برای سیگار کشیدن فرار نمی کند، بلکه چند مرحله به عقب می پرد - تا انتهای صف کار و بلافاصله پس می زند. افرادی که در اطراف توالت هستند در حال دویدن نیستند، بلکه آرنج های خود را در ورودی فشار می دهند، بر اساس این اصل که چه کسی اول از آن عبور می کند.
یکی دیگر از اشکالات، بار زیاد روی خط لوله اصلی است، یکسری درخواست‌ها برای صف‌بندی به سرعت در کل RAM افزایش می‌یابد و به پشته می‌رسد، و این مملو از یک آخرالزمان جهانی است.

البته، تایمر در اینجا به عنوان مثال آورده شده است، بسیاری از کارها را می توان با تایمر سیستم RTOS حل کرد، اما اگر به طور ناگهانی به گسستگی کمتر یا نرخ واکنش بالا به یک رویداد نیاز دارید (و نه در حالی که خط لوله اصلی کار را می کشد. به اعدام)، سپس مکانیسم وقفه های کنترل شده، IMHO، سپس که دکتر تجویز کرد.

مقالات مرتبط برتر