آموزش Free RTOS نحوه استفاده از سمافور Semaphore

آموزش Free RTOS نحوه استفاده از سمافور Semaphore
در این مقاله با سمافور Semaphore ها در سیستم عامل FreeRTOS و نحوه استفاده از آن آشنا می شویم. همانطور که در مقالات قبلی گفته شد، در فلسفه ی برنامه نویسی به سبک سیستم عامل ، پروژه به تعدادی تسک تقسیم می شود که ماهیت مستقلی نسبت به یکدیگر دارند. اما گاهی برای پیاده سازی ویژگی هایی نیاز است که چند تسک با هماهنگی بایکدیگر کار کنند. اینجاست که با مفهوم Synchronization یا همگام سازی در سیستم عامل آشنا می شویم. یکی از ابزارهایی که سیستم عامل برای همگام سازی بین تسک ها و یا روتین های وقفه و تسک ها در اختیار ما می گذارد، سمافورها Semaphore هستند که عملیات سیگنال دادن Signaling بین تسک ها را هندل می کنند.
در صورتی که با نحوه پیکربندی اولیه پروژه بر مبنای سیستم عامل آشنایی ندارید مقاله زیر را ببینید.
تعریف Handler برای Semaphore
مشابه تمام اجزای دیگر سیستم عامل ، زمانی که قصد تعریف و استفاده از یک شیء سیستم عامل را داریم، نیاز است که در وهله ی اول بتوانیم به این شیء دسترسی داشته باشیم. در اینجا هدف ایجاد یک هندلر برای سمافور است. در ادامه با نحوه ی تعریف هندلر با استفاده از روش های CMSIS-RTOS و FreeRTOS آشنا می شویم.
در کد زیر mySemaHandle را به عنوان یک Hanlder برای سمافور تعریف می کنیم.
xSemaphoreHandle mySemaHandle;
در روش CMSIS-RTOS کار تعریف هندلر سمافور را به کد زیر انجام می دهیم.
osSemaphoreId mySemaHandle;
انواع سمافور
سمافورها به دو نوع تقسیم می شوند
- سمافور باینری یا Binary Semaphore
- سمافور شمارشی یا Counting Semaphore
در این مطلب با سمافور باینری و نحوه ی استفاده از آن آشنا می شویم
تعریف سمافور Semaphore
قبل از استفاده از سمافروز نیاز است با توجه به هندلر ای که در بخش قبل تعریف کردیم یک سمافور ایجاد کنیم. کد زیر نحوه ی تعریف سمافور mySemaHandle را نشان می دهد.
mySemaHandle = xSemaphoreCreateBinary();
در روش cmsis-rtos سمافور را به شکل زیر ایجاد می کنیم.
osSemaphoreDef(sema1); mySemaHandle = osSemaphoreCreate(osSemaphore(sema1), 1);
در روش FreeRTOS تابع مربوطه ورودی نمی پذیرد و در خروجی مقدار هندلر سمافور را بر می گرداند. در حالی که در روش CMSIS-RTOS مشاهده می شود که تابع osSemaphoreCreate دو ورودی می گیرد. ورودی دوم count نام دارد و نوع سمافور را تعیین می کند. در صورتی که آن را با مقدار یک تنظیم کنیم، سمافور ساخته شده از نوع باینری خواهد بود.
عملیات صادر کردن سیگنال Signal
در عملیات سیگنالینگ بین دو تسک، همیشه یک طرف ماجرا کار ارسال کردن سیگنال را انجام می دهد و این در حالی است که سمت دیگر (تسک دیگر) منتظر دریافت سیگنال می باشد. در کد زیر نحوه ی ارسال سیگنال قابل مشاهده است.
xSemaphoreGive(mySemaHandle);
در روش CMSIS-RTOS ارسال سیگنال با کد زیر انجام می شود.
osSemaphoreRelease(mySemaHandle);
عملیات دریافت سیگنال Signal
سمت گیرنده ، تا زمانی که سیگنال صادر نشده باشد، به حالت بلاک در می آید و برای این منظور از پردازنده زمان نمی گیرد. بخش دریافت با تابع زیر انجام می شود. در این حالت تا زمانی که گیرنده سیگنال را نبیند، در حالت بلاک باقی می ماند. این وضعیت می تواند به صورت لحاظ کردن یک تایم اوت نیز تغییر پیدا کند. بدیهی است که بخش گیرنده در تسک جداگانه ای که قرار است کار دریافت سیگنال را انجام دهد پیاده سازی می شود.
xSemaphoreTake(mySemaHandle, portMAX_DELAY);
به سبک CMSIS-RTOS این کار را با استفاده از کد زیر می توان انجام داد.
osSemaphoreWait(mySemaHandle, osWaitForever);
به این ترتیب با API های سیستم عامل به منظور پیاده سازی عملیات همگام سازی و سیگنالینگ با روش FreeRTOS و CMSIS-RTOS آشنا شدیم.
منابع پیشنهادی جهت یادگیری بیشتر FreeRTOS
در لینک زیر می توانید کتاب الکترونیکی را دانلود کرده و یک شروع سریع با سیستم عامل FreeRTOS برای میکروکنترلر STM32 داشته باشید.
همینطور می توانید در دوره جامع آموزش سیستم عامل FreeRTOS در لینک زیر شرکت کنید.
لینک های مرتبط
آموزش نحوه تعریف Task در freeRTOS
آموزش نحوه استفاده از صف Queue در FreeRTOS
آموزش نحوه استفاده از میوتکس Mutex در FreeRTOS
لینک های مفید
استفاده از سیستم عامل RTOS در میکروکنترلرها
مقایسه برنامه نویسی به روش RTOS و Super Loop
RTOS یا سیستم عامل بلادرنگ چیست؟
اگر سوال، پیشنهاد، نظر و یا … دارید، از قسمت نظرات در پایین همین صفحه، می توانید با ما و بقیه ی خوانندگان درمیان بگذارید.
جهت مطلع شدن از آموزش های جدید به خبرنامه ی EasyMCU بپیوندید.
درباره مرتضی زندی
خلق کردن شماره 1 علاقه مندی های من هست. برنامه نویسی بهترین ابزاری بوده که تا الان برای این کار پیدا کردم. بیس الکترونیک دارم و دستی بر آتش در دنیای رشته های مجاور. تجربه سال ها فعالیت در تیم های R&D رو دارم، در این بین در حوزه ی امبدد سیستم ها فعالیتم پررنگ تر هست. عاشق یادگیری و یاد دادن هستم و تلاش می کنم تجربیاتم رو به زبانی ساده از طریق EasyMCU.org به نحوی کاربردی و موثر با علاقه مندان این حوزه به اشتراک بذارم.
نوشته های بیشتر از مرتضی زندیمطالب زیر را حتما مطالعه کنید
آموزش نصب و راه اندازی سیستم عامل Free RTOS برای آردوینو Arduino
آموزش نصب و راه اندازی سیستم عامل Free RTOS روی STM32
آموزش FreeRTOS نحوه استفاده از میوتکس Mutex
آموزش STM32 راه اندازی وقفه خارجی EXTI
معرفی کتاب ARM
راه اندازی واحد سریال UART در STM32
این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش میشوند.
دیدگاهتان را بنویسید