- Πλεονεκτήματα του πολυπύρηνου επεξεργαστή
- ESP32 και FreeRTOS
- Εύρεση του βασικού αναγνωριστικού ESP32
- Προγραμματισμός διπλού πυρήνα ESP32
Οι μονάδες ESP είναι δημοφιλείς για τις λειτουργίες Wi-Fi, όπως ESP8266, ESP-12E κ.λπ. Όλα αυτά είναι ισχυρές μονάδες μικροελεγκτή με λειτουργίες Wi-Fi. Υπάρχει μια ακόμη μονάδα ESP που είναι πιο ισχυρή και ευέλικτη από τις προηγούμενες μονάδες ESP - το όνομά της είναι ESP32. Διαθέτει συνδεσιμότητα Bluetooth και Wi-Fi και έχουμε ήδη εξηγήσει τις δυνατότητες BLE του ESP32 και χρησιμοποιήσαμε το ESP32 σε πολλά έργα IoT. Αλλά πολύ λίγοι άνθρωποι γνωρίζουν ότι το ESP32 είναι ένας μικροελεγκτής διπλού πυρήνα.
Το ESP32 διαθέτει δύο μικροεπεξεργαστές 32-bit Tensilica Xtensa LX6 που το καθιστούν έναν ισχυρό μικροελεγκτή διπλού πυρήνα (core0 και core1). Διατίθεται σε δύο παραλλαγές μονοπύρηνο και διπλό πυρήνα. Αλλά η παραλλαγή διπλού πυρήνα είναι πιο δημοφιλής επειδή δεν υπάρχει σημαντική διαφορά τιμής.
Το ESP32 μπορεί να προγραμματιστεί χρησιμοποιώντας τα Arduino IDE, Espressif IDF, Lua RTOS, κ.λπ. Κατά τον προγραμματισμό με το Arduino IDE, ο κωδικός εκτελείται μόνο στο Core1 επειδή ο Core0 είναι ήδη προγραμματισμένος για επικοινωνία RF. Αλλά εδώ είναι αυτό το σεμινάριο που θα δείξουμε πώς να χρησιμοποιήσουμε και τους δύο πυρήνες του ESP32 για να εκτελέσουμε ταυτόχρονα δύο λειτουργίες. Εδώ η πρώτη εργασία θα είναι να αναβοσβήνει το ενσωματωμένο LED και η δεύτερη εργασία θα είναι η λήψη δεδομένων θερμοκρασίας από τον αισθητήρα DHT11.
Ας δούμε πρώτα τα πλεονεκτήματα ενός πολυπύρηνου επεξεργαστή έναντι ενός πυρήνα.
Πλεονεκτήματα του πολυπύρηνου επεξεργαστή
- Οι πολυπύρηνοι επεξεργαστές είναι χρήσιμοι όταν υπάρχουν περισσότερες από 2 διεργασίες για να λειτουργούν ταυτόχρονα.
- Καθώς η εργασία κατανέμεται μεταξύ διαφορετικών πυρήνων, η ταχύτητά της αυξάνεται και πολλές διαδικασίες μπορούν να ολοκληρωθούν ταυτόχρονα.
- Η κατανάλωση ενέργειας μπορεί να μειωθεί επειδή όταν οποιοσδήποτε πυρήνας βρίσκεται σε κατάσταση αδράνειας από αυτόν μπορεί να χρησιμοποιηθεί για να κλείσει τα περιφερειακά που δεν χρησιμοποιούνται εκείνη τη στιγμή.
- Οι επεξεργαστές διπλού πυρήνα πρέπει να εναλλάσσονται μεταξύ διαφορετικών νημάτων λιγότερο συχνά από τους επεξεργαστές ενός πυρήνα, επειδή μπορούν να χειριστούν δύο ταυτόχρονα αντί για έναν κάθε φορά.
ESP32 και FreeRTOS
Η πλακέτα ESP32 έχει ήδη εγκατεστημένο το firmware FreeRTOS. Το FreeRTOS είναι ένα λειτουργικό σύστημα ανοιχτού κώδικα σε πραγματικό χρόνο, το οποίο είναι πολύ χρήσιμο για πολλαπλές εργασίες. Το RTOS βοηθά στη διαχείριση των πόρων και στη μεγιστοποίηση της απόδοσης του συστήματος. Το FreeRTOS έχει πολλές λειτουργίες API για διαφορετικούς σκοπούς και χρησιμοποιώντας αυτά τα API, μπορούμε να δημιουργήσουμε εργασίες και να τις κάνουμε να εκτελούνται σε διαφορετικούς πυρήνες.
Πλήρης τεκμηρίωση των API FreeRTOS μπορείτε να βρείτε εδώ. Θα προσπαθήσουμε να χρησιμοποιήσουμε ορισμένα API στον κώδικα μας για να δημιουργήσουμε μια εφαρμογή πολλαπλών εργασιών που θα εκτελείται και στους δύο πυρήνες.
Εύρεση του βασικού αναγνωριστικού ESP32
Εδώ θα χρησιμοποιήσουμε το Arduino IDE για να ανεβάσουμε τον κωδικό στο ESP32. Για να γνωρίζετε το Core ID στο οποίο εκτελείται ο κώδικας, υπάρχει μια συνάρτηση API
xPortGetCoreID ()
Αυτή η συνάρτηση μπορεί να κληθεί από τη λειτουργία κενής ρύθμισης () και τη λειτουργία βρόχου βρόχου () για να γνωρίζει το βασικό αναγνωριστικό στο οποίο εκτελούνται αυτές οι λειτουργίες.
Μπορείτε να δοκιμάσετε αυτό το API ανεβάζοντας το παρακάτω σκίτσο:
άκυρη ρύθμιση () { Serial.begin (115200); Η λειτουργία Serial.print ("setup () εκτελείται στον πυρήνα:"); Serial.println (xPortGetCoreID ()); } void loop () { Serial.print ("loop () λειτουργία που εκτελείται στον πυρήνα:"); Serial.println (xPortGetCoreID ()); }
Αφού ανεβάσετε το παραπάνω σκίτσο, ανοίξτε το Serial monitor και θα διαπιστώσετε ότι και οι δύο λειτουργίες εκτελούνται στον πυρήνα1 όπως φαίνεται παρακάτω.
Από τις παραπάνω παρατηρήσεις, μπορεί να συναχθεί το συμπέρασμα ότι το προεπιλεγμένο σκίτσο Arduino τρέχει πάντα στον πυρήνα1.
Προγραμματισμός διπλού πυρήνα ESP32
Το Arduino IDE υποστηρίζει FreeRTOS για ESP32 και API FreeRTOS που μας επιτρέπουν να δημιουργούμε εργασίες που μπορούν να εκτελούνται ανεξάρτητα και στους δύο πυρήνες. Η εργασία είναι το κομμάτι του κώδικα που εκτελεί κάποια λειτουργία στον πίνακα, όπως το LED που αναβοσβήνει, η θερμοκρασία αποστολής κ.λπ.
Η παρακάτω συνάρτηση χρησιμοποιείται για τη δημιουργία εργασιών που μπορούν να εκτελεστούν και στους δύο πυρήνες. Σε αυτήν τη συνάρτηση, πρέπει να δώσουμε κάποια επιχειρήματα όπως προτεραιότητα, βασικό αναγνωριστικό κ.λπ.
Τώρα, ακολουθήστε τα παρακάτω βήματα για να δημιουργήσετε τη λειτουργία εργασίας και εργασίας.
1. Αρχικά, δημιουργήστε εργασίες στη λειτουργία ρύθμισης κενού . Εδώ θα δημιουργήσουμε δύο εργασίες, μία για το LED που αναβοσβήνει μετά από κάθε 0,5 δευτερόλεπτα και μια άλλη εργασία είναι η ανάγνωση της θερμοκρασίας μετά από κάθε 2 δευτερόλεπτα.
Η συνάρτηση xTaskCreatePinnedToCore () περιλαμβάνει 7 ορίσματα:
- Όνομα συνάρτησης για την εκτέλεση της εργασίας (task1)
- Οποιοδήποτε όνομα δίνεται στην εργασία ("task1", κ.λπ.)
- Μέγεθος στοίβας που κατανέμεται στην εργασία σε λέξεις (1 λέξη = 2bytes)
- Παράμετρος εισαγωγής εργασιών (μπορεί να είναι NULL)
- Προτεραιότητα της εργασίας (0 είναι η χαμηλότερη προτεραιότητα)
- Λαβή εργασιών (μπορεί να είναι NULL)
- Βασικό αναγνωριστικό όπου θα εκτελεστεί η εργασία (0 ή 1)
Τώρα, δημιουργήστε Task1 για να αναβοσβήνει το led δίνοντας όλα τα ορίσματα στη συνάρτηση xTaskCreatePinnedToCore ().
xTaskCreatePinnedToCore (Task1code, "Task1", 10000, NULL, 1, NULL, 0);
Ομοίως, δημιουργούν Task2 για Task2 και να κάνει πυρήνα id 1 στο 7 ου επιχείρημα.
xTaskCreatePinnedToCore (Task2code, "Task2", 10000, NULL, 1, NULL, 1);
Μπορείτε να αλλάξετε το μέγεθος προτεραιότητας και στοίβας ανάλογα με την πολυπλοκότητα της εργασίας.
2. Τώρα, θα εφαρμόσουμε τη συνάρτηση Task1code και Task2code . Αυτές οι λειτουργίες περιέχουν τον κωδικό για την απαιτούμενη εργασία. Στην περίπτωσή μας, η πρώτη εργασία θα αναβοσβήνει το led και μια άλλη εργασία θα πάρει τη θερμοκρασία. Κάντε λοιπόν δύο ξεχωριστές λειτουργίες για κάθε εργασία εκτός της λειτουργίας κενής ρύθμισης
Η συνάρτηση Task1code για αναβοσβήνει στο ενσωματωμένο led μετά από 0,5 δευτερόλεπτα εφαρμόζεται όπως φαίνεται παρακάτω.
Void Task1code (void * parameter) { Serial.print ("Task1 εκτελείται στον πυρήνα"); Serial.println (xPortGetCoreID ()); για (;;) {// infinite loop digitalWrite (led, HIGH); καθυστέρηση (500) digitalWrite (οδήγησε, LOW)? καθυστέρησης (500)? } }
Ομοίως, εφαρμόστε τη συνάρτηση Task2code για τη λήψη της θερμοκρασίας.
void Task2code (void * pvParameters) { Serial.print ("Task2 εκτελείται στον πυρήνα"); Serial.println (xPortGetCoreID ()); για (;;) { float t = dht.readTemperature (); Serial.print ("Θερμοκρασία:"); Serial.print (t); καθυστέρηση (2000); } }
3. Εδώ η λειτουργία κενού βρόχου θα παραμείνει κενή. Όπως ήδη γνωρίζουμε ότι η λειτουργία βρόχου και ρύθμισης εκτελείται στον πυρήνα1, ώστε να μπορείτε να εφαρμόσετε την εργασία core1 σε λειτουργία βρόχου βρόχου .
Τώρα το τμήμα κωδικοποίησης έχει τελειώσει, οπότε απλώς ανεβάστε τον κωδικό χρησιμοποιώντας το Arduino IDE επιλέγοντας την πλακέτα ESP32 στο μενού Εργαλεία. Βεβαιωθείτε ότι έχετε συνδέσει τον αισθητήρα DHT11 στον ακροδέκτη D13 του ESP32.
Τώρα τα αποτελέσματα μπορούν να παρακολουθούνται σε Serial Monitor ή Arduino IDE όπως φαίνεται παρακάτω:
Πολύπλοκες εφαρμογές όπως το σύστημα σε πραγματικό χρόνο μπορούν να κατασκευαστούν εκτελώντας πολλές εργασίες ταυτόχρονα χρησιμοποιώντας διπλούς πυρήνες του ESP32.
Ο πλήρης κώδικας μαζί με ένα βίντεο επίδειξης δίνεται παρακάτω.