Mengapa program menghentikan pengawas waktu di MSP430?

11

Banyak program sampel untuk MSP430 memiliki baris pertama sebagai:

WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

Mengapa mereka melakukan ini?

ahli nujum
sumber

Jawaban:

15

Pengawas waktu (WDT) diaktifkan secara default, ini adalah hal yang berguna untuk dimiliki dalam aplikasi yang lebih kompleks, tetapi membuat banyak orang baru tersandung. Mereka sering tidak akan menservis WDT dalam kode mereka atau memasukkan interrupt service routine (ISR) untuk menangani acara WDT, jadi, ketika chip mereka terus disetel ulang, mereka menjadi sangat frustrasi. Selain itu, sebagian besar program sampel tidak mencoba mendemonstrasikan WDT sehingga dimatikan.

Sunting: Pengawas waktu bisa bernama "mati orang beralih". Perilaku standarnya adalah mengatur ulang mikrokontroler kecuali jika firmware secara berkala memberi tahu semuanya berjalan baik. Ini dikenal sebagai "memberi makan anjing" atau "menendang anjing". Dengan cara ini, jika firmware Anda macet dalam satu lingkaran atau berhenti beroperasi seperti yang diharapkan, pengawas tidak diumpankan dan akan mereset chip (mudah-mudahan ke kondisi kerja yang baru).

Anda juga dapat menggunakan WDT sebagai interupsi berkala untuk melakukan tugas-tugas lain, apa pun yang dapat Anda bayangkan. Anda hanya perlu menulis ISR yang relevan.

Samuel
sumber
Terima kasih +1, walaupun saya dan pembaca lain dapat mencarinya, alangkah baiknya mengetahui alasan yang sangat singkat mengapa WDT mengatur ulang chip. (jangan khawatir tentang menambahkannya, jawaban Anda cukup baik untuk menerimanya (setelah menunggu beberapa jam lagi untuk kemungkinan jawaban lain))
necromancer
Saya kira saya seharusnya telah menyebutkan dalam pertanyaan bahwa saya adalah seorang pemula yang mutlak yang juga tidak tahu apa itu pengawas waktu :)
necromancer
2
@necromancer Ah, jangan khawatir, saya telah menambahkan informasi yang relevan.
Samuel
2
Dalam hampir semua kasus, Anda TIDAK boleh menggunakan ISR untuk mengatur ulang WDT. Hampir selalu hal yang salah untuk dilakukan. Interupsi dapat dengan riang berlanjut sementara bagian lain dari program tidak aktif di la-la tanah Kadang-kadang mungkin / perlu (dengan komunikasi antara ISR dan bagian-bagian lain dari firmware yang secara efektif menetapkan WDT level kedua) tetapi tidak disarankan kepada pemula sebagai pendekatan pertama.
Spehro Pefhany
9

Selain poin Samuel tentang orang yang secara tidak sengaja tersandung WDT, ada alasan penting lain mengapa harus dinonaktifkan pada awalnya.

Bahkan jika aplikasi Anda biasanya dapat mengatur ulang timer dengan benar, itu mungkin tidak dapat melakukannya selama kode inisialisasi, karena dua alasan:

  • Inisialisasi mungkin memakan waktu lebih lama dari satu centang WDT, tetapi membutuhkan interupsi untuk dinonaktifkan. Ini berarti bahwa jika Anda mengandalkan, katakanlah, ISR timer untuk mereset timer, Anda bisa masuk ke loop boot tak terbatas.
  • Anda tidak perlu mengetahui status register waktu pada semua MCU (yaitu, centang selanjutnya bisa lebih cepat dari yang diharapkan, karena register mungkin tidak mulai dari 0).

Akibatnya, sebaiknya Anda menonaktifkan WDT sebagai hal pertama yang Anda lakukan, bahkan jika Anda tidak pernah mengaktifkannya .

Jika Anda memang ingin menggunakannya, Anda dapat mengaktifkannya kembali segera sebelum menyalakan interupsi, sebagai langkah terakhir dari kode initilasi Anda.

sapi
sumber
+1 terima kasih telah menambahkan jawabannya. saya menemukan bahwa Anda dapat menonaktifkannya sebelum inisialisasi menggunakan int _system_pre_init(void)fungsi, yang dijalankan sebelumnyamain
necromancer