ईएसपी मॉड्यूल अपने वाई-फाई कार्यात्मकताओं जैसे ईएसपी 8266, ईएसपी -12 ई आदि के लिए लोकप्रिय हैं। ये सभी वाई-फाई कार्यात्मकता के साथ शक्तिशाली माइक्रोकंट्रोलर मॉड्यूल हैं। एक और ईएसपी मॉड्यूल है जो पिछले ईएसपी मॉड्यूल की तुलना में अधिक शक्तिशाली और बहुमुखी है- इसका नाम ईएसपी 32 है । इसमें ब्लूटूथ और वाई-फाई कनेक्टिविटी है और हमने पहले ही ESP32 की BLE क्षमताओं को समझाया और कई IoT प्रोजेक्ट्स में ESP32 का उपयोग किया। लेकिन बहुत कम लोग जानते हैं कि ESP32 एक दोहरे कोर माइक्रोकंट्रोलर है ।
ESP32 में दो 32-बिट Tensilica Xtensa LX6 माइक्रोप्रोसेसर हैं जो इसे एक शक्तिशाली दोहरे-कोर (core0 और core1) माइक्रोकंट्रोलर बनाता है। यह दो वेरिएंट सिंगल-कोर और डुअल-कोर में उपलब्ध है। लेकिन ड्यूल-कोर वेरिएंट अधिक लोकप्रिय है क्योंकि इसमें कोई महत्वपूर्ण अंतर नहीं है।
ESP32 को Arduino IDE, Espressif IDF, Lua RTOS आदि का उपयोग करके प्रोग्राम किया जा सकता है। Arduino IDE के साथ प्रोग्रामिंग करते समय, कोड केवल Core1 पर चलता है क्योंकि Core0 पहले से ही RF कम्युनिकेशन के लिए प्रोग्राम किया गया है। लेकिन यहां यह ट्यूटोरियल है हम बताएंगे कि एक साथ दो ऑपरेशन करने के लिए ESP32 के दोनों कोर का उपयोग कैसे करें । यहां पहला काम ऑनबोर्ड एलईडी ब्लिंक करना होगा और दूसरा काम DHT11 सेंसर से तापमान डेटा प्राप्त करना होगा।
आइए पहले एक ही कोर पर मल्टी-कोर प्रोसेसर के फायदे देखें।
मल्टी-कोर प्रोसेसर के फायदे
- मल्टी-कोर प्रोसेसर उपयोगी होते हैं जब एक साथ काम करने के लिए 2 से अधिक प्रक्रियाएं होती हैं।
- जैसा कि काम को विभिन्न कोर के बीच वितरित किया जाता है, इसकी गति बढ़ जाती है और एक ही समय में कई प्रक्रियाएं समाप्त हो सकती हैं।
- बिजली की खपत को कम किया जा सकता है क्योंकि जब कोई कोर निष्क्रिय मोड में होता है, तो इसका उपयोग उन बाह्य उपकरणों को बंद करने के लिए किया जा सकता है जो उस समय उपयोग में नहीं होते हैं।
- दोहरे कोर प्रोसेसर को सिंगल-कोर प्रोसेसर की तुलना में अलग-अलग थ्रेड्स के बीच स्विच करना पड़ता है क्योंकि वे एक समय में एक के बजाय दो बार संभाल सकते हैं।
ESP32 और FreeRTOS
ESP32 बोर्ड में पहले से ही FreeRTOS फर्मवेयर स्थापित है। FreeRTOS एक ओपन-सोर्स रियल-टाइम ऑपरेटिंग सिस्टम है जो मल्टीटास्किंग में बहुत उपयोगी है। RTOS संसाधनों के प्रबंधन और सिस्टम प्रदर्शन को अधिकतम करने में मदद करता है। FreeRTOS के विभिन्न प्रयोजनों के लिए कई एपीआई कार्य हैं और इन एपीआई का उपयोग करके, हम कार्य बना सकते हैं और उन्हें विभिन्न कोर पर चला सकते हैं।
FreeRTOS API का पूर्ण प्रलेखन यहां पाया जा सकता है। हम अपने कोड में दोनों एपीआई पर चलने वाले मल्टीटास्किंग एप्लिकेशन को बनाने के लिए कुछ एपीआई का उपयोग करने का प्रयास करेंगे।
ईएसपी 32 कोर आईडी ढूंढना
यहां हम कोड को ESP32 में अपलोड करने के लिए Arduino IDE का उपयोग करेंगे। कोर आईडी जिस पर कोड चल रहा है, यह जानने के लिए एक एपीआई फ़ंक्शन है
xPortGetCoreID ()
यह फ़ंक्शन शून्य सेटअप () और शून्य लूप () फ़ंक्शन से कोर आईडी को जानने के लिए कहा जा सकता है, जिस पर ये फ़ंक्शन चल रहे हैं।
आप नीचे दिए गए स्केच को अपलोड करके इस एपीआई का परीक्षण कर सकते हैं:
शून्य सेटअप () { Serial.begin (115200); Serial.print ("सेटअप () कोर पर चल रहा फ़ंक्शन:"); Serial.println (xPortGetCoreID ()); } शून्य लूप () { Serial.print ("लूप () कोर पर चल रहा फंक्शन:"); Serial.println (xPortGetCoreID ()); }
उपरोक्त स्केच अपलोड करने के बाद, सीरियल मॉनिटर खोलें और आप पाएंगे कि दोनों फ़ंक्शन कोर 1 पर चल रहे हैं जैसा कि नीचे दिखाया गया है।
उपरोक्त टिप्पणियों से, यह निष्कर्ष निकाला जा सकता है कि डिफ़ॉल्ट Arduino स्केच हमेशा core1 पर चलता है ।
ESP32 दोहरे कोर प्रोग्रामिंग
Arduino IDE ESP32 के लिए FreeRTOS का समर्थन करता है और FreeRTOS API हमें उन कार्यों को बनाने की अनुमति देता है जो दोनों कोर पर स्वतंत्र रूप से चल सकते हैं। कार्य कोड का एक टुकड़ा है जो बोर्ड पर कुछ ऑपरेशन करता है जैसे कि ब्लिंकिंग एलईडी, तापमान भेजना आदि।
नीचे दिए गए फ़ंक्शन का उपयोग उन कार्यों को बनाने के लिए किया जाता है जो दोनों कोर पर चल सकते हैं। इस फ़ंक्शन में, हमें कुछ तर्क देने होते हैं जैसे प्राथमिकता, कोर आईडी, आदि।
अब, कार्य और कार्य फ़ंक्शन बनाने के लिए नीचे दिए गए चरणों का पालन करें।
1. सबसे पहले, शून्य सेटअप फ़ंक्शन में कार्य बनाएं । यहां हम दो कार्य बनाएंगे, एक प्रत्येक 0.5 सेकंड के बाद एलईडी ब्लिंक करने के लिए और दूसरा कार्य प्रत्येक 2 सेकंड के बाद तापमान रीडिंग प्राप्त करना है।
xTaskCreatePinnedToCore () फ़ंक्शन 7 तर्क लेता है:
- कार्य को कार्यान्वित करने के लिए फ़ंक्शन नाम (task1)
- कार्य को दिया गया कोई भी नाम ("task1", आदि)
- स्टैक आकार शब्दों में कार्य के लिए आवंटित (1 शब्द = 2bytes)
- टास्क इनपुट पैरामीटर (NULL हो सकता है)
- कार्य की प्राथमिकता (0 सबसे कम प्राथमिकता है)
- टास्क हैंडल (NULL हो सकता है)
- कोर आईडी जहां कार्य चलेगा (0 या 1)
अब, xTaskCreatePinnedToCore () फ़ंक्शन में सभी तर्क देकर नेतृत्व को पलक झपकने के लिए टास्क 1 बनाएं।
xTaskCreatePinnedToCore (Task1code, "Task1", 10000, NULL, 1, NULL, 0);
इसी तरह, टास्क 2 के लिए टास्क 2 बनाएं और 7 वें तर्क में कोर आईडी 1 बनाएं ।
xTaskCreatePinnedToCore (Task2code, "Task2", 10000, NULL, 1, NULL, 1);
आप कार्य की जटिलता के आधार पर प्राथमिकता और स्टैक आकार बदल सकते हैं।
2. अब, हम Task1code और Task2code फ़ंक्शन को लागू करेंगे । इन कार्यों में आवश्यक कार्य के लिए कोड होता है। हमारे मामले में, पहला कार्य एलईडी झपकाएगा और दूसरा कार्य तापमान प्राप्त करेगा। तो शून्य सेटअप फ़ंक्शन के बाहर प्रत्येक कार्य के लिए दो अलग-अलग कार्य करें।
0.5 सेकंड के बाद बोर्ड पर पलक झपकने के लिए टास्क 1कोड फ़ंक्शन को नीचे दिखाए गए अनुसार लागू किया गया है।
शून्य Task1code (शून्य * पैरामीटर) { Serial.print ("कोर पर चल रहा टास्क 1 "); Serial.println (xPortGetCoreID ()); के लिए (;;) {// अनंत लूप डिजिटलवर्ट (एलईडी, हाई); देरी (500); digitalWrite (नेतृत्व में, कम); देरी (500); } }
इसी तरह, तापमान लाने के लिए टास्क 2कोड फ़ंक्शन को लागू करें ।
void Task2code (शून्य * pvParameters) {Serial.print ("कोर पर चल रहा टास्क 2 "); Serial.println (xPortGetCoreID ()); for (;;) { फ्लोट टी = dht.readTENS (); Serial.print ("तापमान:"); सीरियल.प्रिंट (टी); देरी (2000); } }
3. यहां शून्य लूप फ़ंक्शन खाली रहेगा। जैसा कि हम पहले से ही जानते हैं कि लूप और सेटअप फंक्शन कोर 1 पर चलता है इसलिए आप कोर 1 टास्क को शून्य लूप फंक्शन में भी लागू कर सकते हैं।
अब कोडिंग भाग समाप्त हो गया है, इसलिए बस टूल मेनू में ESP32 बोर्ड का चयन करके Arduino IDE का उपयोग करके कोड अपलोड करें। सुनिश्चित करें कि आपने DHT11 सेंसर को ESP32 के D13 को पिन करने के लिए कनेक्ट किया है।
अब परिणाम नीचे दिखाए गए सीरियल मॉनिटर या Arduino IDE पर देखे जा सकते हैं:
ईएसपी 32 के दोहरे कोर का उपयोग करके एक साथ कई कार्यों को चलाकर वास्तविक समय प्रणाली जैसे जटिल अनुप्रयोगों का निर्माण किया जा सकता है।
डेमो वीडियो के साथ पूरा कोड नीचे दिया गया है।