راه اندازی سیستم عامل (FreeRTOS) در برد ESP۳۲

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

در دنیای میکروکنترلرها و امبدد سیستم ها، سیستم عامل های بی درنگ( RTOS ها) یک پاسخ قطعی برای پروژه های پیچیده ی امروزی و پروژه هایی که نیاز به انجام چند کار به صورت همزمان (مولتی تسکینگ Multi-Tasking) دارند هستند.

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

به طور پیشفرض شما می توانید از این قابلیت در محیط برنامه نویسی آردینو استفاده کنید که کار را بسیار راحت می کند و نیازی به فریمور یا بوت لودر خاصی ندارید.

چراغ چشمک زن

می خواهیم یک پروژه بسیار ساده را باهم بررسی کنیم که چراغ روی برد خود ESP32 را هر نیم ثانیه خاموش و روشن می کند. اما مانند مثال ساده ای که به عنوان اولین پروژه انجام داده اید نیست و قرار است که این کار را به سیستم عامل بسپاریم.

 

code
code

Code as Text

#ifndef LED_BUILTIN
#define LED_BUILTIN 4
#endif
// define  task for Blink
void TaskBlink( void *pvParameters );
void setup() {
  xTaskCreatePinnedToCore(
    TaskBlink
    ,  “TaskBlink”   // A name just for humans
    ,  1024  // This stack size can be checked & adjusted by reading the Stack Highwater
    ,  NULL
    ,  2  // Priority, with 3 being the highest, and 0 being the lowest.
    ,  NULL
    ,  ARDUINO_RUNNING_CORE);
  // Now the task scheduler is automatically started.
}
void loop()
{
  // Empty. Things are done in Tasks.
}
void TaskBlink(void *pvParameters)  // This is the blink task.
{
  (void) pvParameters;
    // Setup(
        pinMode(LED_BUILTIN, OUTPUT);
    // Setup)
  for (;;) // Loop()
  {
    digitalWrite(LED_BUILTIN, HIGH);  
    vTaskDelay(500);  
    digitalWrite(LED_BUILTIN, LOW);    
    vTaskDelay(500);  
  }
}

همان طور که مشاهده می کنید ما از هیچ کتابخانه ای استفاده می کنیم و توسط تابع ()xTaskCreatePinnedToCore یک تسک به نام TaskBlink ساخته ایم که خروجی و ورودی آن خالی می باشد.

به پارامتر اول این تابع توجه کنید (1024). این عدد میزان استک و رم مورد نیاز این تسک هستش که باید نسبت با کاری که شما انجام می دهید همخوانی داشته باشد . در این کد ساده که ما نیازی به مصرف زیادی رم نداریم این عدد مناسب است. اما به عنوان مثال اگر می خواهید یک فایل JSON را رمز گشایی کنید(پست مربوط به این مطلب) به طور حتمی نیاز بیشتری به رم در این تسک دارید…حال تصور کنید که تعداد زیادی تسک داشته باشیم و سیستم عامل نتواند تامین انرژی کند. چه اتفاقی می افتد؟؟

یکی دیگر از پارامتر هایی که باید به آن دقت کنید پارامتر چهارم می باشد که برای سیستم عامل میزان اهمیت تسک را مشخص می کنیم که 0 کمترین می باشد و 3 بیشترین می باشد.پس سیستم عامل در مواقع ضروری اگر خوش شانس باشیم و کرش نکنیم ابتدا تسک های با اهمیت بالاتر را اجرا می کند.

در آخر باید بگم که در این روش ما برای هر تسک یک حلقه LOOP & SETUP جدید داریم که برای شما در مثال خودمان علامت زدم. در این روش مدیریت شلوغی کد را به سیستم عامل بسپارید اما حتما به مصرف و بهینه کردن کد خود باید بسیار توجه کنید و یا با کرش های غیر منتظره مواجه خواهید شد.

 

منابع

دیجی اسپارک

Stack OverFlow

 

نوشته های مشابه

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

آدرس ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

ninety four − = eighty nine

همچنین ببینید

بستن
بستن