Κέρδη:
- Δυνατότητα καθορισμού απαιτήσεων καταχωρητή, διακοπής και χρονισμού για τον μικροελεγκτή με σαφή προτροπή
- Δυνατότητα ελέγχου του κώδικα C/Arduino που παράγεται από AI όσον αφορά τις ρυθμίσεις καταχωρητή, την υπερχείλιση buffer και τους περιορισμούς σε πραγματικό χρόνο
- Δυνατότητα εφαρμογής της συνήθειας επαλήθευσης του παραγόμενου κώδικα μετρώντας τον σε υλικό (παλμογράφο, σειριακή θύρα)
Η ανάπτυξη ενσωματωμένου συστήματος είναι όπου τέμνονται το λογισμικό και το υλικό: η εσφαλμένη ρύθμιση ενός bit καταχωρητή, η παρατεταμένη διατήρηση μιας διακοπής ή η υπερχείλιση μιας προσωρινής μνήμης θα προκαλέσει παράξενες, δύσκολες στην αναπαραγωγή αστοχίες στο πεδίο, παρόλο που ο κώδικας «μεταγλωττίζεται» και εκτελείται. Το AI είναι πραγματικά ένας επιταχυντής σε αυτόν τον τομέα. Μπορεί να παράγει αρχικούς σκελετούς, λειτουργίες αφαίρεσης υλικού, μηχανές κατάστασης και ρουτίνες επικοινωνίας. Αλλά η τεχνητή νοημοσύνη δεν βλέπει το φύλλο δεδομένων της κάρτας σας, δεν γνωρίζει τη συχνότητα του ρολογιού σας και δεν αντιλαμβάνεται τους περιορισμούς πραγματικού χρόνου σας. Σε αυτήν την ενότητα, θα καλύψουμε πώς να ορίσετε με σαφήνεια την εργασία του μικροελεγκτή στο AI, πώς να ελέγξετε τον παραγόμενο κώδικα C/Arduino και γιατί πρέπει να μετράτε τα πάντα στο υλικό.
Καθορισμός της απαίτησης με σαφήνεια: Εγγραφή, κοπή, χρονισμός
Το να πείτε στην τεχνητή νοημοσύνη να "ανάψει ένα LED" δεν θα λειτουργήσει. Ποια κάρτα, ποια καρφίτσα, ποια συχνότητα ρολογιού, ποιος χρονισμός; Όταν αναθέτετε μια ενσωματωμένη εργασία στο AI, χρησιμοποιήστε αυτό το πλαίσιο: υλικό (οικογένεια MCU, ρολόι, pin), λειτουργία (τι θα συμβεί), περιορισμός (χρονομέτρηση, ισχύς, μνήμη) και διεπαφή (register, HAL, βιβλιοθήκη Arduino).
Αδύναμη προτροπή / Ισχυρή προτροπή
ΑΔΥΝΑΤΟ: "Δημιουργία PWM με STM32." (Αποτέλεσμα: ποιος χρονοδιακόπτης, ποια συχνότητα, ποια ακίδα είναι ασαφής. γενικός, πιθανώς λάθος καταχωρητής με όνομα κωδικός.) ΔΥΝΑΤΟ: "Παραγωγή 20 kHz, 0-100% ρυθμιζόμενης λειτουργίας PWM στο TIM3 CH1 (PA6) για STM32F103 (72 MHz ρολόι συστήματος). Γράψτε σε επίπεδο καταχωρητή -RRHzcale (not). ΥΠΟΛΟΓΙΣΤΕ και εμφανίστε τον υπολογισμό στη γραμμή σχολίων - Ρυθμίστε το καθήκον με μια παράμετρο συνάρτησης μεταξύ 0-100 - Σχολιάστε κάθε bit καταχωρητή που χρησιμοποιείτε.
Η διαφορά είναι ότι η ισχυρή προτροπή κάνει το μοντέλο να δείχνει τον υπολογισμό και να αποκαλύπτει την υπόθεση του ρολογιού. Έτσι, μπορείτε να ελέγξετε ανεξάρτητα τις τιμές prescaler/ARR:
Για 20 kHz PWM (72 MHz clock):Timer_clock = 72 MHzΑν θέλουμε prescaler = 72-1 → counter clock = 1 MHzARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49Επαλήθευση: 1e+10) = 4
Έλεγχος κώδικα AI: Τι να ψάξετε;
Ακριβώς επειδή ο κώδικας που δημιουργείται μεταγλωττίζεται δεν σημαίνει ότι λειτουργεί σωστά. Ακολουθήστε αυτήν τη λίστα ελέγχου:
περιοχή ελέγχου
Τι να ψάξετε
Ρυθμίσεις εγγραφής/bit
Ακριβώς συμβατό με φύλλο δεδομένων, σωστή μάσκα bit
Διακοπή (ISR)
Είναι σύντομο; Δεν υπάρχει καθυστέρηση αποκλεισμού; Χρησιμοποιείται πτητικό;
buffer/array
Υπάρχει έλεγχος στα σύνορα; Κίνδυνος υπερχείλισης;
χρονοδιάγραμμα
Με καθυστέρηση ή χρονόμετρο; Τηρείται ο πραγματικός χρονικός περιορισμός;
Τύπος και πλάτος
Υπερχείλιση 8/16/32 bit, σύγχυση υπογεγραμμένη/ανυπόγραφη
δύναμη/φύλακας
Φύλακας τροφοδοσίας άπειρου βρόχου;
Οι ρουτίνες υπηρεσιών διακοπής (ISR) είναι η πιο κοινή πηγή σφαλμάτων. Το AI μερικές φορές βάζει delay() ή long loop μέσα στο ISR. Αυτό οδηγεί σε απώλεια άλλων διακοπών και επαναφορά του φύλακα. Κανόνας: Το ISR πρέπει να είναι όσο το δυνατόν πιο σύντομο. Η κύρια δουλειά θα πρέπει να είναι να δημιουργήσετε μια σημαία και να την μετακινήσετε στον κύριο βρόχο.
// ΑΔΥΝΑΤΗ (Η AI μερικές φορές το παράγει αυτό): Λειτουργία αποκλεισμού σε ISR void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; read_sensor(); // μπορεί να πάρει πολύ χρόνο - BAD CASE_Delay(10); // καθυστέρηση στο ISR - ΠΟΛΥ ΚΑΚΗ }}// STRONG: ISR short; Η εργασία μετακινείται στον κύριο βρόχο πτητικό uint8_t tick_flag = 0; // volatile CONDITIONvoid TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; tick_flag = 1; //απλώς ορίστε τη σημαία }}// στον κύριο βρόχο:if (tick_flag) { tick_flag = 0; read_sensor(); }
Προσοχή: Οποιαδήποτε μεταβλητή που μοιράζεται μεταξύ της διακοπής και του κύριου βρόχου πρέπει να είναι πτητική. Διαφορετικά, ο μεταγλωττιστής ενδέχεται να αποθηκεύσει προσωρινά τη μεταβλητή στον καταχωρητή και να χάσει την ενημέρωση. Η τεχνητή νοημοσύνη συχνά ξεχνά αυτή τη λέξη-κλειδί. Αναζητήστε το ειδικά όταν διαβάζετε τον κώδικα.
Υπερχείλιση buffer και Σφάλματα τύπου
Το AI μπορεί να αντιγράψει δεδομένα από τη σειριακή θύρα σε μια συστοιχία σταθερού μεγέθους χωρίς έλεγχο ορίων. Σε ένα ενσωματωμένο σύστημα, αυτό σημαίνει σύνθλιψη συνεχόμενης μνήμης και ανεξήγητα σφάλματα. Βεβαιωθείτε ότι το όριο έχει ελεγχθεί σε κάθε strcpy, ευρετήριο πίνακα και προσωρινή μνήμη DMA. Ομοίως, ένας μετρητής 8-bit επαναφέρει μετά το 255. Η τεχνητή νοημοσύνη μπορεί να το αγνοήσει και να βασιστεί σε έναν υπερχειλισμένο λογαριασμό.
Επαλήθευση σε Υλικό: Η "Εργασία" μετριέται, δεν υποτίθεται
Σε ένα ενσωματωμένο σύστημα, η πιο αξιόπιστη απόδειξη είναι ο μετρητής, όχι ο μεταγλωττιστής. Επαληθεύστε τον κώδικα που δημιουργήθηκε με αυτούς τους τρεις τρόπους:
- Παλμογράφος/λογικός αναλυτής: Μετρήστε τη συχνότητα PWM, το χρονισμό του σήματος και την κυματομορφή επικοινωνίας. Αν θέλετε 20 kHz, δείτε 20 kHz στην οθόνη.
- Καταγραφή σειριακής θύρας (UART): Εκτυπώστε τιμές μεταβλητών, μεταβάσεις καταστάσεων και μετρητές σφαλμάτων και συγκρίνετε με την αναμενόμενη συμπεριφορά.
- Δοκιμή περιορισμού και ακραίων καταστάσεων: Ελέγξτε εάν το σύστημα αντέχει κάτω από το υψηλότερο φορτίο, τα ταχύτερα δεδομένα και τον χειρότερο χρόνο.
Εάν η μετρούμενη τιμή δεν συμφωνεί με τον υπολογισμό, η υπόθεση του ρολογιού, η τιμή προκλιμακωτή ή η ρύθμιση καταχωρητή είναι εσφαλμένη. κυνηγητό.
Μίνι θήκη
Μια ομάδα μαθητών έχει την τεχνητή νοημοσύνη να εκτυπώσει έναν κωδικό μέτρησης απόστασης με έναν αισθητήρα υπερήχων HC-SR04. Ο κώδικας μεταγλωττίζεται αλλά η απόσταση δίνει πάντα γελοίες τιμές. Όταν το συνδέουν με τον παλμογράφο, βλέπουν ότι το πόδι ηχούς υπολογίζει το χρόνο του σε χιλιοστά του δευτερολέπτου αντί για μικροδευτερόλεπτα. Το AI χρησιμοποίησε millis() αντί για micros(). Αυτό το μονολεκτικό σφάλμα μπέρδεψε ολόκληρη τη μέτρηση κατά ένα συντελεστή 1000. Όταν εκτυπώνουν τον ακατέργαστο χρόνο ηχούς στο σειριακό αρχείο και τον συγκρίνουν με έναν πραγματικό χάρακα, βρίσκουν το σφάλμα και το διορθώνουν. Μάθημα: ο μεταγλωττισμένος κώδικας δεν είναι σωστός κώδικας. Η μέτρηση στο υλικό αποκαλύπτει το σφάλμα αμέσως.
Κοινά λάθη
- Αποδοχή ονομάτων καταχωρητών και μάσκας bit χωρίς να τα συγκρίνετε με το φύλλο δεδομένων.
- Επιτρέποντας καθυστέρηση αποκλεισμού ή μεγάλη επεξεργασία εντός του ISR.
- Ξεχνώντας το πτητικό σε κοινόχρηστες μεταβλητές.
- Παράκαμψη του buffer και των ορίων πίνακα. μη βλέποντας την υπερχείλιση.
- Βασιζόμενοι σε υποθέσεις συχνότητας ρολογιού και χρονισμού χωρίς να τις επαληθεύσουμε.
- Θεωρώντας ότι ο κωδικός "λειτουργεί" χωρίς να τον μετρήσετε με παλμογράφο/σειριακό ημερολόγιο.
Συνοπτικά
- Καθορίστε με σαφήνεια την ενσωματωμένη εργασία όσον αφορά το υλικό, τη λειτουργία, τους περιορισμούς και τη διεπαφή.
- Έχετε το AI να υπολογίζει τις τιμές χρονισμού, όπως prescaler/ARR και επαληθεύστε τις ανεξάρτητα.
- Διατηρήστε τα ISR σύντομα, χρησιμοποιήστε πτητικά σε κοινόχρηστες μεταβλητές.
- Αναζητήστε συγκεκριμένα σφάλματα μητρώου, ορίου buffer και πλάτους τύπου.
- Το "Λειτουργεί" αποδεικνύεται με παλμογράφο, λογικό αναλυτή και σειριακό αρχείο καταγραφής, όχι με τον μεταγλωττιστή.
- Εάν η μετρούμενη τιμή δεν συμφωνεί με τον υπολογισμό, ακολουθήστε τις παραδοχές.
Εργασία εφαρμογής
Με έναν μικροελεγκτή που έχετε (Arduino, STM32, ESP32), ζητήστε από το AI για PWM ή μια περιοδική εργασία σε μια συγκεκριμένη συχνότητα. Πριν από τη φόρτωση του κώδικα: (1) επαληθεύστε τις τιμές συχνότητας/χρονισμού ανεξάρτητα από τον λογαριασμό στη γραμμή σχολίων, (2) ελέγξτε για ασταθή και αποκλεισμό στο ISR και σε κοινόχρηστες μεταβλητές. Μετά τη μεταφόρτωση, μετρήστε την πραγματική συχνότητα με έναν παλμογράφο ή λογικό αναλυτή και συγκρίνετε τη με τον στόχο. Εάν υπάρχει απόκλιση, βρείτε την πηγή και διορθώστε την και σημειώστε τι θεωρήθηκε λάθος.