Κοινή χρήση τεχνολογίας

Αντιμετώπιση προβλημάτων σφαλμάτων STM32

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Πρόλογος

Πρόσφατα, ανακάλυψα ότι μετά τη συγχώνευση ορισμένων κωδικών σε άλλες πλατφόρμες στο STM32, παρουσιάστηκε ένα πρόβλημα σφαλμάτων, επομένως ήθελα να διευθετήσω συνολικά τις αρχές αντιμετώπισης προβλημάτων σφαλμάτων στο STM32.

1. Περιγραφή προβλήματος

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

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

Επομένως, το μέγεθος της μνήμης που χρησιμοποιείται από το χρονόμετρο πρέπει επίσης να διαμορφωθεί.

2. Μητρώα STM32 (πυρήνας Cortex M4)

Εισαγάγετε την περιγραφή της εικόνας εδώ
Οι R0~R12 είναι καταχωρητές γενικής χρήσης

Το R13 είναι ο δείκτης στοίβας και φυσικά υπάρχουν δύο δείκτες στοίβας:Ο δείκτης κύριας στοίβας (MSP) είναι ο προεπιλεγμένος δείκτης στοίβας, ο οποίος θα επιλεγεί για χρήση μετά την επαναφορά και όταν ο επεξεργαστής βρίσκεται σε λειτουργία επεξεργασίας, ο άλλος δείκτης στοίβας είναι ο δείκτης στοίβας διαδικασίας (PSP), ο οποίος μπορεί να χρησιμοποιηθεί μόνο σε νήματα λειτουργία (όταν υπάρχει RTOS) )

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

Για παράδειγμα, το a καλεί τη στιγμή αυτή, η διεύθυνση της υποσυνάρτησης b τοποθετείται στον δείκτη του υπολογιστή και η διεύθυνση του a τοποθετείται στο LR από το LR για εκτέλεση.

3. Ανάλυση προβλημάτων σύγκρουσης

3.1 Από πού προέρχονται οι πληροφορίες συντριβής;

Ένα crash in arm είναι στην πραγματικότητα μια μη φυσιολογική διακοπή Όταν έρθει η διακοπή, ο επεξεργαστής θα αποθηκεύσει την τρέχουσα κατάσταση εργασίας στη στοίβα.

  • στοίβα πλαίσιο
    Εισαγάγετε την περιγραφή της εικόνας εδώ
    Το Stack Frame αναφέρεται σε μια περιοχή μνήμης που χρησιμοποιείται για την αποθήκευση παραμέτρων συνάρτησης, τοπικές μεταβλητές, διευθύνσεις επιστροφής και άλλες πληροφορίες κατά τη διάρκεια μιας κλήσης συνάρτησης.

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

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

    Βρίσκουμε έναν τρόπο να λάβουμε το περιεχόμενο στο οποίο επισημαίνεται ο δείκτης του καταχωρητή R13 στη συνάρτηση χειρισμού σφαλμάτων HardFault_Handler() και στη συνέχεια να το εκτυπώσουμε.

3.2 Η σημασία κάθε λέξης-κλειδιού στις πληροφορίες σφαλμάτων

Ο μικροελεγκτής STM32 χρησιμοποιεί τον πυρήνα ARM Cortex-M, ο οποίος έχει δύο δείκτες στοίβας, ο ένας είναι ο κύριος δείκτης στοίβας (MSP) και ο άλλος ο δείκτης στοίβας διαδικασίας (PSP).

MSP (Κύριος δείκτης στοίβας): Ο δείκτης κύριας στοίβας χρησιμοποιείται κυρίως για τον πυρήνα του λειτουργικού συστήματος ή τη ρουτίνα υπηρεσίας διακοπής.

PSP (Δείκτης στοίβας διαδικασίας): Ο δείκτης στοίβας διεργασιών χρησιμοποιείται κυρίως από εφαρμογές χρηστών.

Όταν ο πυρήνας Cortex-M επιστρέψει στη λειτουργία Thread, μπορεί να επιστρέψει στον MSP δείκτη κύριας στοίβας ή στον δείκτη στοίβας διεργασίας PSP σύμφωνα με τη ρύθμιση του καταχωρητή CONTROL.

Το PSP αποθηκεύει το πλαίσιο που σχετίζεται με την τρέχουσα εφαρμογή χρήστη. Περιλάβετε συγκεκριμένα τα εξής:

一些或全部的通用寄存器的值,这些寄存器在用户程序运行时会使用。

Program Counter(PC):指向下一条将要执行的指令。

Processor Status Register(PSR)的值:包含标志位状态。

Δείκτης στοίβας: Αποθηκεύει τη θέση του προηγούμενου πλαισίου στοίβας.

Συνήθως, κατά την εναλλαγή εργασιών (ή εναλλαγή περιβάλλοντος), αυτές οι πληροφορίες θα αποθηκευτούν στη στοίβα Όταν ξεκινά μια νέα εργασία, οι πληροφορίες του περιβάλλοντος της θα αποκαθίστανται από τη στοίβα.

Θα πρέπει να σημειωθεί ότι το συγκεκριμένο περιεχόμενο που θα αποθηκευτεί θα ποικίλλει ανάλογα με τη συγκεκριμένη στρατηγική προγραμματισμού και το σχεδιασμό του λειτουργικού συστήματος.

3.3 Χρησιμοποιήστε τις πληροφορίες σύγκρουσης για να βρείτε το σημείο που προκάλεσε τη συντριβή

Προσδιορίστε την τιμή του δείκτη LR/PC
Εισαγάγετε την περιγραφή της εικόνας εδώ
Πρώτα πρέπει να προσδιορίσουμε εάν χρησιμοποιείται RTOS, τότε οι πληροφορίες σφαλμάτων θα πρέπει να αποθηκευτούν στο PSP.
Πρέπει πρώτα να διαβάσουμε αυτές τις πληροφορίες και μετά αφού μάθουμε τις τιμές των LR και PC, μπορούμε να βρούμε το σημείο συντριβής μέσω του Debug στο keil5 ή να βρούμε το αντίστοιχο σημείο σύγκρουσης μέσω του αρχείου χάρτη που δημιουργήθηκε κατά τη διαδικασία μεταγλώττισης.
Εισαγάγετε την περιγραφή της εικόνας εδώ

3.4 Πώς να βρείτε σημεία προβλημάτων με βάση τις διευθύνσεις στο keil5

Κάντε δεξί κλικ στο παράθυρο Αποσυναρμολόγηση—