سبد خرید 0

هیچ محصولی در سبد خرید نیست.

سبد خرید 0

هیچ محصولی در سبد خرید نیست.

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

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

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

سلام خدمت همه همراهان همیشگی و علاقه مندان به سایت کافه میکرو امروز در خدمت شما هستیم با یک آموزش بسیار مفید دیگر، ما در این مقاله قصد داریم آموزش Free RTOS نحوه استفاده از سمافور Semaphore را باهم دیگر پیش ببریم و کار کنیم پس همراه کافه میکرو باشید….

در مقالات قبلی گفته شد، در فلسفه ی برنامه نویسی به سبک سیستم عامل ، پروژه به تعدادی تسک تقسیم می شود که ماهیت مستقلی نسبت به یکدیگر دارند. اما گاهی برای پیاده سازی ویژگی هایی نیاز است که چند تسک با هماهنگی بایکدیگر کار کنند. اینجاست که با مفهوم 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 آشنا شدیم.

از اینکه همراه کافه میکرو بودید و تا پایان آموزش Free RTOS نحوه استفاده از سمافور Semaphore همراه ما بودید به شما تبریک میگیم.

از بخش های دیگر کافه میکرو در فروشگاه و وبلاگ هم می توانید دیدن فرمایید.

منتظر مقالات و آموزش های دیگر کافه میکرو باشید.

دیدگاه شما
محصول با موفقیت به سبد خرید اضافه شد.