- Keunggulan prosesor Multi-core
- ESP32 dan FreeRTOS
- Menemukan ID inti ESP32
- Pemrograman ESP32 Dual Core
Modul ESP populer untuk fungsionalitas Wi-Fi mereka seperti ESP8266, ESP-12E, dll. Ini semua adalah modul Mikrokontroler yang kuat dengan fungsi Wi-Fi. Ada satu modul ESP lagi yang lebih bertenaga dan serbaguna dari modul ESP sebelumnya - namanya ESP32. Ini memiliki konektivitas Bluetooth dan Wi-Fi dan kami telah menjelaskan kemampuan BLE ESP32 dan menggunakan ESP32 di banyak proyek IoT. Tetapi sangat sedikit orang yang tahu bahwa ESP32 adalah mikrokontroler Dual-core.
ESP32 memiliki dua mikroprosesor Tensilica Xtensa LX6 32-bit yang menjadikannya mikrokontroler dual-core (core0 dan core1) yang kuat. Ini tersedia dalam dua varian single-core dan dual-core. Namun varian dual-core lebih populer karena tidak ada perbedaan harga yang signifikan.
ESP32 dapat diprogram menggunakan Arduino IDE, Espressif IDF, Lua RTOS, dll. Sedangkan pemrograman dengan Arduino IDE, kodenya hanya berjalan di Core1 karena Core0 sudah diprogram untuk komunikasi RF. Tapi di sini tutorial ini kami akan menunjukkan bagaimana menggunakan kedua inti ESP32 untuk melakukan dua operasi secara bersamaan. Di sini tugas pertama adalah mengedipkan LED onboard dan tugas kedua adalah mengambil data suhu dari sensor DHT11.
Mari kita lihat dulu keunggulan prosesor multi-core dibandingkan dengan satu core.
Keunggulan prosesor Multi-core
- Prosesor multi-inti berguna jika ada lebih dari 2 proses yang bekerja secara bersamaan.
- Saat pekerjaan didistribusikan di antara inti yang berbeda, kecepatannya meningkat dan beberapa proses dapat diselesaikan pada waktu yang bersamaan.
- Konsumsi daya dapat dikurangi karena ketika inti mana pun dalam mode siaga daripada itu dapat digunakan untuk mematikan periferal yang tidak digunakan pada saat itu.
- Prosesor inti ganda harus lebih jarang beralih di antara utas yang berbeda daripada prosesor inti tunggal karena mereka dapat menangani dua sekaligus, bukan satu per satu.
ESP32 dan FreeRTOS
Papan ESP32 sudah memiliki firmware FreeRTOS yang diinstal di atasnya. FreeRTOS adalah sistem Operasi Real-time open-source yang sangat berguna dalam multitasking. RTOS membantu dalam mengelola sumber daya dan memaksimalkan kinerja sistem. FreeRTOS memiliki banyak fungsi API untuk tujuan yang berbeda dan dengan menggunakan API ini, kita dapat membuat tugas dan membuatnya berjalan pada inti yang berbeda.
Dokumentasi lengkap FreeRTOS API dapat ditemukan di sini. Kami akan mencoba menggunakan beberapa API dalam kode kami untuk membangun aplikasi multitasking yang akan berjalan di kedua inti.
Menemukan ID inti ESP32
Di sini kita akan menggunakan Arduino IDE untuk mengunggah kode ke ESP32. Untuk mengetahui Core ID tempat kode dijalankan, ada fungsi API
xPortGetCoreID ()
Fungsi ini dapat dipanggil dari fungsi void setup () dan void loop () untuk mengetahui ID inti tempat fungsi ini berjalan.
Anda dapat menguji API ini dengan mengunggah sketsa di bawah ini:
void setup () { Serial.begin (115200); Serial.print ("fungsi setup () berjalan pada inti:"); Serial.println (xPortGetCoreID ()); } void loop () { Serial.print ("loop () berfungsi pada inti:"); Serial.println (xPortGetCoreID ()); }
Setelah mengunggah sketsa di atas, buka monitor Serial dan Anda akan menemukan bahwa kedua fungsi tersebut berjalan pada core1 seperti yang ditunjukkan di bawah ini.
Dari pengamatan di atas, dapat disimpulkan bahwa sketsa Arduino default selalu berjalan pada core1.
Pemrograman ESP32 Dual Core
Arduino IDE mendukung FreeRTOS untuk ESP32 dan FreeRTOS API memungkinkan kita membuat tugas yang dapat berjalan secara independen pada kedua inti. Tugasnya adalah bagian kode yang melakukan beberapa operasi di papan seperti led berkedip, suhu pengiriman, dll.
Fungsi di bawah ini digunakan untuk membuat tugas yang dapat dijalankan di kedua inti. Dalam fungsi ini, kita harus memberikan beberapa argumen seperti prioritas, id inti, dll.
Sekarang, ikuti langkah-langkah di bawah ini untuk membuat tugas dan fungsi tugas.
1. Pertama, buat tugas dalam fungsi penyiapan void . Di sini kita akan membuat dua tugas, satu untuk berkedip LED setelah setiap 0,5 detik dan tugas lainnya adalah mendapatkan pembacaan suhu setelah setiap 2 detik.
Fungsi xTaskCreatePinnedToCore () membutuhkan 7 argumen:
- Nama fungsi untuk mengimplementasikan tugas (tugas1)
- Nama apa pun yang diberikan untuk tugas ("tugas1", dll)
- Ukuran tumpukan yang dialokasikan untuk tugas dalam kata-kata (1 kata = 2 byte)
- Parameter masukan tugas (bisa NULL)
- Prioritas tugas (0 adalah prioritas terendah)
- Pegangan tugas (bisa NULL)
- ID inti tempat tugas akan dijalankan (0 atau 1)
Sekarang, buat Task1 untuk mengedipkan led dengan memberikan semua argumen dalam fungsi xTaskCreatePinnedToCore ().
xTaskCreatePinnedToCore (Task1code, "Task1", 10000, NULL, 1, NULL, 0);
Demikian pula, buat Task2 untuk Task2 dan buat core id 1 di argumen ke- 7.
xTaskCreatePinnedToCore (Task2code, "Task2", 10000, NULL, 1, NULL, 1);
Anda dapat mengubah prioritas dan ukuran tumpukan tergantung pada kompleksitas tugas.
2. Sekarang, kita akan menerapkan Task1code dan Task2code fungsi. Fungsi ini berisi kode untuk tugas yang diperlukan. Dalam kasus kami, tugas pertama akan mengedipkan led dan tugas lain akan mengambil suhu. Jadi buat dua fungsi terpisah untuk setiap tugas di luar fungsi penyiapan void.
Fungsi Task1code untuk berkedip on-board led setelah 0,5 detik diimplementasikan seperti yang ditunjukkan di bawah ini.
Void Task1code (void * parameter) { Serial.print ("Task1 berjalan pada inti"); Serial.println (xPortGetCoreID ()); for (;;) {// loop tak terbatas digitalWrite (led, HIGH); penundaan (500); digitalWrite (dipimpin, LOW); delay (500); } }
Demikian pula, terapkan fungsi Task2code untuk mengambil suhu.
void Task2code (void * pvParameters) { Serial.print ("Task2 berjalan pada inti"); Serial.println (xPortGetCoreID ()); untuk (;;) { float t = dht.readTemperature (); Serial.print ("Suhu:"); Cetak serial (t); penundaan (2000); } }
3. Di sini fungsi void loop akan tetap kosong. Seperti yang telah kita ketahui bahwa fungsi loop dan setup berjalan pada core1 sehingga Anda juga dapat mengimplementasikan tugas core1 dalam fungsi void loop .
Sekarang bagian pengkodean selesai, jadi cukup unggah kode menggunakan Arduino IDE dengan memilih papan ESP32 di menu Alat. Pastikan Anda telah menghubungkan sensor DHT11 ke pin D13 dari ESP32.
Sekarang hasilnya sudah bisa dipantau di Serial Monitor atau Arduino IDE seperti gambar dibawah ini:
Aplikasi kompleks seperti sistem real-time dapat dibangun dengan menjalankan banyak tugas secara bersamaan menggunakan inti ganda ESP32.
Kode lengkap bersama dengan video Demo diberikan di bawah ini.