:در مجموعه آموزش های سیستم عامل FreeRTOS بر روی برد آردوینو، قسمت ششم را به امکانات جانبی جهت کنترل اجرای Task ها اختصاص می دهیم. در قسمت پیشین در رابطه با صف و نحوه انتقال داده بین Task ها از این طریق صحبت کردیم. صف یکی از مهم ترین و پرکابردترین ابزارها در تبادل داده به شمار می رود. در این قسمت اما قصد داریم تا به بررسی امکانات جانبی برای کنترل و اجرای Task ها بپردازیم.
اجرای Task ها توسط سیستم عامل یکی از مهم ترین بخش های اجرا به شمار می رود. در این آموزش قصد دارین تا به توابع و دستوراتی جهت کنترل اجرا بپردازیم. این دستورات می توانند شامل معلق کردن اجرا، بلاک کردن اجرا، حذف و…. برای اجرای یک Task شود. در این آموزش به دستورات و توابع مرتبط با کنترل اجرای Taskمی پردازیم. اما پیش از شروع ابتدا مروری بر مطالب قسمت های پیشین داشته و سپس بحث را آغاز خواهیم نمود. در ادامه با مرجع تخصصی سیستم عامل FreeRTOS به زبان فارسی، دیجی اسپارک همراه باشید.
مروری بر آموزش های FreeRTOS
در سلسله آموزش سیستم عامل FreeRTOS، قصد بررسی و نحوه اجرای آن را بر روی بردهای آردوینو با معماری ۸ بیتی پردازنده سری ATMEGA داریم. سیستم عامل FreeRTOS یکی از مهم ترین و به طور کل خاص ترین سیستم عامل جهت اجرا بر روی بردهای امبدد به شمار می رود. این سیستم عامل دارای امکانات بیشماری نظیر اجرای Task، مدیریت حافظه، سمافور و… را داراست. به کمک این سیستم عامل می توان چندین Task(برنامه) را به طور همزمان، در حالیکه هر برنامه دارای حلقه تکرار بی نهایت است، اجرا نمود.
در قسمت نخست سلسله آموزش راجع به تعریف و مفهوم سیستم عامل صحبت کردیم. آنطور که از مفهوم سیستم عامل دریافتیم، این نرم افزار وظیفه دارد تا چندین برنامه را روی یک پردازنده اجرا کند؛ این در حالیست که بدون این نرم افزار به ازای هر برنامه یک پردازنده نیاز است.
در ادامه مفهوم سیستم عامل، به نصب آن در آردوینو پرداختیم. آنطور که در قسمت دوم گفته شد، سیستم عامل Free RTOS با روشی متفاوت با سیستم عامل های اندروید و ویندوز بر روی دستگاه اجرا می شود. در همین قسمت بود که راجع به تابع xTaskCreate به عنوان تابعی پایه ای برای تعریف Task ها، سخن گفتیم.
در قسمت سوم سلسله آموزش، به اجرای برنامه ها تحت سیستم عامل پرداختیم. در سیستم عامل FreeRTOS می توان برنامه ها یا Task ها را به صورت حلقه های تکرار بی نهایت به اجرا درآورد. به عبارت دیگر شما در هر Task یک حلقه تکرار بی نهایت دارید که درست همانند تابع void loop عمل می کند. اجرای این حلقه های تکرار بی نهایت هیچ گونه خللی در اجرای سایر حلقه ها نخواهد کرد؛ چراکه سیستم عامل وظیفه مدیریت Task ها را بر عهده دارد.
اجرای همزمان Task ها ممکن است گاهی سبب ایجاد تداخلاتی شود. این تداخل در دسترسی همزمان به منابع سخت افزاری نظیر حافظه یا امکانات جانبی مثل پورت سریال صورت می گیرد. جهت جلوگیری از این موضوع، از یک مفهوم به نام سمافور استفاده می شود. این مورد به طور کامل در قسمت چهارم سیستم عامل مورد بحث و بررسی قرار گرفته است.
پس از این قسمت، به بررسی نحوه تبادل داده بین Task ها در قسمت پنجم پرداختیم. در بسیاری از موارد لازم است تا بین Task ها تبادل داده صورت گیرد. این تبادل به کمک یک ساختار داده مثل صف صورت می گیرد. در این آموزش به تعریف مفهوم صف و نحوه پیاده سازی آن در دو روش آرایه و ساختار پرداختیم.
در این آموزش قصد داریم تا توابع و دستورات کنترلی روی اجرای Task ها را بررسی کنیم. به کمک این دستورات می توانیم اجرای Task ها را از لحاظ بلاک کردن، معلق کردن و… مدیریت کنیم. در قسمت بعدی شرح این توابع را مشاهده خواهیم نمود.
دستورات کنترلی Task
پس از بررسی خلاصه و مرور قسمت های پیشین، در این قسمت، چنان که پیشتر نیز گفته شد، در رابطه با توابع و دستورات کنترلی بر روی Task ها صحبت خواهیم کرد. جدول زیر شرح این دستورات را نمایش می دهد.
شرح | ورودی ها | تابع |
این تابع اجرای یک Task را معلق می کند. در ورودی تابع handler مربوط به task قرار می گیرد. | ورودی از نوع کلاس کتابخانه جهت معرفی Task | void vTaskSuspend( TaskHandle_t xTaskToSuspend ) |
این تابع Task معلق شده را از این حالت خارج و به چرخه اجرا در می آورد. در ورودی تابع handler مربوط به task قرار می گیرد. | ورودی از نوع کلاس کتابخانه جهت معرفی Task | void vTaskResume( TaskHandle_t xTaskToResume ); |
به کمک این تابع می توان اولویت اجرای یک Task را در خروجی تابع مشاهده نمود. در ورودی تابع handler تعریف شده یا همان شی تعریف شده برای Task قرار می گیرد. | ورودی از نوع کلاس کتابخانه جهت معرفی Task | UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask ) |
به کمک این تابع می توان اولویت یک Task را تنظیم کنید. ورودی اول handler و ورودی دوم تعیین اولویت است.
توجه: اولویت نسبت به متغیر tskIDLE_PRIORITY تنظیم می گردد.
|
ورودی اول از نوع کلاس کتابخانه جهت معرفی Task
ورودی دوم از نوع کلاس کتابخانه جهت تنظیم اولویت
|
void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) |
پس از آشنایی با توابع کنترل Task، می توانید از منوی File->Examples->FreeRTOS->TaskStatus، نمونه برنامه را اجرا نمایید.
امکانات جانبی در مدیریت Task
پس از آشنایی با توابع کنترلی، در این قسمت به امکانات جانبی در مدیریت Task ها می پردازیم. همانند قسمت قبل جدول زیر به معرفی توابع می پردازد.
شرح | ورودی | تابع |
به کمک این تابع تعداد tick هایی که از زمان فراخوانی vTaskStartScheduler
شمرده شده در خروجی قرار می گیرد. |
بدون ورودی | volatile TickType_t xTaskGetTickCount( void )
|
این تابع تعداد Task هایی که هم اکنون سیستم عامل در حال مدیریت است را در خروجی قرار می دهد. این شمارش شامل Task های زیر می شود
۱-در حال اجرا ۲-بلاک شده ۳-معلق شده ۴- پاک شده در صورتیکه از حافظه آزاد نشده باشد. |
بدون ورودی | UBaseType_t uxTaskGetNumberOfTasks( void ) |
این تابع نام Task را در خروجی قرار می دهد. ورودی می تواند نام handler مربوط به Task و یا NULL باشد. | ورودی از نوع کلاس Task | char * pcTaskGetName( TaskHandle_t xTaskToQuery ) |
این تابع مقدار حافظه باقی مانده که توسط Task اشغال شده را اعلام می نماید. در ورودی تابع نام handler برنامه یا task قرار می گیرد. |
ورودی از نوع کلاس Task |
UBaseType_t uxTaskGetStackHighWaterMark
( TaskHandle_t xTask ) |
این تابع، آن Task که هم اکنون در حال اجرا بوده و اکنون با idletask در ارتباط است را در خروجی قرار می دهد. Idletask یک task بوده که به طور خودکار توسط سیستم عامل اجرا می شود. | بدون ورودی | TaskHandle_t xTaskGetIdleTaskHandle( void );
|
پس از بررسی جدول فوق، جهت اجرای نمونه برنامه می توانید به File->Examples->FreeRTOS->TaskUtilities مراجعه کرده و برنامه را اجرا کنید.
لوازم مورد نیاز
لینک خرید انواع برد آردوینو، کلیک کنید
جمع بندی
در مجموعه آموزش های سیستم عامل FreeRTOS، قسمت ششم به توابع و دستورات کنترل Task ها پرداختیم. به کمک این توابع می توانیم از وضعیت اجرای Task ها توسط سیستم عامل مطلع شویم. از آنجاییکه بحث مدیریت Task ها امری حائز اهمیت است، لذا در این آموزش به توابع کنترلی نظیر حذف Task، معلق کردن Task، پاک کردن و…. پرداختیم. برای این مورد، جداولی را تهیه کردیم که هرکدام شامل توابع کنترلی Task ها هستند. در نهایت با ارایه مثال، شیوه استفاده از توابع را در برنامه ها مشاهده نمودیم.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.