سیستم عامل FreeRTOS

سیستم عامل FREERTOS در بردهای ESP32 قسمت اول: معرفی RTOS

getting-started-with-free-rtos-in-esp32-part-one-introduce-digispark
نوشته شده توسط معین صابری

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

 


تعریف سیستم عامل


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

تعریف سیستم عامل در میکروکنترلر - دیجی اسپارک

 

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

 


دستورات سیستم: معرفی Task  به برنامه


در یک سیستم عامل، با مجموعه ای از Task ها رو به رو هستیم. هر Task یک برنامه دیده می شود. در حقیقت درون هر Task، یک حلقه تکرار بی نهایت قرار می گیرد. این حلقه تکرار بی نهایت در حقیقت نقش تابع void loop را بازی می کند. شما می توانید تعداد زیادی Task یا همان void loop تعریف نمایید. به همین منظور، به صورت global، باید Task ها را تعریف کنید. شیوه تعریف Task ها مشابه تعریف توابع است. به عنوان مثال فرض کنید یک Task به اسم A داریم. این Task به صورت زیر تعریف می شود.

 

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

 


تعریف Task


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

 

شرح خصوصیت
تابع Task TaskFunction_t pvTaskCode
تعریف یک نام دلخواه برای Task const char *const pcName
حجم Task const uint32_t usStackDepth
ورودی های Task void *const pvParameters,
اولویت Task UBaseType_t uxPriority
تابع Handle برای Task TaskHandle_t *const pvCreatedTask,
نام CORE برای اجرای Task const BaseType_t xCoreID

 

برای تعریف یک Task، از تابع   xTaskCreatePinnedToCoreاستفاده می کنیم. این تابع ورودی های جدول فوق را به ترتیب در خود جای می دهد. به عنوان مثال، تابع زیر را در نظر بگیرید.

 

 در ادامه، پس از تابع loop، می بایست Task ها تعریف شوند. در حقیقت کدهای درون تابع Task باید نوشته شود. این کدها فرمت شبیه به تابع setup و loop دارند. همانطور که می دانید دستورات تابع setup تنها یکبار اجرا می شوند. در طرف دیگر دستورات تابع loop به طور مداوم در حال اجرا هستند. در این جا نیز فرمتی شبه به این داریم. به قطعه کد زیر دقت کنید.

 

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

 


اجرای یک مثال با FreeRTOS


در این قسمت از FreeRTOS در ESP32 به یک نمونه برنامه می پردازیم. در این برنامه یک ورودی آنالوگ و یک ورودی دیجیتال به صورت مداوم خوانده می شوند.

 


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


لینک خرید برد ESP32، کلیک کنید.

 


جمع بندی


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

 

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

 

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

معین صابری

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

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

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

۲ دیدگاه