Haruskah semua perangkap selalu ditentukan?


18

Saya telah melihat dua case sekarang dengan dsPIC 30F4013 di mana controller reset karena jebakan yang tidak ditentukan. Mengapa jebakan-jebakan ini dibesarkan di tempat pertama masih merupakan misteri, tapi itu bukan pertanyaan langsung saya. Saya mulai berpikir itu akan menjadi praktik pemrograman yang baik untuk selalu mendefinisikan semua perangkap, bahkan jika perangkap tidak pernah terjadi, jadi saya mendapatkan setidaknya pesan kesalahan yang jelas alih-alih pengaturan ulang acak. Apakah ini praktik standar yang tidak saya sadari? Apakah ada kerugian pada praktik ini yang harus saya pertimbangkan?


4
Bukan jawaban untuk pertanyaan Anda, tetapi saya menderita gejala semacam itu pada sistem dsPIC & PIC24 beberapa waktu yang lalu. Dalam kasus saya, jebakan-jebakan tersebut dihasilkan dari bit kode tempat saya mendeferensier pointer ke nilai 16-bit dan pointer ini sendiri memiliki nilai ganjil (tidak-genap), karena mereka menunjuk ke buffer comms melingkar - dan saya tidak punya sebelumnya cara mengetahui apakah nilai 16-bit akan mulai pada batas ganjil atau genap. Kompilator XC16 tidak melindungi Anda dari hangup perangkat keras di sini. Saya akhirnya menulis makro pembungkus untuk fungsi-fungsi ini yang memaksa 2 pointer 8-bit de-ref.
brhans

Jawaban:


13

Aturan informal saya adalah:

  1. Jika interupsi diaktifkan, maka Anda harus memiliki kode yang menanganinya.
  2. Jika Anda tidak menulis kode untuk interupsi, nonaktifkan saja.
  3. Jika Anda tidak dapat menonaktifkannya, tulis kode untuk itu.

Meskipun tanpa aturan itu, lembar data secara eksplisit menjawab pertanyaan Anda:

Jika pengguna tidak berniat untuk mengambil tindakan korektif jika terjadi kondisi kesalahan jebakan, vektor-vektor ini harus dimuat dengan alamat penangan default yang hanya berisi instruksi RESET. Jika, di sisi lain, salah satu vektor yang berisi alamat yang tidak valid dipanggil, perangkap kesalahan alamat akan dibuat.

( Sumber , bagian 8.3, catatan pertama)

Mengingat Anda tidak dapat menutupi perangkap, maka Anda harus menanganinya. Jika Anda tidak ingin berurusan dengan perangkap dengan cara tertentu, metode yang tepat adalah dengan menjalankan RESETinstruksi.


Ya. Saya memiliki modul standar dengan target untuk semua perangkap.
Olin Lathrop

16

Ya, itu ide yang bagus - satu-satunya downside adalah sedikit ukuran kode tambahan, dan Anda harus memutuskan apa yang harus dilakukan dengan perangkap (memancarkan pesan pada port serial? Nyalakan lampu "GAGAL"? Diam-diam reboot? Dll )


4
Saya biasanya hanya menjalankan prosesor dalam loop NOP / GOTO yang tak terbatas. Dengan cara itu tumpukan belum rusak dari jebakan, dan ketika men-debug saya memiliki kesempatan untuk mengungkapnya dan mencari tahu apa yang terjadi. Saya tidak sering mendapatkan jebakan, tetapi 80% dari waktu itu adalah jebakan alamat yang aneh, biasanya karena sampah dimuat sebagai pointer. Terkadang penunjuk tumpukan rusak dan menghasilkan jebakan alamat ganjil. Itu lebih sulit untuk di-debug karena tumpukan sudah tidak ada lagi. Untungnya, itu sangat jarang.
Olin Lathrop
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.