سیستم عامل FreeRTOS

سیستم عامل Free RTOS بردهای آردوینو قسمت سوم: I/O تابع xTaskCreate

getting-started-with-free-rtos-in-arduino-part-three-input-output-digispark
نوشته شده توسط معین صابری

در سلسله آموزش های سیستم عامل FreeRTOS بر روی برد آردوینو،  قسمت سوم به نحوه خواندن ورودی آنالوگ و دیجیتال در بستر این سیستم عامل می پردازیم. آنطور که از قسمت های پیشین به خاطر داریم، سیستم عامل FreeRTOS  می تواند چندین حلقه تکرار بی نهایت را در یک برنامه اجرا کند. این اجرا به طوریست که حلقه های تکرار بی نهایت هیچ گونه تداخلی با یکدیگر نخواهند داشت. بدین ترتیب بدون نگرانی از توقف هر حلقه و یا ایجاد مشکل در اجرای یک حلقه برای حلقه دیگر، می توانیم چندین برنامه را اجرا نمود؛ به طوریکه هر حلقه تکرار به مانند یک تابع void loop، برای همیشه اجرا خواهد شد.

در قسمت پیشین نحوه اجرای سیستم عامل را بر روی برد آردوینو آموختیم. اگر از قسمت دوم مطالب را به خاطر داشته باشید، تابع xtaskCreate را حتما می شناسید. این تابع، یک تابع کلیدی جهت معرفی Task یا همان توابع است. در هریک از توابع، یک حلقه تکرار بی نهایت وجود دارد. این توابع نهایت می توانند ۴ مورد باشند. در این آموزش قصد به معرفی نحوه برنامه نویسی در سطح سیستم عامل FreeRTOS را داریم. بنابراین در ادامه آموزش با مرجع تخصصی سیستم عامل FreeRTOS به زبان فارسی، دیجی اسپارک همراه باشید.

 


مروری بر تابع xTaskCreate


مطابق قسمت پیشین، جهت معرفی توابع با حلقه های تکرار بی نهایت، از یک تابع مخصوص استفاده می شود. خوب است که در اینجا بحثی را پیش کشیده و سپس به معرفی مجدد تابع بپردازیم. همانطور که از ساختار برنامه های آردوینو اطلاع دارید؛ یک برنامه آردوینو از دو قسمت اصلی تشکیل می شود. یک قسمت مربوط به تابع setup برای تنظیماتی که یکبار صورت گرفته و قسمت بعدی مربوط به تابع void loop است. در این تابع، دستورات به صورت مکرر اجرا می شوند. به عبارت دیگر، قسمت اصلی برنامه در تابع loop قرار می گیرد.

void setup(){
}
void loop(){
}

 

زمانیکه از سیستم عامل FreeRTOS استفاده می شود، می توانیم چندین تابع void loop را اجرا کنیم. این توابع همانطور که در قسمت دوم مجموعه آموزش گفته شد، به صورت تابع فرعی با حلقه تکرار بی نهایت تعریف می شوند. به عنوان مثال، یک حلقه تکرار بی نهایت در یک تابع، مسئولیت کنترل یک ورودی دیجیتال را دارد. در یک تابع دیگر، یک حلقه تکرار بی نهایت وظیفه دارد تا رقص نوری را به صورت دائم و با طرح های مختلف ایجاد کند. در اینجا نیاز داریم تا دو تابع، یا بهتر بگوییم دو برنامه را به سیستم عامل معرفی کنیم. جهت معرفی به سیستم عامل، از تابع xTaskCreate به شکل زیر استفاده می کنیم.

xTaskCreate(TaskDigitalRead ,  "DigitalRead" ,128,  NULL ,  ۲  ,  NULL );

 

 در تابع فوق، پارامترها از چپ به راست  به شکل زیر تعریف می گردد.

۱: نام تابعی که قرار است اجرا شود.

۲: یک نام جهت شناسایی TASK در سطح سیستم عامل

۳:اندازه ای از حافظه STACK که به TASK(تابع) اختصاص داده می شود.

۴:پارامترهای ورودی برای TASK

۵: اولیت اجرای TASK، برای عدد ۳ بیشترین و بالاترین اولیت و عدد ۰ پایین ترین اولویت

۶: مدیریت اجرای TASK

پس از آشنایی با فراخوانی تابع، در قسمت بعد به معرفی دو دستور مهم در سیستم عامل پرداخته و در نهایت نحوه اجرای برنامه ها را مشاهده خواهیم کرد.

 


دستورات پایه ای سیستم عامل FreeRTOS


تا اینجای کار، آموختیم که برای اجرای همزمان حلقه های تکرار، می بایست از تابع xTaskCreate استفاده کنیم.  اما در کنار این، دستورات مهمی وجود دارند که باید مورد بررسی قرار گیرند. یکی از این دستورات، تابع vTaskDelay است. این تابع، یک تابع انحصاری جهت ایجاد تاخیر است. به کمک این تابع برنامه به مدت زمان مد نظر کاربر، در جایی که فراخوانی صورت گرفته، متوقف می شود. این تابع یک تفاوت ساختاری با تابع delay دارد. زمانیکه شما تابع delay را فراخوانی می کنید، سیستم عامل در حین اجرای این تابع سوییچ کرده و Task دیگر را اجرا می کند. بدین ترتیب در سطح سیستم عامل به کمک این تابع نمی توانید اجرا را متوقف کنید. در این جا اما به کمک تابع vTaskdelay می توانید به سادگی کل سیستم را متوقف کنید. به عبارت دیگر زمانیکه این تابع درون یک Task فراخوانی می شود، به مدت زمان تعیین شده Task متقوف شده و Task دیگری اجازه اجرا ندارد. پس از اتمام زمان، روند اجرا و سوییچ بین Task ها صورت خواهد گرفت. فراخوانی تابع vTaskDelay هم آداب و رسوم خاص خود را دارد! این تابع به شکل زیر در فرمت ساده فراخوانی می شود.

vtaskDelay(delay time)

در تابع فوق delay time مدت زمان تاخیر یه به عبارت دیگر، halt کردن سیستم است. اما ورودی این تابع باید بر مقدار پیشفرضی به نام portTICK_RATE_MS تقسیم شود. فرض کنید قصد ایجاد تاخیری برای مدت یک ثانیه یا ۱۰۰۰ میلی ثانیه دارید، در این صورت باید به صورت زیر عمل کنید.

vtaskDelay(1000/ portTICK_RATE_MS)

حال که با دستورات پایه ای آشنا شدیم، نوبت را به اجرای یک نمونه برنامه می دهیم. قسمت بعد مربوط به این موضوع است.

 


اجرای نمونه برنامه FreeRTOS


پس از بررسی دستورات پایه ای تابع xTaskCreate، نوبت به اجرای یک نمونه برنامه می رسد. در برنامه زیر دو Task داریم. یکی از این Task ها LED داخلی برد آردوینو را خاموش و روشن می کند. در طرف دیگر، Task بعدی وظیفه خواندن مقدار از ورودی آنالوگ را دارد. ابتدا به سورس کد برنامه دقت کنید. این سورس کد از طریق منوی File->Examples->FreeRTOS->Blink_AnalogRead در دسترس است. پس از اجرای برنامه، چشمک زدن LED را می توانید مشاهده کنید.

اجرای نمونه برنامه FreeRTOS با تابع xTaskCreate - دیجی اسپارک

 

پس از این مورد، در سریال مانیتور می توان مقادیر خوانده شده از ورودی A0 آنالوگ را مشاهده نمود.

 


لوازم مورد نیاز


لینک خرید انواع برد آردوینو، کلیک کنید

 


جمع بندی


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

 

چنانچه در مفاهیم این آموزش با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در مطالب مندرج وجود دارد  می‌توانید از همین طریق اطلاع رسانی کنید.

 

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

معین صابری

کارشناسی ارشد رشته معماری سیستم های کامپیوتری

مالي که ز تو کس نستاند، علم است
حرزي که تو را به حق رساند، علم است
جز علم طلب مکن تو اندر عالم
چيزي که تو را ز غم رهاند، علم است
(شیخ بهایی)

تبادل نظر و رفع عیب با ثبت دیدگاه