Λειτουργία καθυστέρησης Arduino και γιατί δεν πρέπει να το χρησιμοποιήσετε

Λειτουργία καθυστέρησης Arduino και γιατί δεν πρέπει να το χρησιμοποιήσετε

Όταν πρωτοξεκινήσατε μαθαίνοντας πώς να αναπτύσσεται Για το Arduino , πιθανότατα φτιάξατε ένα προϊόν που λειτουργεί κάπως έτσι:





Συνδεδεμένο με το Arduino σας θα υπάρχει μια ενιαία λυχνία LED. Αυτό θα απενεργοποιήθηκε κάθε δευτερόλεπτο και θα συνεχιστεί μέχρι να απενεργοποιηθεί το Arduino. Αυτό είναι το πρόγραμμα 'Hello World' του Arduino , και απεικονίζει τέλεια πώς μερικές γραμμές κώδικα μπορούν να δημιουργήσουν κάτι απτό.





Είμαι επίσης πρόθυμος να στοιχηματίσω ότι χρησιμοποιήσατε το καθυστέρηση() λειτουργία για τον καθορισμό των διαστημάτων μεταξύ του φωτός που ανάβει και σβήνει. Αλλά εδώ είναι το πράγμα: ενώ η καθυστέρηση είναι βολική για βασικές επιδείξεις για το πώς λειτουργεί το Arduino, πραγματικά δεν πρέπει να το χρησιμοποιείτε στον πραγματικό κόσμο. Να γιατί - και τι πρέπει να χρησιμοποιήσετε αντ 'αυτού.





Πώς λειτουργεί η καθυστέρηση ()

Ο τρόπος ο καθυστέρηση() η λειτουργία λειτουργεί πολύ απλά. Δέχεται ένα μόνο ακέραιο (ή αριθμό) όρισμα. Αυτός ο αριθμός αντιπροσωπεύει το χρόνο (μετρημένο σε χιλιοστά του δευτερολέπτου) που πρέπει να περιμένει το πρόγραμμα μέχρι να προχωρήσει στην επόμενη γραμμή κώδικα.

Αλλά το πρόβλημα είναι, το καθυστέρηση() η λειτουργία δεν είναι ένας καλός τρόπος για να κάνετε το πρόγραμμα να περιμένει, επειδή είναι αυτό που είναι γνωστό ως συνάρτηση 'αποκλεισμού'.



google drive αυτό το βίντεο δεν μπορεί να αναπαραχθεί

Η διαφορά μεταξύ λειτουργιών αποκλεισμού και μη αποκλεισμού

Για να εξηγήσω γιατί οι λειτουργίες αποκλεισμού είναι κακές, θέλω να φανταστείτε δύο διαφορετικούς σεφ σε μια κουζίνα: Henry Blocking , και Eduardo NonBlocking Το Και οι δύο κάνουν την ίδια δουλειά, αλλά με πολύ διαφορετικούς τρόπους.

Όταν ο Χένρι ετοιμάζει πρωινό, ξεκινά βάζοντας δύο στροφές ψωμιού στην τοστιέρα. Όταν τελικά πινγκ , και το ψωμί ξεπροβάλλει, ο Χένρι το βάζει σε ένα πιάτο και σπάει δύο αυγά σε ένα τηγάνι. Και πάλι, στέκεται δίπλα καθώς το λάδι σκάει και τα λευκά αρχίζουν να σκληραίνουν. Όταν τελειώσουν, τα πιάτα και αρχίζει να τηγανίζει δύο μπέικον. Μόλις γίνουν αρκετά τραγανά, τα βγάζει από το τηγάνι, τα βάζει στο πιάτο και αρχίζει να τρώει.





Ο Eduardo λειτουργεί με λίγο διαφορετικό τρόπο. Ενώ το ψωμί του φρυγανίζει, έχει ήδη αρχίσει να τηγανίζει τα αυγά και το μπέικον του. Αντί να περιμένει ένα προϊόν να τελειώσει το μαγείρεμα πριν περάσει στο επόμενο, μαγειρεύει πολλά αντικείμενα ταυτόχρονα Το Το τελικό αποτέλεσμα είναι ότι ο Eduardo χρειάζεται λιγότερο χρόνο για να φτιάξει πρωινό από τον Henry - και μέχρι να τελειώσει ο Henry Blocking, το τοστ και τα αυγά έχουν κρυώσει.

Είναι μια ανόητη αναλογία, αλλά απεικονίζει το θέμα.





Αποκλεισμός Οι λειτουργίες εμποδίζουν ένα πρόγραμμα να κάνει οτιδήποτε άλλο μέχρι να ολοκληρωθεί η συγκεκριμένη εργασία. Αν θέλετε πολλαπλά Ενέργειες να συμβεί ταυτόχρονα, απλά δεν μπορείτε να το χρησιμοποιήσετε καθυστέρηση() Το

Ειδικότερα, εάν η εφαρμογή σας απαιτεί τη συνεχή λήψη δεδομένων από συνημμένους αισθητήρες, θα πρέπει να φροντίσετε να αποφύγετε τη χρήση του καθυστέρηση() λειτουργία, καθώς κάνει παύση απόλυτα τα παντα Το

Ευτυχώς, καθυστέρηση() δεν είναι ο μόνος τρόπος για να κάνετε το πρόγραμμά σας να περιμένει κατά την κωδικοποίηση του Arduino.

Γνωρίστε τη Millis ()

ο millis () η συνάρτηση εκτελεί μία μόνο εργασία. Όταν κληθεί, επιστρέφει (ως μακρύς datatype) τον αριθμό των χιλιοστών του δευτερολέπτου που έχουν παρέλθει από την πρώτη εκκίνηση του προγράμματος. Λοιπόν, γιατί είναι χρήσιμο;

Επειδή χρησιμοποιώντας λίγα απλά μαθηματικά, μπορείτε εύκολα να «χρονομετρήσετε» πτυχές του προγράμματος σας χωρίς να επηρεάσετε τον τρόπο λειτουργίας του. Το παρακάτω είναι μια βασική επίδειξη για το πώς λειτουργεί το millis (). Όπως θα δείτε, το πρόγραμμα θα ανάψει το φως LED για 1000 χιλιοστά του δευτερολέπτου (ένα δευτερόλεπτο) και στη συνέχεια θα το σβήσει. Αλλά το πιο σημαντικό, το κάνει με τρόπο που δεν εμποδίζει.

Τώρα ας δούμε πώς λειτουργεί με το Arduino.

Αυτό το πρόγραμμα - η οποία βασίζεται σε μεγάλο βαθμό σε ένα από την επίσημη τεκμηρίωση Arduino - λειτουργεί αφαιρώντας την προηγούμενη καταγεγραμμένη ώρα από την τρέχουσα. Εάν το υπόλοιπο (δηλαδή ο χρόνος που μεσολάβησε από την τελευταία εγγραφή του χρόνου) είναι μεγαλύτερο από το διάστημα (στην περίπτωση αυτή, 1000 χιλιοστά του δευτερολέπτου), το πρόγραμμα ενημερώνει το προηγούμενος χρόνος μεταβλητή στην τρέχουσα ώρα και είτε ενεργοποιεί είτε απενεργοποιεί τη λυχνία LED.

εγκαταστήστε το remix os στο σκληρό δίσκο

Και επειδή είναι ένας αποκλεισμός, οποιοσδήποτε κώδικας βρίσκεται έξω από αυτόν πρώτα αν δήλωση πρέπει να λειτουργεί κανονικά.

Απλό, έτσι δεν είναι; Σημειώστε πώς δημιουργήσαμε τη μεταβλητή currentTime ως ένα ανυπόγραφο μακρύς. Ενα ανυπόγραφο αξία σημαίνει απλώς ότι δεν μπορεί ποτέ να είναι αρνητική. το κάνουμε έτσι ώστε ο μέγιστος αριθμός που μπορούμε να αποθηκεύσουμε να είναι μεγαλύτερος. Από προεπιλογή, οι μεταβλητές αριθμών υπογράφονται, πράγμα που σημαίνει ότι ένα «bit» μνήμης για τη μεταβλητή αυτή χρησιμοποιείται για την αποθήκευση του εάν η τιμή είναι θετική ή αρνητική. Καθορίζοντας ότι θα είναι μόνο θετικό, έχουμε ένα επιπλέον κομμάτι για να παίξουμε.

Διακόπτει

Μέχρι στιγμής, έχουμε μάθει για έναν τρόπο προσέγγισης του χρόνου στο πρόγραμμα Arduino που είναι καλύτερος από καθυστέρηση() Το Αλλά υπάρχει ένας άλλος, πολύ καλύτερος τρόπος, αλλά πιο πολύπλοκος: διακόπτει Το Αυτά έχουν το πλεονέκτημα ότι σας επιτρέπουν να χρονομετρήσετε με ακρίβεια το πρόγραμμα Arduino και να απαντήσετε γρήγορα σε μια εξωτερική είσοδο, αλλά σε ένα ασύγχρονη τρόπος.

Αυτό σημαίνει ότι λειτουργεί σε συνδυασμό με το κύριο πρόγραμμα, περιμένοντας συνεχώς να συμβεί ένα συμβάν, χωρίς να διακόπτεται η ροή του κώδικα σας. Αυτό σας βοηθά να ανταποκρίνεστε αποτελεσματικά σε συμβάντα, χωρίς να επηρεάζετε την απόδοση του επεξεργαστή Arduino.

Όταν ενεργοποιείται μια διακοπή, είτε σταματά το πρόγραμμα είτε καλεί μια συνάρτηση, κοινώς γνωστή ως Διακοπή χειριστή ή ένα Διακοπή ρουτίνας υπηρεσίας Το Μόλις ολοκληρωθεί αυτό, το πρόγραμμα επιστρέφει στη συνέχεια σε αυτό που συνέβαινε.

Το τσιπ AVR που τροφοδοτεί το Arduino υποστηρίζει μόνο διακοπές υλικού. Αυτά συμβαίνουν όταν ένας πείρος εισόδου πηγαίνει από ψηλά σε χαμηλά ή όταν ενεργοποιείται από τα ενσωματωμένα χρονόμετρα του Arduino.

Ακούγεται κρυπτικό. Μπερδεμένο, ακόμη και. Αλλά δεν είναι. Για να δείτε πώς λειτουργούν και να δείτε μερικά παραδείγματα που χρησιμοποιούνται στον πραγματικό κόσμο, χτύπησε την τεκμηρίωση Arduino Το

Μην μπλοκάρετε

Χρησιμοποιώντας millis () ομολογουμένως χρειάζεται λίγη επιπλέον εργασία σε σύγκριση με τη χρήση καθυστέρηση() Το Αλλά πιστέψτε με, τα προγράμματά σας θα σας ευχαριστήσουν για αυτό και δεν μπορείτε να κάνετε πολλαπλές εργασίες στο Arduino χωρίς αυτό.

Αν θέλετε να δείτε ένα παράδειγμα millis () που χρησιμοποιείται σε ένα πραγματικό έργο Arduino, δείτε το Arduino Night Light και το Sunrise Alarm του James Bruce.

Βρήκατε άλλες λειτουργίες αποκλεισμού που πρέπει να προσέχουμε; Ενημερώστε με στα παρακάτω σχόλια και θα συζητήσουμε.

Συντελεστές φωτογραφίας: Arduino (Ντάνιελ Σπίς) , Αρχηγός (Όλι Σβένσον)

Μερίδιο Μερίδιο Τιτίβισμα ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ Αξίζει την αναβάθμιση σε Windows 11;

Τα Windows έχουν επανασχεδιαστεί. Είναι όμως αυτό αρκετό για να σας πείσει να μεταβείτε από τα Windows 10 στα Windows 11;

Διαβάστε Επόμενο
Σχετικά θέματα
  • DIY
  • Προγραμματισμός
  • Arduino
Σχετικά με τον Συγγραφέα Μάθιου Χιουζ(Δημοσιεύθηκαν 386 άρθρα)

Ο Matthew Hughes είναι προγραμματιστής λογισμικού και συγγραφέας από το Λίβερπουλ της Αγγλίας. Σπάνια βρίσκεται χωρίς ένα φλιτζάνι δυνατό μαύρο καφέ στο χέρι και λατρεύει απόλυτα το Macbook Pro και τη φωτογραφική του μηχανή. Μπορείτε να διαβάσετε το ιστολόγιό του στη διεύθυνση http://www.matthewhughes.co.uk και να τον ακολουθήσετε στο twitter στο @matthewhughes.

πώς να αποκτήσετε emojis για το ios 9 στο android
Περισσότερα από τον Matthew Hughes

Εγγραφείτε στο newsletter μας

Εγγραφείτε στο ενημερωτικό μας δελτίο για τεχνικές συμβουλές, κριτικές, δωρεάν ebooks και αποκλειστικές προσφορές!

Κάντε κλικ εδώ για εγγραφή
Κατηγορία Diy