- Kelebihan pemproses berbilang teras
- ESP32 dan FreeRTOS
- Mencari ID teras ESP32
- Pengaturcaraan Dual Core ESP32
Modul ESP terkenal dengan fungsi Wi-Fi mereka seperti ESP8266, ESP-12E, dan lain-lain. Ini semua adalah modul Mikrokontroler yang kuat dengan fungsi Wi-Fi. Terdapat satu lagi modul ESP yang lebih hebat dan serba boleh daripada modul ESP sebelumnya - namanya ESP32. Ia mempunyai sambungan Bluetooth dan Wi-Fi dan kami sudah menjelaskan kemampuan BLE ESP32 dan menggunakan ESP32 dalam banyak projek IoT. Tetapi sangat sedikit orang yang mengetahui bahawa ESP32 adalah mikrokontroler dwi-teras.
ESP32 mempunyai dua mikropemproses Tensilica Xtensa LX6 32-bit yang menjadikannya mikrokontroler dual-core (core0 dan core1) yang kuat. Ia terdapat dalam dua varian satu teras dan dua teras. Tetapi varian dual-core lebih popular kerana tidak ada perbezaan harga yang ketara.
ESP32 dapat diprogramkan menggunakan Arduino IDE, Espressif IDF, Lua RTOS, dll. Semasa memprogram dengan Arduino IDE, kod hanya berjalan pada Core1 kerana Core0 sudah diprogram untuk komunikasi RF. Tetapi di sini adalah tutorial ini kita akan menunjukkan cara menggunakan kedua-dua teras ESP32 untuk melakukan dua operasi secara serentak. Di sini tugas pertama adalah dengan mengedipkan LED onboard dan tugas kedua adalah mengambil data suhu dari sensor DHT11.
Mari kita lihat kelebihan pemproses multi-teras berbanding satu teras.
Kelebihan pemproses berbilang teras
- Pemproses berbilang teras berguna apabila terdapat lebih daripada 2 proses untuk berfungsi secara serentak.
- Oleh kerana kerja diedarkan di antara teras yang berbeza, kelajuannya meningkat dan pelbagai proses dapat diselesaikan pada masa yang sama.
- Penggunaan tenaga dapat dikurangkan kerana bila ada inti dalam mode siaga daripada dapat digunakan untuk mematikan periferal yang tidak digunakan pada waktu itu.
- Pemproses dwi teras mesti lebih kerap bertukar antara utas yang berbeza daripada pemproses teras tunggal kerana mereka dapat mengendalikan dua serentak dan bukannya satu demi satu.
ESP32 dan FreeRTOS
Papan ESP32 telah memasang firmware FreeRTOS di atasnya. FreeRTOS adalah sistem Operasi Masa Nyata sumber terbuka yang sangat berguna dalam melakukan pelbagai tugas. RTOS membantu dalam menguruskan sumber dan memaksimumkan prestasi sistem. FreeRTOS mempunyai banyak fungsi API untuk tujuan yang berbeza dan menggunakan API ini, kita dapat membuat tugas dan membuatnya berjalan pada inti yang berbeza.
Dokumentasi lengkap API FreeRTOS boleh didapati di sini. Kami akan cuba menggunakan beberapa API dalam kod kami untuk membina aplikasi multitasking yang akan berjalan di kedua-dua teras.
Mencari ID teras ESP32
Di sini kita akan menggunakan Arduino IDE untuk memuat naik kod ke dalam ESP32. Untuk mengetahui Core ID di mana kod berjalan, ada fungsi API
xPortGetCoreID ()
Fungsi ini dapat dipanggil dari fungsi setup void () dan loop void () untuk mengetahui ID inti yang berfungsi.
Anda boleh menguji API ini dengan memuat naik lakaran di bawah:
persediaan tidak sah () { Serial.begin (115200); Serial.print ("setup () fungsi berjalan pada teras:"); Serial.println (xPortGetCoreID ()); } gelung void () { Serial.print ("loop () fungsi berjalan pada teras:"); Serial.println (xPortGetCoreID ()); }
Setelah memuat naik lakaran di atas, buka monitor Serial dan anda akan dapati kedua-dua fungsi tersebut berjalan pada core1 seperti gambar di bawah.
Dari pemerhatian di atas, dapat disimpulkan bahawa lakaran Arduino lalai selalu berjalan pada inti1.
Pengaturcaraan Dual Core ESP32
Arduino IDE menyokong FreeRTOS untuk ESP32 dan API FreeRTOS membolehkan kami membuat tugas yang dapat dijalankan secara bebas pada kedua-dua teras. Tugasnya adalah bahagian kod yang melakukan beberapa operasi di papan seperti led berkedip, suhu penghantaran, dll.
Fungsi di bawah digunakan untuk membuat tugas yang dapat dijalankan pada kedua-dua teras. Dalam fungsi ini, kita harus memberikan beberapa argumen seperti keutamaan, inti id, dll.
Sekarang, ikuti langkah di bawah untuk membuat fungsi tugas dan tugas.
1. Pertama, buat tugas dalam fungsi persediaan kosong . Di sini kita akan membuat dua tugas, satu untuk LED berkedip setiap 0.5 saat dan tugas lain adalah mendapatkan bacaan suhu setiap 2 saat.
Fungsi xTaskCreatePinnedToCore () mengambil 7 argumen:
- Nama fungsi untuk melaksanakan tugas (task1)
- Sebarang nama yang diberikan untuk tugas ("task1", ​​dll)
- Ukuran tumpukan diperuntukkan untuk tugas dalam perkataan (1 perkataan = 2bytes)
- Parameter input tugas (boleh NULL)
- Keutamaan tugas (0 adalah keutamaan terendah)
- Pemegang tugas (boleh NULL)
- Id teras di mana tugas akan dijalankan (0 atau 1)
Sekarang, buat Task1 untuk mengedipkan petunjuk dengan memberikan semua argumen dalam fungsi xTaskCreatePinnedToCore ().
xTaskCreatePinnedToCore (Task1code, "Task1", ​​10000, NULL, 1, NULL, 0);
Begitu juga, buat Task2 untuk Task2 dan buat inti id 1 dalam argumen ke- 7.
xTaskCreatePinnedToCore (Task2code, "Task2", 10000, NULL, 1, NULL, 1);
Anda boleh mengubah keutamaan dan ukuran timbunan bergantung pada kerumitan tugas.
2. Sekarang, kami akan melaksanakan Task1code dan Task2code fungsi. Fungsi-fungsi ini mengandungi kod untuk tugas yang diperlukan. Dalam kes kami, tugas pertama akan mengedipkan led dan tugas lain akan mengambil suhu. Oleh itu, buat dua fungsi yang berasingan untuk setiap tugas di luar fungsi persediaan kosong.
Fungsi Task1code untuk berkedip on-board led setelah 0.5 saat dilaksanakan seperti yang ditunjukkan di bawah.
Void Task1code (void * parameter) { Serial.print ("Task1 berjalan pada teras"); Serial.println (xPortGetCoreID ()); untuk (;;) {// loop tak terhingga digitalWrite (dipimpin, TINGGI); kelewatan (500); digitalWrite (dipimpin, LOW); tunda (500); } }
Begitu juga, melaksanakan fungsi Task2code untuk mengambil suhu.
void Task2code (void * pvParameters) { Serial.print ("Task2 berjalan pada teras"); Serial.println (xPortGetCoreID ()); untuk (;;) { float t = dht.readTemperature (); Serial.print ("Suhu:"); Cetakan bersiri (t); kelewatan (2000); } }
3. Di sini fungsi gelung void akan tetap kosong. Seperti yang telah kita ketahui bahawa fungsi loop dan setup berjalan pada core1 sehingga anda dapat melaksanakan tugas core1 dalam fungsi loop void juga.
Sekarang bahagian pengkodan sudah berakhir, jadi muat naik kod menggunakan Arduino IDE dengan memilih papan ESP32 di menu Alat. Pastikan anda telah menyambungkan sensor DHT11 ke pin D13 ESP32.
Sekarang hasilnya dapat dipantau di Serial Monitor atau Arduino IDE seperti yang ditunjukkan di bawah:
Aplikasi yang rumit seperti sistem masa nyata dapat dibina dengan menjalankan beberapa tugas secara serentak menggunakan dual core ESP32.
Kod lengkap bersama dengan video Demo diberikan di bawah.