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

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

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

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

یکی از قابلیت های سیستم عامل ها از جمله سیستم عامل FreeRTOS ، صف یا Queue است. صف در حقیقت یک ساختار داده است که به منظور جابه جایی اطلاعات بین تسک ها و یا به عبارت کلی تر بین روتین های مستقل از هم استفاده می شود. به این ترتیب اگر نیازی به جابه جایی اطلاعات بین دو روتین متفاوت یا تسک متفاوت باشد، می توانیم از امکان صف که یکی از قابلیت های سیستم عامل برای ارتباط بین روتین های مستقل است، استفاده کنیم. در تصویر زیر می توانیم به یک تصویر سازی مناسب از ابزار صف در سیستم عامل برسیم.

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

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

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


تعریف Handler برای Queue

به منظور اینکه بتوانیم به هر Queue تعریف شده دسترسی داشته باشیم، برای هر Queue ای که تعریف می کنیم، یک Handler نیز در نظر می گیریم. در کاربردهای بعدی برای اینکه بتوانیم به این صف دسترسی داشته باشیم، از طریق این Handler می توانیم به صف ای که تعریف کرده ایم دسترسی داشته باشیم. در ادامه با API های FreeRTOS و CMSIS-RTOS برای استفاده از صف ها آشنا می شویم.

در کد زیر myQueueHandle را به عنوان یک Handler برای صف تعریف می کنیم.

xQueueHandle myQueueHandle;

در روش CMSIS-RTOS کار تعریف هندلر را با کد زیر انجام می دهیم.

osMessageQId myQueueHandle;

تعریف Queue

قبل از استفاده از صف نیاز است با توجه به Handler ای که در گام قبل تعریف کرده ایم یک صف ایجاد کنیم. کد زیر نحوه ی تعریف صف myQueueHandle را نشان می دهد.

#define QUEUE_LEN_MAX       4
#define QUEUE_ITEM_SIZE    16
myQueueHandle = xQueueCreate(QUEUE_LEN_MAX, sizeof(uint8_t) * QUEUE_ITEM_SIZE);

در روش CMSIS-RTOS کار تعریف صف Queue را با کد زیر انجام می دهیم.

#define QUEUE_LEN_MAX       4
#define QUEUE_ITEM_SIZE    16
osMessageQDef(queue1, QUEUE_LEN_MAX, sizeof(uint8_t) * QUEUE_ITEM_SIZE);
myQueueHandle = osMessageCreate(osMessageQ(queue1), NULL);

همانطور که مشاهده می شود، برای ایجاد queue از تابع  xQueueCreate استفاده می کنیم. این تابع دو ورودی می پذیرد. ورودی اول طول صف را تعیین می کند و ورودی دوم میزان فضای مورد نیاز برای هر خانه از صف را تعیین می کند.


دریافت اطلاعات از Queue

تسکی که منتظر دریافت داده از صف است، تا زمانی که داده ای درون صف وجود نداشته باشد به حالت Blocking در می آید و زمانی از CPU نمی گیرد.برای دریافت داده از Queue از API زیر استفاده می شود که به صورت مشروط نوشته می شود. در صورتی که خروجی تابع برابر مقدار pdTRUE باشد، عملیات با موفقیت انجام شده است.

xQueueReceive(myQueueHandle,rxData,100)

در روش CMSIS-RTOS کار دریافت اطلاعات را با کد زیر انجام می دهیم.

osEvent evt = osMessageGet(myQueueHandle,100);
if(evt.status == osEventMessage)
{
    rxData = (uint8_t)evt.value.p;
}

ارسال اطلاعات به Queue

تسکی که داده ها را تولید می کند و درون صف می گذارد، برای این منظور از API زیر استفاده می کند. این API به صورت مشروط نوشته می شود. در صورتی که خروجی تابع برابر مقدار pdTRUE باشد، عملیات با موفقیت انجام شده است.

xQueueSend(myQueueHandle,txData,100);

در روش CMSIS-RTOS کار ارسال اطلاعات را با کد زیر انجام می دهیم.

osMessagePut(myQueueHandle,txData,100);

به این ترتیب با نحوه ی استفاده از queue یا صف ها و همینطور با Api های FreeRTOS و CMSIS-RTOS آشنا شدیم.


منابع پیشنهادی جهت یادگیری بیشتر FreeRTOS

در لینک زیر می توانید کتاب الکترونیکی را دانلود کرده و یک شروع سریع با سیستم عامل FreeRTOS برای میکروکنترلر STM32 داشته باشید.

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

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


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

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

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

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

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


لینک های مفید

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

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

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

برنامه نویسی به سبک RTOS – پادکست


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

author-avatar

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

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

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

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

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