External interruot

سلام استاد وقتتون بخیر.
این کد رو روی میکرو پروگرم میکنم عینا همونطوری که شما توی فیلم انجام دادین.ولی گاهی با یک بار زدن btn ،حلقه دو بار اجرا میشه،در واقع وقتی دیباگ کردم وقفه رو دو بار اجرا کرد.یعنی 6 ثانیه چشمک زن بود.این کد خودش مگه بلاکینگ نیست؟چرا وقفه رو دوبار اجرا میکنه.
و اینکه sub priority کجا کاربرد داره دقیقا؟وقتی preemption ها یکی باشه،حتی اگه sub ها رو متفاوت بذاریم بازم اولویتی ایجاد نمیشه،توی فیلم هم همین اتفاق برای کد خودتون افتاد.
و اینکه توی refrence manual ی جدول نشون دادین برای اولویت وقفه ها،که مثلا نشون میاد وقفه خارجی 0 به 1 اولویت داره،1 به 2 و تا 4 همینطور.همچنین وقفه های 5 تا 9 توی یک اولویت هستن.من ی کد زدم و کلید ها رو


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

سلام و وقت بخیر
ببینید در مورد اینکه چرا گاهی اوقات 12 بار چشمک داریم و در واقع انگار دو بار کلید خورده، این کاملا طبیعی هستش. دلیل هم این هست که درسته که با دفعه اول زدن کلید اینتراپت اجرا میشه اما به خاطر نویزی که در زدن کلید ممکنه وجود داشته باشه ممکنه که میکرو این رو دو یا حتی تعداد بار بیشتری زده شدن کلید در نظر بگیره و این باعث میشه که زمانی که اجرای دفعه اول زده شدن کلید به پایان رسید شروع به اجرای زده شدن دوم کلید بکنه. این رو معمولا به صورت سخت افزاری با گذاشتن یک خازن موازی با کلید که باعث میشه ولتاژ دو سر کلید به صورت نرم بالا و پایین بره حل میکنند. البته روش های نرم افزاری و تنظیماتی هم براش وجود داره.
در مورد preemption و sub priority تفاوت در این هست که وقتی preemption متفاوت هست، اون اینتراپتی که عدد preemption کمتری داره میتونه اینتراپت دیگه رو متوقف کنه و در وسط اون اجرا بشه اما این موضوع برای sub priority صادق نیست و دو اینتراپت که preemtion یکسان با sub priority متفاوت دارن نمیتونن اجرای همدیگه رو متوقف کنند. کمکی که sub priority به ما میکنه این هستش که زمانی که اجرای یک اینتراپت تموم شد، میکروکنترلر ما برای اجرای اینتراپت بعدی با فرض اینکه مثلا دو اینتراپت در انتظار اجرا شدن هستن با preemtion یکسان، اونی رو انتخاب میکنه که sub priority کمتری داره.
در مورد سوال آخر هم در داخل اون جدول ما نشون ندادیم که پایه 0 به یک اولویت داره، صحبت اینجاست که سورس اینتراپت های 0 تا 4 با هم متفاوت هستش اما از 5 تا 9 یکسان هست. پس ما با استفاده از preemtion نمیتونیم بین پایه های 5 تا 9 اولویت اجرا شدن اینتراپت لحاظ کنیم اما بین پایه های 0 تا 4 به صورت مجزا میشه اولویت گذاشت، در واقع پایه های 5 تا 9 به دلیل سورس یکسان همیشه اولویت یکسان خواهند داشت.