Programlar MSP430'da bekçi zamanlayıcısını neden durduruyor?


11

MSP430 için birçok örnek programın ilk satırı aşağıdaki gibidir:

WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

Bunu neden yapıyorlar?

Yanıtlar:


15

Bekçi zamanlayıcısı (WDT) varsayılan olarak açıktır, daha karmaşık uygulamalarda olması yararlı bir şeydir, ancak birçok yeni insanı harekete geçirir. WDT kodlarında genellikle WDT'ye hizmet vermezler veya WDT olayını işlemek için bir kesme servis rutini (ISR) içermezler, bu nedenle çipleri sıfırlamaya devam ettiğinde çok sinirli olurlar. Buna ek olarak, örnek programlar çoğunlukla WDT'yi göstermeye çalışmaz, bu yüzden kapalıdır.

Düzenleme: Bekçi zamanlayıcısı "ölü adamın anahtarı" olarak adlandırılmış olabilir. Varsayılan davranışı, bellenim periyodik olarak her şeyin yolunda gittiğini bilmediği sürece mikro denetleyiciyi sıfırlamaktır. Bu "köpeği beslemek" veya "köpeği tekmelemek" olarak bilinir. Bu şekilde, ürün yazılımınız bir döngüye sıkışırsa veya beklendiği gibi çalışmayı durdurursa, bekçi beslenmez ve çipi sıfırlar (umarım yeni, çalışır bir duruma).

WDT'yi, hayal edebileceğiniz her şeyi diğer görevleri gerçekleştirmek için periyodik kesinti olarak da kullanabilirsiniz. Sadece ilgili ISR'yi yazmalısınız.


+1 teşekkürler, ben ve diğer okuyucular arayabilse de, WDT'nin çipi neden sıfırladığı için çok kısa bir gerekçe bilmek güzel olurdu. (ekleme konusunda endişelenmeyin, cevabınız olduğu gibi kabul etmek için yeterince iyidir (diğer olası cevaplar için birkaç saat bekledikten sonra))
necromancer

Ben de bekçi zamanlayıcı ne olduğunu hiçbir ipucu var mutlak bir acemi olduğumu soruda bahsetmeliydim :)
necromancer

2
@necromancer Ah, endişelenmeyin, ilgili bilgileri ekledim.
Samuel

2
Samuel- hemen hemen her durumda bir WDT'yi sıfırlamak için ISR KULLANMAMALISINIZ. Neredeyse her zaman yapılacak yanlış şey. Kesintiler, programın diğer kısımları la-la arazisinde iken nadiren devam edebilir. Bazen olasıdır / gereklidir (ISR ile ikinci bir WDT seviyesini etkili bir şekilde ayarlayan bellenimin diğer bölümleri arasındaki iletişim ile), ancak yeni bir yaklaşıma yeni bir yaklaşım önerilmemelidir.
Spehro Pefhany

9

Samuel'in yanlışlıkla WDT'yi takan insanlar hakkındaki görüşüne ek olarak, başlangıçta devre dışı bırakılmasının başka bir önemli nedeni daha var.

Uygulamanız normalde zamanlayıcıyı doğru şekilde sıfırlayabilse bile, başlatma kodu sırasında bunu iki nedenden dolayı yapamayabilir:

  • Başlatma, tek bir WDT işaretinden daha uzun sürebilir, ancak kesintilerin devre dışı bırakılmasını gerektirir. Bu, zamanlayıcıyı sıfırlamak için bir zamanlayıcı ISR'ye güvenirseniz, sonsuz bir önyükleme döngüsüne girebileceğiniz anlamına gelir.
  • Tüm MCU'larda zamanlayıcı kaydının durumunu bilmeniz gerekmez (yani, kayıt 0'da başlamayabileceğinden, bir sonraki onay beklenenden daha erken olabilir).

Sonuç olarak, WDT'yi hiçbir zaman etkinleştirmemiş olsanız bile yaptığınız ilk şey olarak devre dışı bırakmak iyi bir uygulamadır .

Kullanmak isterseniz, başlatma kodunuzun son adımı olarak kesintileri açmadan hemen önce yeniden etkinleştirebilirsiniz.


Cevaba eklediğiniz için +1 teşekkür ederiz. i kullanarak başlatma önce devre dışı bırakabilirsiniz keşfetti int _system_pre_init(void)önce yürütür işlevi,main
büyücü
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.