Arduino, ARM, AVR, RTOS, آموزش های متنی

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

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

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

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

در صورتی که با نحوه پیکربندی اولیه پروژه بر مبنای سیستم عامل آشنایی ندارید مقاله زیر را ببینید.

نصب و راه اندازی FreeRTOS


تعریف 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 داشته باشید.

دانلود کتاب شروع کار با RTOS

همینطور می توانید در دوره جامع آموزش سیستم عامل FreeRTOS در لینک زیر شرکت کنید.


لینک های مرتبط

دانلود کتاب شروع کار با RTOS

آموزش نحوه تعریف Task در freeRTOS

آموزش نحوه استفاده از صف Queue در FreeRTOS

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


لینک های مفید

استفاده از سیستم عامل RTOS در میکروکنترلرها

مقایسه برنامه نویسی به روش RTOS و Super Loop

RTOS یا سیستم عامل بلادرنگ چیست؟


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

author-avatar

درباره مرتضی زندی

خلق کردن شماره 1 علاقه مندی های من هست. برنامه نویسی بهترین ابزاری بوده که تا الان برای این کار پیدا کردم. بیس الکترونیک دارم و دستی بر آتش در دنیای رشته های مجاور. تجربه سال ها فعالیت در تیم های R&D رو دارم، در این بین در حوزه ی امبدد سیستم ها فعالیتم پررنگ تر هست. عاشق یادگیری و یاد دادن هستم و تلاش می کنم تجربیاتم رو به زبانی ساده از طریق EasyMCU.org به نحوی کاربردی و موثر با علاقه مندان این حوزه به اشتراک بذارم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

This site uses Akismet to reduce spam. Learn how your comment data is processed.