آموزش Espآموزش ESP32آموزش اینترنت اشیاپروژه های Esp

برنامه نویسی دو هسته ای ESP32 (آموزش جامع)

ماژول های ESP به دلیل عملکرد بی نظیر در Wi-Fi از محبوبیت بالایی برخوردار هستند مانند ماژول های ESP8266، ESP-12E  و … ، این ماژول ها یک میکروکنترلر قدرتمند با قابلیت Wi-Fi هستند. یک ماژول ESP دیگر وجود دارد که از ماژول های قبلی ESP قدرتمندتر و همه کاره تر است، نام آن ESP32 است. این ماژول دارای اتصال بلوتوث و وای فای است که ما قبلاً قابلیت های BLE ESP32 را توضیح دادیم و از ESP32 در بسیاری از پروژه های اینترنت اشیا استفاده کردیم. اما تعداد کمی از مردم می دانند که ESP32 یک میکروکنترلر دو هسته ای است.

ESP32 دارای دو ریزپردازنده 32 بیتی Tensilica Xtensa LX6 است که آن را به یک میکروکنترلر قدرتمند دو هسته ای (core0 و core1) تبدیل می کند. این ماژول در دو نوع تک هسته ای و دو هسته ای موجود است. بدلیل تفاوت قیمت بسیار کم نوع دو هسته ای آن بسیار محبوب تر است.

برنامه نویسی دو هسته ای ESP32

ESP32 را می توان با استفاده از Arduino IDE، Espressif IDF، Lua RTOS و… پروگرام کرد. هنگام پ روگرام کردن با Arduino IDE، کد فقط روی Core1 اجرا می شود زیرا Core0 قبلاً برای ارتباط RF برنامه ریزی شده است. اما در این آموزش نحوه استفاده از هر دو هسته ESP32 برای انجام دو عملیات به طور همزمان را نشان خواهیم داد. در اینجا اولین کار چشمک زدن LED داخلی و دومین کار واکشی داده های دما از سنسور DHT11 است.

بیایید ابتدا مزایای یک پردازنده چند هسته ای را نسبت به یک هسته ای ببینیم.

مزایای پردازنده چند هسته ای

• پردازنده های چند هسته ای زمانی مفید هستند که بیش از 2 فرآیند به طور همزمان در جریان باشند.

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

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

• پردازنده‌های دو هسته‌ای کمتر از پردازنده‌های تک هسته‌ای بین شاخه های مختلف جابه‌جا می شوند، زیرا پرازنده های دو هسته ای می‌توانند به جای یکی کار در یک زمان، دو یا چند کار را همزمان مدیریت کنند.

ESP32  و FreeRTOS  

برد ESP32 از قبل سیستم عامل FreeRTOS را روی خود دارد. FreeRTOS یک سیستم عامل open-source و Real-time است که در multitasking بسیار مفید است. RTOS در مدیریت منابع و به حداکثر رساندن عملکرد سیستم کمک کننده است. FreeRTOS توابع API زیادی برای اهداف مختلف دارد و با استفاده از این APIها می‌توانیم وظایفی ایجاد کنیم و آنها را روی هسته‌های مختلف اجرا کنیم.

documentation کامل API های FreeRTOS را می توانید در اینجا بیابید. ما سعی خواهیم کرد از برخی API ها در کدمان استفاده کنیم تا یک برنامه multitasking ای بسازیم که روی هر دو هسته اجرا شود.

 پیدا کردن ESP32 core ID

در اینجا ما از Arduino IDE برای آپلود کد در ESP32 استفاده می کنیم. برای دانستن Core ID که کد روی آن اجرا می شود، یک تابع API وجود دارد

xPortGetCoreID()

این تابع را می توان در تابع void setup() و void loop() فراخوانی کرد تا Core ID که این توابع روی آن اجرا می شوند را بدانند.

می توانید این API را با آپلود کد زیر آزمایش کنید:

void setup() {
  Serial.begin(115200);
  Serial.print("setup() function running on core: ");
  Serial.println(xPortGetCoreID());
}
void loop() {
  Serial.print("loop() function running on core: ");
  Serial.println(xPortGetCoreID());
}

پس از آپلود برنامه بالا، سریال مانیتور را باز کنید و خواهید دید که هر دو تابع (loop و setup) بر روی core1 مطابق شکل زیر اجرا می شوند.

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

برنامه نویسی چند هسته ای

از مشاهدات بالا می توان نتیجه گرفت که برنامه پیش فرض آردوینو همیشه روی core1 اجرا می شود.

برنامه نویسی دو هسته ای ESP32

Arduino IDE از FreeRTOS برای ESP32 پشتیبانی می کند و FreeRTOS API به ما امکان می دهد دستوراتی را ایجاد کنیم که می توانند به طور مستقل روی هر دو هسته اجرا شوند. این دستور قطعه کدی است که عملیاتی مانند چشمک زدن led، ارسال دما و غیره را روی برد انجام می دهد.

تابع زیر برای ایجاد دستوراتی استفاده می شود که می توانند روی هر دو هسته اجرا شوند. در این تابع باید آرگومان هایی مانند اولویت، شناسه هسته و غیره را تنظیم کنیم.

اکنون، مراحل زیر را برای ایجاد دستور و تابع دستور انجام دهید.

1. ابتدا در تابع void setup یک دستور را ایجاد کنید. در اینجا ما دو کار انجام می دهیم، یکی برای چشمک زدن LED بعد از هر 0.5 ثانیه و دیگری خواندن و دریافت دما بعد از هر 2 ثانیه .

تابع xTaskCreatePinnedToCore()  هفت آرگومان می گیرد:

  • نام تابع برای اجرای دستور (task1)
  • هر نامی که به دستور داده می شود (“task1”, etc)
  • اندازه پشته اختصاص داده شده به دستور به مقیاس words (1 word=2bytes)
  • پارامتر ورودی دستور (می تواند NULL باشد)
  • اولویت دستور (0 کمترین اولویت است)
  • رسیدگی به دستور (می تواند NULL باشد)
  • Core id که در آن دستور اجرا شود (0 یا 1)

اکنون، با دادن تمام آرگومان ها در تابع ()xTaskCreatePinnedToCore، Task1 را برای چشمک زدن led ایجاد کنید.

xTaskCreatePinnedToCore(Task1code, "Task1", 10000, NULL, 1, NULL,  0);

به طور مشابه، Task 2 را برای دستور دوم ایجاد کنید و Core id را در آرگومان 7 عدد یک قرار دهید.

xTaskCreatePinnedToCore(Task2code, "Task2", 10000, NULL, 1, NULL,  1);

می توانید اولویت و اندازه پشته را بسته به پیچیدگی کار تغییر دهید.

2. اکنون تابع Task1code و Task2code را پیاده سازی خواهیم کرد. این توابع حاوی کد دستور مورد نیاز هستند. در مورد کد ما، دستور اول چراغ LED را خاموش و روشن میکند و دستور دیگر دما را دریافت می کند. بنابراین برای هر دستور، دو تابع مجزا در خارج از تابع void setup ایجاد کنید.

تابع Task1code برای چشمک زدن چراغ روی برد پس از 0.5 ثانیه مطابق کد زیر می باشد.

Void Task1code( void * parameter) {
Serial.print("Task1 running on core ");
Serial.println(xPortGetCoreID());
for(;;) {//infinite loop
digitalWrite(led, HIGH);
delay(500);
digitalWrite(led, LOW);
​​delay(500);
}
}

به طور مشابه، تابع Task2code را برای دریافت دما پیاده سازی کنید.

void Task2code( void * pvParameters ){
  Serial.print("Task2 running on core ");
  Serial.println(xPortGetCoreID());
  for(;;){
    float t = dht.readTemperature();
     Serial.print("Temperature: ");
     Serial.print(t);
   delay(2000);
  }
}

3 . در اینجا تابع void loop خالی خواهد ماند. همانطور که قبلاً می دانیم void loop و void setup بر روی core1 اجرا می شود بنابراین می توانید دستور core1 را در تابع خالی void loop نیز پیاده سازی کنید.

اکنون بخش کدنویسی به پایان رسیده است، بنابراین فقط با انتخاب برد ESP32 در منوی Tools، کد را با استفاده از Arduino IDE آپلود کنید. مطمئن شوید که سنسور DHT11 را به پایه D13 ESP32 متصل کرده اید.

برنامه نویسی چند هسته ای با ESP32

اکنون نتایج را می توان بر روی Serial Monitor یا Arduino IDE همانطور که نشان داده شده رصد کرد:

برنامه نویسی دو هسته ای با برد ESP32 و آردوینو

برنامه های پیچیده مانند سیستم real-time را می توان با اجرای multipletasks به طور همزمان با استفاده از دو هسته ESP32 ساخت.

کد کامل به همراه یک ویدیوی آزمایشی در زیر آورده شده است.

موارد موجود در فایل : سورس کامل

4.2 (5 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

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

1 دیدگاه

  1. سلام سئوال داشتم
    که میشه پروتکل rtsp با espراه اندازی کرد ؟

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

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