سیستم عامل بلادرنگ FreeRTOS بخش هفتم (Mutex)

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

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

در این آموزش نحوه استفاده از mutex را مشاهده خواهیم کرد. و همچنین تفاوت یک mutex و یک semaphore binary را برای شما توضیح خواهیم داد.

ما یک هندلر mutex (SimpleMutex) ،  با دو تسک ایجاد کرده ایم و توابع تسک را تعریف کرده ایم.

در کنار آن ، یک تابع (Send_Uart  ) وجود دارد ، که ابتدا mutex را معادل می کند ، ۲ ثانیه منتظر می ماند ، داده ها را به UART می فرستد ، و mutex را منتشر می کند.

هر دوی آنها با عملکرد ، Send_Uart ارتباط برقرار می کنند. حال باید دید که آیا تسک اولویت بالا (HPT) می تواند بر تسک اولویت متوسط (MPT ) را غلبه کند در حالی که MPT MUTEX را نگه دارد.

ما MUTEX را به همراه دو تسک با اولویت های مختلف ایجاد کرده ایم. و در آخر زمانبندی (scheduler ) شروع می شود.

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

این یک عمل بسیار ساده از Mutex بود. و این دقیقاً همان کاری است که یک سمافور باینری نیز انجام می دهد.

 

وارونگی اولویت در Semaphore

این بار ما یک هندلر را برای نمایش سمافور باینری نیز تعریف کرده ایم (BinSemaphore ) همچنین همه سه تسک اکنون استفاده می شود. هر دو mutex و semaphore به همراه سه تسک از اولویت های مختلف ایجاد شده اند. و در آخر برنامه زمانبندی (scheduler ) شروع می شود.

بیایید خروجی موارد فوق را ببینیم:

 

اولویت بندی با Mutex

در عملکرد Send_Uart ، به جای گرفتن Semaphore ، اکنون Mutex را می گیریم. بقیه کد دقیقاً همان طور که هست باقی می ماند.

بیایید اکنون خروجی را ببینیم:

همان طور که در بالا نشان داده شد ، هنگامی که LPT دارای Mutex است و HPT سعی در پیشگیری از آن دارد ، اولویت LPT به HPT افزایش می یابد. این سناریو به عنوان PRIORITY INHERITANCE  نامیده می شود زیرا LPT اولویت تسک بالاترین اولویت ، یعنی منتظر Mutex می ماند. که در این حالت HPT است.

اکنون MPT نمی تواند LPT را مقدم بداند ، زیرا اولویت آن بالاتر از MPT است و اجرای آن طبق برنامه ریزی پیش می رود.


جهت دانلود این پروژه به لینک زیر مراجعه کنید:

FreeRTOS_Part07_Mutex