آموزش FreeRTOS نحوه تعریف Task تسک

آموزش FreeRTOS نحوه تعریف Task تسک
در این مقاله قصد دارم نحوه ی تعریف Task تسک جدید در سیستم عامل بلادرنگ FreeRTOS رو آموزش بدم. علاوه بر توابع و API های خود FreeRTOS این امکان وجود دارد که از توابع CMSIS-RTOS نیز استفاده کرد. از آنجایی که ممکنه شما هم با میکروکنترلرهای STM32 و cubeMX درگیر باشید، این دو به صورت پیشفرض سبک CMSIS-RTOS را پیشنهاد می دهند. بنابراین برای شروع در ابتدا توابع CMSIS-RTOS را برای ایجاد تسک جدید بررسی می کنیم و معادل Free RTOS آن را برای هر تابع در کنارش معرفی می کنم.
در صورتی که با نحوه پیکربندی اولیه پروژه بر مبنای سیستم عامل آشنایی ندارید مقاله زیر را ببینید.
آموزش ویدئویی روش FreeRTOS
آموزش ویدئویی روش CMSIS RTOS
تعریف Handler برای Task
همانطور که می دانید در سبک RTOS ، پروژه به تعدادی تسک تبدیل می شود. برای اینکه در هر لحظه بتوانیم به هر تسک دسترسی داشته باشیم، برای هر تسک جدید که تعریف می کنیم، یک Handler نیز در نظر می گیریم. در آینده از طریق این Handler می توانیم به تسکی که تعریف کرده ایم دسترسی داشته باشیم.
نام Handle دلبخواه هست، بهتر است از ترکیب نام Task و عبارت Handle در بخش انتهایی آن استفاده کنیم که با مسما باشد و راحت تر بتوانیم از آن استفاده کنیم.
در کد زیر، یک Handler برای تسک myTask ایجاد کرده ایم.
osThreadId myTaskHandle;
در روش FreeRTOS کار تعریف هندلر برای تسک را با کد زیر انجام می دهیم.
TaskHandle_t myTaskHandle;
ایجاد بدنه ی تسک
هر تسک را که بخواهید ایجاد کنید، سه مرحله را نیاز است طی کنید.
- ایجاد پروتوتایپ تسک
- تعریف تسک جدید
- پیاده سازی تسک
ایجاد پروتوتایپ تسک
در حقیقت تسک یک تابع است که به عنوان ورودی یک اشاره گر به void می گیرد و در خروجی چیزی بر نمی گرداند. بنابراین مانند هر تابع دیگری نیاز است قبل از استفاده از آن یک پروتوتایپ از آن تعریف کنید. پروتوتایپ ها قبل از تابع main قرار می گیرند و یا درون کتابخانه ی مستقلی در نظر گرفته می شوند.
در کد زیر پروتوتایپ تسک myTask را ایجاد می کنیم.
void myTask(void const * arg);
در روش FreeRTOS پروتوتایپ روتین تسک را با کد زیر انجام می دهیم.
void myTask(void * arg);
تعریف تسک جدید
یکی از مکان های مناسب برای تعریف تسک جدید، درون تابع main و قبل از اجرا کردن سیستم عامل است. هر تسک برای تعریف شدن نیاز به یک نام، روتین اجرا، ورودی، اولویت، فضای استک دارد.
در کد زیر تسک myTask را تعریف می کنیم.
osThreadDef(task1, myTask, osPriorityNormal, 0, 128); led1TaskHandle = osThreadCreate(osThread(task1), NULL);
در روش FreeRTOS تسک جدید را با کد زیر تعریف می کنیم.
xTaskCreate(myTask, NULL, 128, NULL, tskIDLE_PRIORITY+1, led1TaskHandle);
پیاده سازی تسک
در روش RTOS برنامه ها درون تسک ها اجرا می شوند. بنابراین روتین تسک ها نیاز به پیاده سازی دارد. همانطور که گفته شد، تسک ها ماهیتا تابع هستند. تابع هایی که درون خود یک حلقه ی بینهایت دارند و مجاز نیستند از این حلقه ی بینهایت return کنند. شباهت زیادی به پیاده سازی خود تابع main در روش bare metal دارند. برنامه هایی که باید اجرا بشوند، درون حلقه ی بینهایت نوشته می شوند.
در کد زیر روش پیاده سازی یک تسک myTask را مشاهده می کنید.
void myTask(void const * arg) { while(1) { // Do something osDelay(1); } }
در کد زیر روش پیاده سازی یک تسک myTask را به روش FreeRTOS مشاهده می کنید.
void myTask(void * arg) { while(1) { // Do something vTaskDelay(1); } }
به این ترتیب با نحوه ی ایجاد تسک ها در سیستم عامل FreeRTOS و همینطور با Api های FreeRTOS و CMSIS-RTOS برای تعریف تسک آشنا شدیم.
منابع پیشنهادی جهت یادگیری بیشتر FreeRTOS
در لینک زیر می توانید کتاب الکترونیکی را دانلود کرده و یک شروع سریع با سیستم عامل FreeRTOS برای میکروکنترلر STM32 داشته باشید.
همینطور می توانید در دوره جامع آموزش سیستم عامل FreeRTOS در لینک زیر شرکت کنید.
لینک های مرتبط
آموزش نحوه استفاده از Queue در 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
این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش میشوند.
دیدگاهتان را بنویسید