Ξεκινήστε με εντοπισμό σφαλμάτων εντός κυκλώματος - 💡 Fix My Ideas

Ξεκινήστε με εντοπισμό σφαλμάτων εντός κυκλώματος

Ξεκινήστε με εντοπισμό σφαλμάτων εντός κυκλώματος


Συγγραφέας: Ethan Holmes, 2019

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

Μερικοί από εσάς ήδη γνωρίζετε την απομάκρυνση σε επίπεδο πηγής από άλλα περιβάλλοντα, όπως την αποσφαλμάτωση εφαρμογών επιφάνειας εργασίας σε Xcode ή Visual Studio, χρησιμοποιώντας σημεία διακοπής και λειτουργίες ενός βήματος για δέσμες ενεργειών σε μια κονσόλα του προγράμματος περιήγησης ιστού ή χρησιμοποιώντας ένα αυτόνομο εργαλείο εντοπισμού σφαλμάτων, όπως το GNU Debugger, WinDbg , ή LLDB. Εάν είστε πιο συνηθισμένοι στο Arduino, ωστόσο, αυτό το είδος εργαλείου ίσως είναι καινούργιο για εσάς.

Ο εντοπιστής σφαλμάτων γενικά αναφέρεται σε ένα σύστημα που αποτελείται από λογισμικό εντοπισμού σφαλμάτων στον υπολογιστή σας, πιθανώς λογισμικό στο τσιπ που δοκιμάζετε και συνήθως κάποιο υλικό τόσο μέσα όσο και έξω από το τσιπ. Πολλοί μικροελεγκτές διαθέτουν ένα debugger (OCD) σε τσιπ που ψημένο στο πυρίτιο.

Ένα πρόγραμμα εντοπισμού σφαλμάτων μπορεί να περνάει μέσα από μία γραμμή ή μία εντολή ταυτόχρονα, ενώ δείχνει το περιεχόμενο των μεταβλητών και μπορεί να προβάλει ή να επεξεργαστεί μνήμη. Μπορείτε να εκτελέσετε το πρόγραμμά σας με πλήρη ταχύτητα μέχρι να χτυπήσει ένα σημείο διακοπής - μια εσκεμμένη παύση στον κώδικα σας - όπου σταματά και το πρόγραμμα εντοπισμού σφαλμάτων ξαναρχίζει. Με ένα προσαρμοσμένο πρόγραμμα εντοπισμού σφαλμάτων, μπορείτε επίσης να αλληλεπιδράσετε με τα περιφερειακά του επεξεργαστή, να φορτώσετε προγράμματα σε μνήμη flash και να διαβάσετε τα περιεχόμενα του φλας (εκτός εάν υπάρχουν προστασίες για να αποφευχθεί αυτό!).

Τι είναι ένας διακομιστής εντοπισμού σφαλμάτων;

Η εφαρμογή εντοπισμού σφαλμάτων στον υπολογιστή σας διατηρεί έναν λεπτομερή χάρτη μνήμης για τον κώδικα, αλλά χρειάζεστε επίσης κάποιο υλικό ή λογισμικό στον μικροελεγκτή σας για να παρέχετε ανάγνωση και εγγραφή μνήμης, παγίδευση σημείων διακοπής και οδηγίες λειτουργίας με ελεγχόμενο τρόπο. Μια λύση είναι ένας διακομιστής εντοπισμού σφαλμάτων.

Το GNU Debugger (GDB) ορίζει ένα ιδιαίτερα απλό πρωτόκολλο διακομιστή για χρήση μέσω μιας σειριακής θύρας ή δικτύου, συμπεριλαμβανομένου του localhost. Οι υλοποιήσεις αυτού του gdbserver υπάρχουν για διαφορετικά λειτουργικά συστήματα. Παραδοσιακά, αυτό ήταν ένα στοιχείο μόνο για λογισμικό, αλλά το πρωτόκολλο χρησιμοποιείται τώρα συνήθως ως πύλη για συσκευές υλικού ή εξομοιωτές.

Ομοίως, οι επιλογές σας IDE κυμαίνονται τώρα πέρα ​​από μια βασική γραμμή εντολών GDB, με εργαλεία όπως Eclipse, Visual Studio Code και IDA Pro που υποστηρίζουν το ίδιο πρωτόκολλο GDB.

Θύρες εντοπισμού σφαλμάτων υλικού

Θα ήταν βολικό εάν τα χαρακτηριστικά εντοπισμού σφαλμάτων ενσωματωμένα στο πυρίτιο ήταν άμεσα συμβατά με το πρωτόκολλο GDB, αλλά τα OCD βελτιστοποιούνται για ελάχιστο κόστος και επιπτώσεις στο σχεδιασμό του συνολικού επεξεργαστή. Συνήθως θα εντοπιστεί εντοπισμός σφαλμάτων μέσω της ίδιας θύρας που χρησιμοποιείται για τον προγραμματισμό μνήμης flash. Ορισμένες μάρκες χρησιμοποιούν πρωτόκολλα ειδικά για προμηθευτές, αλλά αξίζει να γνωρίζουμε δύο πρότυπα της βιομηχανίας: JTAG και SWD.

Όποιο και αν είναι το πρωτόκολλο, απαιτείται κάποιο υλικό για να μετατραπεί ξανά σε USB. Ένα ευρύ φάσμα προσαρμογέων μπορεί να χρησιμοποιηθεί ως διακομιστής εντοπισμού σφαλμάτων μέσω του λογισμικού OpenOCD ανοιχτού κώδικα, ακόμη και με συνδέσμους που ίσως έχετε ήδη όπως το Raspberry Pi GPIO ή ένα FTDI serial breakout. Και ο Black Magic Probe (δείτε το "Bug Squashers", δεξιά) είναι μια ανοικτή συσκευή υλικού που υλοποιεί τον διακομιστή σφαλμάτων στο firmware, παρέχοντας μια εικονική σειριακή θύρα που συνδέεστε απευθείας με το GDB.

JTAG: Το αρχικό πρότυπο - Δεν είναι καλό όνομα. Όπως και η JPEG, δεν λέει τι κάνει το πρότυπο, απλά ποιος το σχεδίασε: η Κοινή Ομάδα Δράσης για τις δοκιμές. Σχεδιάστηκε στα μέσα του τέλους της δεκαετίας του 1980 και τυποποιήθηκε το 1990, σε απόκριση σε σύνθετα συγκροτήματα πλακέτας κυκλώματος, πολύ δύσκολο να δοκιμαστεί αυτόματα.

Ηλεκτρικά, το πρότυπο JTAG (IEEE 1149.1) είναι μια σειρά καταχωρητών μετατόπισης που μπορείτε να προσθέσετε αλυσίδα μεταξύ συσκευών. Μπορείτε να επισυνάψετε το πρόγραμμα εντοπισμού σφαλμάτων απευθείας σε μία μόνο συσκευή ή σε μια αλυσίδα συσκευών μέσα σε ένα ενιαίο τσιπ ή σε πολλαπλές μάρκες. Το JTAG φαίνεται επιφανειακά σαν το SPI, με κοινόχρηστο ρολόι και καρφίτσες εισόδου και εξόδου μονής κατεύθυνσης. Στη συνέχεια, όμως, βλέπετε έναν ακροδέκτη επιλογής λειτουργίας ελέγχου (TMS). Είναι ένα chip-select; Όχι. Αυτό είναι όπου το JTAG αρχίζει να αποκτάει ιδιαίτερα χαμηλό επίπεδο. Είναι στην πραγματικότητα ένα μοτίβο λίγο που οδηγεί ένα μηχάνημα κατάστασης που καθορίζεται από το πρότυπο, το οποίο οι κατασκευαστές τσιπ βασίζονται στη δημιουργία των δικών τους μηχανημάτων κατάστασης JTAG.

Το πρότυπο JTAG καθορίζει τις καταστάσεις για την επιλογή μιας συσκευής και την ανάγνωση του κωδικού αναγνώρισης 32 bit της. και το πρωτόκολλο σάρωσης οριακής σάρωσης της JTAG διευθύνει ακίδες σε ένα IC για ηλεκτρικές δοκιμές συναρμολογημένων PCB. Πέρα από αυτό, παίρνει το συγκεκριμένο συσκευή: FPGAs και επεξεργαστές και μνήμες έχουν το καθένα τα δικά τους πρωτόκολλα. Αυτός ο κατακερματισμός αντικατοπτρίζει τον κατακερματισμό που βλέπετε σε ολόκληρο το ενσωματωμένο χώρο των εργαλείων!

Με τους σύγχρονους επεξεργαστές ARM, τουλάχιστον, τα πρότυπα μας κάνουν μια χάρη. Η προδιαγραφή Interface Debug ARM περιγράφει μια τυπική θύρα εντοπισμού σφαλμάτων JTAG με έναν τρόπο πρόσβασης στη μνήμη, τα περιφερειακά και την κατάσταση της CPU. Από εκεί, οι καταχωρητές χαρτογράφησης μνήμης μπορούν να τροποποιήσουν τα σημεία διακοπής και να ελέγξουν την CPU.

SWD: Ο νεοφερμένος - Όταν ο ARM τυποποιούσε έναν τρόπο πρόσβασης στις λειτουργίες απομνημόνευσης μνήμης και CPU μέσω JTAG, εκμεταλλεύτηκε επίσης την ευκαιρία να αναπτύξει ένα νέο εναλλακτικό πρωτόκολλο: Serial Wire Debug (SWD), το οποίο χρησιμοποιεί έναν ενιαίο αμφίδρομο ακροδέκτη δεδομένων και ένα εκσυγχρονισμένο πακέτο δομή. Ο μειωμένος αριθμός πινάκων καθιστά το SWD ιδανικό για μικρότερους ενσωματωμένους επεξεργαστές όπως η δημοφιλής σειρά ARM Cortex-M και μπορεί να μοιράζεται καρφίτσες με JTAG όταν ο επεξεργαστής υποστηρίζει και τις δύο επιλογές.

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

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

  • »Για περισσότερα σχετικά με το σφάλμα του ARM:
  • »Έγραψα ένα απλό πρόγραμμα περιήγησης μνήμης SWD που βασίζεται στο web για το ESP8266 και ένα άρθρο στο PoC || GTFO 10.5.
  • »Βρείτε μια πληρέστερη εφαρμογή ανοιχτού κώδικα του SWD, δοκιμάστε το Black Magic Probe ή το Free-DAP.


Μπορεί Να Σας Ενδιαφέρει

Εκκίνηση του Hawkboard μέσω του Mac OS X

Εκκίνηση του Hawkboard μέσω του Mac OS X


Παίζοντας με το συμβατό με Arduino Beagle Board Trainer

Παίζοντας με το συμβατό με Arduino Beagle Board Trainer


Δημιουργία: Έργα - Μόνιμα λεκέ PVC σωλήνα οποιοδήποτε χρώμα θέλετε

Δημιουργία: Έργα - Μόνιμα λεκέ PVC σωλήνα οποιοδήποτε χρώμα θέλετε


Τα σχόλια σας

Τα σχόλια σας