آموزش FreeRTOS نحوه استفاده از میوتکس Mutex

آموزش FreeRTOS نحوه استفاده از میوتکس Mutex
میوتکس Mutex ها یکی از کارامدترین ابزارهای سیستم عامل ها برای کار با منابع اشتراکی هستند. زمانی که تسک های مختلف از منابع مشترکی استفاده می کنند، خطر تداخل استفاده همواره وجود دارد. برای جلوگیری از این مشکل ابزارها و روش های مختلفی وجود دارد. یکی از کارآمدترین ابزارها استفاده از میوتکس Mutex است که در این مطلب با نحوه ی استفاده از آن با سبک FreeRTOS آشنا می شویم.
در صورتی که با نحوه پیکربندی اولیه پروژه بر مبنای سیستم عامل آشنایی ندارید مقاله زیر را ببینید.
تعریف Handler برای Mutex
برای استفاده و دسترسی به میوتکس ها نیاز است که یک هندلر در اولین گام تعریف کنیم. به این صورت در هر لحظه می توانیم به میوتکس مدنظر در سیستم دسترسی داشته باشیم.
درکد زیر myMutexHandle به عنوان یک Handler برای میوتکس تعریف شده است.
- تعریف هندلر به سبک FreeRTOS
xSemaphoreHandle myMutexHandle;
- تعریف هندلر به سبک CMSIS-RTOS
osMutexId myMutexHandle;
ایجاد میوتکس Mutex
قبل از استفاده از میوتکس، نیاز است که آن را ایجاد کنیم و به هندلری که در گام قبل تعریف کردیم متصل کنیم. در کد زیر نحوه ی ایجاد میوتکس قابل مشاهده است.
- ایجاد میوتکس به سبک FreeRTOS
myMutexHandle = xSemaphoreCreateMutex();
- ایجاد میوتکس به سبک CMSIS-RTOS
osMutexDef(mutex1); myMutexHandle = osMutexCreate(osMutex(mutex1));
نحوه استفاده از میوتکس Mutex
از آنجایی که منبع اشتراکی، همانطور که از اسمش پیداست، در اشتراک با چند تسک است و تسک های مختلف می خواهند از آن منبع استفاده کنند، نیاز به رعایت یکسری قانون بین تسک هاست. قانون کلی به این صورت است …
- هر تسک که قصد دارد از منبع اشتراکی استفاده کند، تنها در صورتی که منبع در حال استفاده توسط تسک دیگری نباشد، می تواند به منبع اشتراکی دسترسی یابد.
- همینطور هر تسک که از منبع اشتراکی استفاده می کند باید توسط میوتکس آن را قفل کند تا تسک های دیگر امکان استفاده همزمان پیدا نکنند.
- هر تسک پس از استفاده از منبع اشتراکی، باید توسط میوتکس آن را آزاد کند و در اختیار سیستم قرار دهد تا مابقیه تسک ها نیز بتوانند از منبع اشتراکی استفاده کنند.
منبع اشتراکی چیست؟
منبع اشتراکی می تواند یک متغییر Global باشد که در دید همگان است. می تواند یکی از پریفرال ها مثل واحد سریال USART و یا SPI ، I2C و … باشد. هر منبعی که بخواهد به صورت مشترک حداقل بین دو تسک مورد استفاده قرار گیرد.
در اختیار گرفتن منبع اشتراکی
هر تسک قبل از دسترسی به منبع اشتراکی موظف است ابتدا میوتکس آن را بررسی کند و در صورت در دسترس بودن میوتکس آن را از سیستم بگیرد و منبع را قفل کند. در صورتی که میوتکس در لحظه در دسترس تسک در حال اجرا نباشد، امکان لحاظ کردن تایم اوت برای آزاد شدن میوتکس وجود دارد. تا زمان منقضی شدن تایم اوت، تسک به حالت بلاک در می آید و زمانی از پردازنده نمی گیرد. کد زیر این کار را انجام می دهد. و قبل از استفاده از منبع اشتراکی قرار می گیرد.
- در روش FreeRTOS
xSemaphoreTake(myMutexHandle, portMAX_DELAY);
- در روش CMSIS-RTOS
osMutexWait(myMutexHandle, osWaitForever);
آزاد کردن منبع اشتراکی
تسکی که در حال استفاده از منبع اشتراکی است، بعد از پایان استفاده از منبع اشتراکی باید میوتکس قفل شده را به سیستم بازگرداند و اصطلاحا میوتکس را آزاد کند. کد زیر کار آزاد سازی میوتکس منبع اشتراکی را انجام می دهد. این دستور باید بعد از منبع اشتراکی قرار گیرد.
- در روش FreeRTOS
xSemaphoreGive(myMutexHandle);
- در روش CMSIS-RTOS
osMutexRelease(myMutexHandle);
فرم استفاده از میوتکس
مراحل گفته شده در بالا، به شکل کلی زیر پیاده سازی می شود. در هر تسک قبل و بعد از منبع اشتراکی باید میوتکس گرفته و آزاد شود، مشابه کد زیر.
- در روش FreeRTOS
xSemaphoreTake(myMutexHandle, portMAX_DELAY); // منبع اشتراکی (Shared Resource) xSemaphoreGive(myMutexHandle);
- در روش CMSIS-RTOS
osMutexWait(myMutexHandle, osWaitForever); // منبع اشتراکی (Shared Resource) osMutexRelease(myMutexHandle);
به این صورت یاد گرفتیم که در روش برنامه نویسی سیستم عامل FreeRTOS به چه صورت می توانیم با استفاده از میوتکس Mutex ها از منابع اشتراکی استفاده کنیم، به صورتی که تداخلی پیش نیاید. بسیار عالی !
منابع پیشنهادی جهت یادگیری بیشتر FreeRTOS
در لینک زیر می توانید کتاب الکترونیکی را دانلود کرده و یک شروع سریع با سیستم عامل FreeRTOS برای میکروکنترلر STM32 داشته باشید.
همینطور می توانید در دوره جامع آموزش سیستم عامل FreeRTOS در لینک زیر شرکت کنید.
لینک های مرتبط
آموزش نحوه تعریف Task در freeRTOS
آموزش نحوه استفاده از Queue در FreeRTOS
آموزش نحوه استفاده از سمافور Semaphore در FreeRTOS
لینک های مفید
استفاده از سیستم عامل RTOS در میکروکنترلرها
مقایسه برنامه نویسی به روش RTOS و Super Loop
RTOS یا سیستم عامل بلادرنگ چیست؟
برنامه نویسی به سبک RTOS – پادکست
اگر سوال، پیشنهاد، نظر و یا … دارید، از قسمت نظرات در پایین همین صفحه، می توانید با ما و بقیه ی خوانندگان درمیان بگذارید.
جهت مطلع شدن از آموزش های جدید به خبرنامه ی EasyMCU بپیوندید.
درباره مرتضی زندی
خلق کردن شماره 1 علاقه مندی های من هست. برنامه نویسی بهترین ابزاری بوده که تا الان برای این کار پیدا کردم. بیس الکترونیک دارم و دستی بر آتش در دنیای رشته های مجاور. تجربه سال ها فعالیت در تیم های R&D رو دارم، در این بین در حوزه ی امبدد سیستم ها فعالیتم پررنگ تر هست. عاشق یادگیری و یاد دادن هستم و تلاش می کنم تجربیاتم رو به زبانی ساده از طریق EasyMCU.org به نحوی کاربردی و موثر با علاقه مندان این حوزه به اشتراک بذارم.
نوشته های بیشتر از مرتضی زندیمطالب زیر را حتما مطالعه کنید
آموزش نصب و راه اندازی سیستم عامل Free RTOS برای آردوینو Arduino
آموزش نصب و راه اندازی سیستم عامل Free RTOS روی STM32
آموزش Free RTOS نحوه استفاده از سمافور Semaphore
آموزش STM32 راه اندازی وقفه خارجی EXTI
معرفی کتاب ARM
راه اندازی واحد سریال UART در STM32
این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش میشوند.
دیدگاهتان را بنویسید