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

آموزش FreeRTOS نحوه استفاده از صف Queue
یکی از قابلیت های سیستم عامل ها از جمله سیستم عامل FreeRTOS ، صف یا Queue است. صف در حقیقت یک ساختار داده است که به منظور جابه جایی اطلاعات بین تسک ها و یا به عبارت کلی تر بین روتین های مستقل از هم استفاده می شود. به این ترتیب اگر نیازی به جابه جایی اطلاعات بین دو روتین متفاوت یا تسک متفاوت باشد، می توانیم از امکان صف که یکی از قابلیت های سیستم عامل برای ارتباط بین روتین های مستقل است، استفاده کنیم. در تصویر زیر می توانیم به یک تصویر سازی مناسب از ابزار صف در سیستم عامل برسیم.
در صورتی که با نحوه پیکربندی اولیه پروژه بر مبنای سیستم عامل آشنایی ندارید مقاله زیر را ببینید.
تعریف 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 داشته باشید.
همینطور می توانید در دوره جامع آموزش سیستم عامل FreeRTOS در لینک زیر شرکت کنید.
لینک های مرتبط
آموزش نحوه تعریف Task در freeRTOS
آموزش نحوه استفاده از سمافور Semaphore در FreeRTOS
آموزش نحوه استفاده از میوتکس Mutex در FreeRTOS
لینک های مفید
استفاده از سیستم عامل RTOS در میکروکنترلرها
مقایسه برنامه نویسی به روش RTOS و Super Loop
RTOS یا سیستم عامل بلادرنگ چیست؟
برنامه نویسی به سبک RTOS – پادکست
اگر سوال، پیشنهاد، نظر و یا … دارید، از قسمت نظرات در پایین همین صفحه، می توانید با ما و بقیه ی خوانندگان درمیان بگذارید.
جهت مطلع شدن از آموزش های جدید به خبرنامه ی EasyMCU بپیوندید.
درباره مرتضی زندی
خلق کردن شماره 1 علاقه مندی های من هست. برنامه نویسی بهترین ابزاری بوده که تا الان برای این کار پیدا کردم. بیس الکترونیک دارم و دستی بر آتش در دنیای رشته های مجاور. تجربه سال ها فعالیت در تیم های R&D رو دارم، در این بین در حوزه ی امبدد سیستم ها فعالیتم پررنگ تر هست. عاشق یادگیری و یاد دادن هستم و تلاش می کنم تجربیاتم رو به زبانی ساده از طریق EasyMCU.org به نحوی کاربردی و موثر با علاقه مندان این حوزه به اشتراک بذارم.
نوشته های بیشتر از مرتضی زندیمطالب زیر را حتما مطالعه کنید
آموزش نصب و راه اندازی سیستم عامل Free RTOS برای آردوینو Arduino
آموزش نصب و راه اندازی سیستم عامل Free RTOS روی STM32
آموزش FreeRTOS نحوه استفاده از میوتکس Mutex
آموزش Free RTOS نحوه استفاده از سمافور Semaphore
آموزش STM32 راه اندازی وقفه خارجی EXTI
معرفی کتاب ARM
این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش میشوند.
دیدگاهتان را بنویسید