informasi kontak saya
Surat[email protected]
2024-07-08
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Baru-baru ini, saya menemukan bahwa setelah menggabungkan beberapa kode pada platform lain ke dalam STM32, terjadi masalah kerusakan, jadi saya ingin memilah secara keseluruhan prinsip-prinsip pemecahan masalah kerusakan pada STM32.
Di atas adalah informasi cetakan kerusakan. Setelah diselidiki, ditemukan bahwa kedalaman tumpukan pengatur waktu FreeRTOS disetel terlalu kecil. Ada terlalu banyak konten yang berjalan dalam fungsi pengatur waktu yang berjalan, dan memori yang diterapkan oleh setiap variabel lokal tidak dirilis tepat waktu, dan akhirnya terjadi crash.
Mari kita bicara tentang pengatur waktu di FreeRTOS. Ini sebenarnya dapat dipahami sebagai sebuah tugas, yang setara dengan membuat thread untuk menjaga waktu, lalu melakukan polling dan menanyakan daftar pengatur waktu saat ini untuk mengetahui waktu berjalan pengatur waktu mana yang telah kedaluwarsa dia.
Oleh karena itu, ukuran memori yang digunakan oleh pengatur waktu juga perlu dikonfigurasi.
R0~R12 adalah register tujuan umum
R13 adalah penunjuk tumpukan, dan secara fisik ada dua penunjuk tumpukan:Penunjuk tumpukan utama (MSP) adalah penunjuk tumpukan default, yang akan dipilih untuk digunakan setelah reset dan ketika prosesor berada dalam mode pemrosesan; penunjuk tumpukan lainnya adalah penunjuk tumpukan proses (PSP), yang hanya dapat digunakan di thread mode (bila ada RTOS) )
R14 adalah link register (LR), digunakan untuk menyimpan alamat pengirim ketika suatu fungsi atau subrutin dipanggil. Di akhir fungsi atau subrutin, kontrol program dapat kembali ke program pemanggil dengan memuat nilai LR ke dalam penghitung program (PC) dan melanjutkan eksekusi. Selama penanganan pengecualian, LR akan secara otomatis diperbarui ke EXC_RETURN khusus (pengembalian pengecualian ) nilai.
Misalnya, a memanggil b. Pada saat ini, alamat subfungsi b ditempatkan di penunjuk pc, dan alamat a ditempatkan di LR. Setelah b dijalankan, alamat a dimasukkan ke dalam penunjuk PC dari LR untuk dieksekusi.
Crash in arm sebenarnya merupakan interupsi yang tidak normal. Ketika interupsi datang, prosesor akan menyimpan status tugas saat ini ke stack.
bingkai tumpukan
Stack Frame mengacu pada area memori yang digunakan untuk menyimpan parameter fungsi, variabel lokal, alamat pengirim, dan informasi lainnya selama pemanggilan fungsi.
Ketika suatu fungsi dipanggil, STM32 akan mengalokasikan bingkai tumpukan untuknya. Ukuran bingkai tumpukan bergantung pada faktor-faktor seperti jumlah parameter, jumlah variabel lokal, dan pengaturan optimasi kompiler.
Menggabungkan informasi di atas, kita dapat mengetahui bahwa jika kita ingin mendapatkan fungsi mana yang mogok ketika fungsi tersebut mogok, kita perlu menemukan bingkai tumpukan yang didorong ke tumpukan ketika interupsi pengecualian dipicu, dan bingkai tumpukan ini ada di R13 (Titik tumpukan) penunjuk tumpukan.
Kami menemukan cara untuk mendapatkan konten yang ditunjuk oleh penunjuk register R13 di fungsi penanganan kerusakan HardFault_Handler(), dan kemudian mencetaknya.
Mikrokontroler STM32 menggunakan inti ARM Cortex-M yang memiliki dua penunjuk tumpukan, satu penunjuk tumpukan utama (MSP) dan yang lainnya adalah penunjuk tumpukan proses (PSP).
MSP (Penunjuk Tumpukan Utama): Penunjuk tumpukan utama terutama digunakan untuk kernel sistem operasi atau rutinitas layanan interupsi.
PSP (Penunjuk Tumpukan Proses): Penunjuk tumpukan proses terutama digunakan oleh aplikasi pengguna.
Ketika inti Cortex-M kembali ke mode Thread, ia dapat beralih kembali ke MSP penunjuk tumpukan utama atau penunjuk tumpukan proses PSP sesuai dengan pengaturan register CONTROL.
PSP menyimpan konteks yang terkait dengan aplikasi pengguna yang sedang berjalan. Secara khusus mencakup hal-hal berikut:
一些或全部的通用寄存器的值,这些寄存器在用户程序运行时会使用。
Program Counter(PC):指向下一条将要执行的指令。
Processor Status Register(PSR)的值:包含标志位状态。
Penunjuk tumpukan: Menyimpan lokasi bingkai tumpukan sebelumnya.
Biasanya, ketika tugas berpindah (atau peralihan konteks), informasi ini akan disimpan ke tumpukan. Saat tugas baru dimulai, informasi konteksnya akan dipulihkan dari tumpukan.
Perlu diperhatikan bahwa konten spesifik yang disimpan akan bervariasi sesuai dengan strategi penjadwalan spesifik dan desain sistem operasi.
Tentukan nilai penunjuk LR/PC
Pertama kita perlu menentukan apakah RTOS digunakan. Jika demikian, maka informasi kerusakan kita harus disimpan di PSP.
Kita perlu membaca informasi ini terlebih dahulu, dan kemudian setelah mengetahui nilai LR dan PC, kita dapat menemukan titik crash melalui Debug di keil5 atau menemukan titik crash yang sesuai melalui file peta yang dihasilkan selama proses kompilasi.
Klik kanan di jendela Pembongkaran—