מודולי ESP פופולריים בפונקציות ה- Wi-Fi שלהם כמו ESP8266, ESP-12E וכו '. כל אלה הם מודולי מיקרו-בקר חזקים עם פונקציות Wi-Fi. יש עוד מודול ESP חזק יותר ורב-תכליתי ממודולי ESP קודמים - שמו ESP32. יש לו קישוריות Bluetooth ו- Wi-Fi וכבר הסברנו על יכולות BLE של ESP32 והשתמשנו ב- ESP32 בפרויקטים רבים של IoT. אך מעט מאוד אנשים יודעים ש- ESP32 הוא מיקרו-בקר ליבה כפולה.
ל- ESP32 שני מעבדי Tensilica Xtensa LX6 של 32 סיביות, מה שהופך אותו למיקרו-בקר כפול ליבה (core0 ו- core1) חזק. זה זמין בשתי גרסאות ליבה אחת וליבה כפולה. אך גרסת הליבה הכפולה פופולארית יותר מכיוון שאין הבדל מחירים משמעותי.
ניתן לתכנת ESP32 באמצעות Arduino IDE, Espressif IDF, Lua RTOS וכו 'בזמן שתכנת עם Arduino IDE, הקוד פועל רק ב- Core1 מכיוון ש- Core0 כבר מתוכנת לתקשורת RF. אך הנה הדרכה זו אנו נראה כיצד להשתמש בשתי ליבות ה- ESP32 לביצוע שתי פעולות בו זמנית. כאן המשימה הראשונה תהיה למצמץ את נורית ה- LED המשולבת והמשימה השנייה תהיה להביא את נתוני הטמפרטורה מחיישן DHT11.
בואו נראה תחילה את היתרונות של מעבד מרובה ליבות על פני ליבה אחת.
יתרונותיו של מעבד רב ליבות
- מעבדים מרובי ליבות שימושיים כשיש יותר מ -2 תהליכים לעבוד בו זמנית.
- ככל שהעבודה מופצת בין ליבות שונות, המהירות שלה גדלה וניתן לסיים תהליכים מרובים בו זמנית.
- ניתן להפחית את צריכת החשמל מכיוון שכאשר ליבה כלשהי נמצאת במצב סרק, ניתן להשתמש בה בכדי לכבות את ציוד היקפי שאינו נמצא בשימוש באותה עת.
- מעבדי ליבה כפולה צריכים לעבור בין תבריגים שונים בתדירות נמוכה יותר ממעבדי ליבה אחת, מכיוון שהם יכולים להתמודד עם שניים בו זמנית במקום אחד בכל פעם.
ESP32 ו- FreeRTOS
בלוח ESP32 כבר מותקנת בו קושחת FreeRTOS. FreeRTOS היא מערכת הפעלה קוד פתוח בזמן אמת אשר שימושית מאוד בריבוי משימות. RTOS מסייע בניהול המשאבים ובמקסום ביצועי המערכת. ל- FreeRTOS פונקציות API רבות למטרות שונות ובאמצעות ממשקי API אלה, אנו יכולים ליצור משימות ולגרום להן לפעול על ליבות שונות.
תיעוד מלא של ממשקי ה- API של FreeRTOS ניתן למצוא כאן. ננסה להשתמש בכמה ממשקי API בקוד שלנו כדי לבנות יישום ריבוי משימות שיפעל בשתי הליבות.
איתור מזהה הליבה של ESP32
כאן נשתמש ב- Arduino IDE להעלאת הקוד ל- ESP32. כדי לדעת את מזהה הליבה שעליו פועל הקוד, יש פונקציית API
xPortGetCoreID ()
פונקציה זו יכולה להיקרא התקנת חלל () ו לולאת החלל () פונקציה לדעת את זהות הליבה שעליו פונקציות אלה פועלות.
אתה יכול לבדוק את ה- API הזה על ידי העלאת הסקיצה שלהלן:
הגדרת חלל () { Serial.begin (115200); פונקציה Serial.print ("setup () הפועלת בליבה:"); Serial.println (xPortGetCoreID ()); } void loop () { Serial.print ("loop () function running on core:"); Serial.println (xPortGetCoreID ()); }
לאחר העלאת הסקיצה שלעיל, פתח את הצג הסידורי ותגלה ששתי הפונקציות פועלות על core1 כמוצג להלן.
מהתצפיות לעיל, ניתן להסיק כי רישום ברירת המחדל של Arduino פועל תמיד על core1.
תכנות ליבה כפולה ESP32
Arduino IDE תומך ב- FreeRTOS עבור ESP32 ו- FreeRTOS APIs מאפשרים לנו ליצור משימות שיכולות לפעול באופן עצמאי בשתי הליבות. המשימה היא פיסת הקוד שמבצעת פעולה כלשהי על הלוח כמו נורות מהבהבות, שליחת טמפרטורה וכו '.
הפונקציה שלהלן משמשת ליצירת משימות שיכולות לפעול בשני הליבות. בפונקציה זו עלינו לתת כמה טיעונים כמו עדיפות, מזהה ליבה וכו '.
כעת, בצע את השלבים הבאים כדי ליצור פונקציית משימות ומשימה.
1. ראשית, צור משימות בפונקציית הגדרת הריק . כאן ניצור שתי משימות, אחת להבהוב מהבהב אחרי כל 0.5 שניות ומשימה נוספת היא קריאת טמפרטורה אחרי כל 2 שניות.
הפונקציה xTaskCreatePinnedToCore () לוקחת 7 ארגומנטים:
- שם פונקציה ליישום המשימה (task1)
- כל שם שניתן למשימה ("task1" וכו ')
- גודל הערימה המוקצה למשימה במילים (מילה אחת = 2 בתים)
- פרמטר קלט משימה (יכול להיות NULL)
- עדיפות המשימה (0 היא העדיפות הנמוכה ביותר)
- ידית משימות (יכולה להיות NULL)
- מזהה ליבה שבו המשימה תפעל (0 או 1)
כעת, צור את Task1 להבהוב של ה- led על ידי מתן כל הטיעונים בפונקציה xTaskCreatePinnedToCore ().
xTaskCreatePinnedToCore (Task1code, "Task1", 10000, NULL, 1, NULL, 0);
באופן דומה, ליצור Task2 עבור Task2 ולעשות הליבה id 1 ב 7 th טיעון.
xTaskCreatePinnedToCore (Task2code, "Task2", 10000, NULL, 1, NULL, 1);
ניתן לשנות את העדיפות ואת גודל הערימה בהתאם למורכבות המשימה.
2. כעת, נבצע Task1code ו Task2code פונקציה. פונקציות אלה מכילות את הקוד למשימה הנדרשת. במקרה שלנו, המשימה הראשונה תמצמץ את ה- LED ומשימה אחרת תביא את הטמפרטורה. אז הכינו שתי פונקציות נפרדות עבור כל משימה מחוץ לפונקציית התקנת הריק.
פונקציית Task1code להבהוב מוביל על הלוח לאחר 0.5 שניות מיושמת כמוצג להלן.
בטל קוד משימה בטל (void * parameter) { Serial.print ("משימה 1 פועלת על הליבה"); Serial.println (xPortGetCoreID ()); עבור (;;) {// אינסוף לולאה digitalWrite (led, HIGH); עיכוב (500); digitalWrite (הוביל, LOW); העיכוב (500); } }
באופן דומה, יישם את פונקציית Task2code להבאת הטמפרטורה.
בטל קוד Task2code (void * pvParameters) { Serial.print ("משימה 2 פועלת על הליבה"); Serial.println (xPortGetCoreID ()); עבור (;;) { float t = dht.readTemperature (); Serial.print ("טמפרטורה:"); סידורי.דפוס (t); עיכוב (2000); } }
3. כאן פונקציית הלולאה הריקנית תישאר ריקה. כפי שאנחנו כבר יודעים כי לולאה ואת התקנת פונקצית ריצות על core1 כך שתוכל ליישם משימת core1 ב לולאת חלל פונקציה גם.
כעת חלק הקידוד הסתיים, אז פשוט העלו את הקוד באמצעות Arduino IDE על ידי בחירת לוח ESP32 בתפריט כלים. וודא שחיברת את חיישן DHT11 לסיכה D13 של ESP32.
כעת ניתן לעקוב אחר התוצאות במוניטור סידורי או ב- Arduino IDE כמוצג להלן:
ניתן לבנות יישומים מורכבים כמו מערכת בזמן אמת על ידי הפעלת משימות מרובות בו זמנית באמצעות ליבות כפולות של ESP32.
הקוד המלא יחד עם סרטון הדגמה מופיע להלן.