Esp8266 WDT Kullanımı
Esp8266 WDT Kullanımı:
Giriş
Bu yazının amacı, ESP8266 için Arduino IDE kitaplıklarında bulunan bazı WDT uygulaması işlevlerini analiz etmektir. Bir WDT uygulaması, süresi dolmadan önce sıfırlanmadığında, takip edilen sistemin sıfırlanmasını tetikleyen bir zamanlayıcıdır. Biz burada ESP8266 mikro denetleyici ele alacağız. CPU'nun sıfırlanmasını önlemek ve normal şekilde çalışmaya devam etmek için ana programın WDT zamanlayıcısını periyodik olarak sıfırlaması gerekir.
WDT uygulaması, programdaki en kötü durum senaryosu gecikmesinden daha büyük bir süre ile yapılandırılmalıdır, bu nedenle yalnızca ana programı kilitleyebilecek ve kendi başına kurtarılamayacak hata / öngörülemeyen sorunlarda WDT tetikler. Bu kilitleme durumlarında, WDT kendi sayıcısını sıfırlanmaz ve süresi dolduğunda sistemi sıfırlar.
Bu konsept, özellikle mikrodenetleyiciler de, elektriksel gürültü gibi çevresel koşullardan etkilenebilen ve yürütmeyi kilitleyen donanım arızasına neden olabilen son derece önemli bir durumdur.. Ek olarak, yürütmeyi istenmeyen bir sonsuz döngüye sokabilecek koddaki problemler içinde oldukça kullanışlıdır.
ESP8266, biri donanımda ve diğeri yazılımda uygulanan 2 adet WDT ye sahiptir. Testlerimizi, çok ucuz ve kullanımı kolay bir ESP8266 kartı olan NodeMCU kartı kullanılarak gerçekleştireceğiz.
Yazılımsal WDT uygulaması fonksiyonları:
ESP8266'daki WDT uygulaması işlevlerine erişmek için, burada daha ayrıntılı olarak analiz edilebilecek EspClass'a sahibiz. Bu sınıfın işlevselliğine, burada kütüphanelerde açıklanan ESP adlı bir extern değişkenini kullanarak erişebiliriz.
Yazılım bekçisini devre dışı bırakmak için, aşağıda belirtildiği gibi ESP nesnesinde wdtDisable yöntemini çağırmamız yeterlidir.
ESP.wdtDisable(); Bu, komut yazılımsal WDT 'ı devre dışı bıraksa da, donanımsal WDT uygulaması yine de aktif kalacak ve bir süre sonra sıfırlamaya neden olacaktır. WdtDisable yönteminin ESP8266 dökümanlarında belirtildiği gibi, yazılımsal WDT 6 saniyeden fazla durdurursak, donanım WDT tetiklenecektir ve ESP8266 6 saniye sonra resetlenecektir.
Aşağıda belirtildiği gibi wdtEnable yöntemini çağırarak yazılım bekçisini yeniden etkinleştirebiliriz..
ESP.wdtEnable(1000); Bu komutla beraber tamsayı değerinin iletilmesi gerektiğine dikkat etmek gerekir , bu, WDT nin tetiklemesi için gerekli olan sürenin milisaniye değerine karşılık gelir. Bununla birlikte, bu değer hiçbir etkiye sahip değildir ve buradaki kaynak kodunda görülebileceği gibi, SDK ESP8266 işlevlerinin dahili çağrısında kullanılmaz. Ek olarak, SDK da, ESP8266 ya enerji verildiğinde zaman aşımı ayarının uygulanmadığı açıkça belirtilmiştir. Ne yazık ki, bu işlevi çağırdığımızda bekçi uygulaması zamanlayıcısının varsayılan değerinin ne olduğu net değildir ve ESP8266'nın SDK'sında da belirtilmemiştir.
ESP.wdtFeed();Watchdog'u yeniden başlatmak için burada belirtilen wdtFeed komutunu kullanabiliriz. Neyse ki, ESP kütüphanelerinde pek çok işlevde WDT uygulamasını arka planda otomatik olarak sıfırlar, bu nedenle çoğu zaman WDT yi sıfırlama konusunda endişelenmemize gerek kalmaz. Yine de, programlarımızın kendiliğinden yeniden başlatılması sorunlarını gidermek için bu komutun var olduğunu bilmek iyidir.
Donanımsal WDT Tetikleme:
Donanımsal WDT 'ı tetiklemek için, sadece yazılımsal WDT 'ı devre dışı bırakmamız ve sonsuz bir döngü yapmamız gerekir. Tüm bu eylemleri aşağıda belirtildiği gibi kurulum işlevinde yapabiliriz. Bir while döngüsü ile sonsuz bir döngü yapacağımızı unutmayın.
1 2 3 4 5 6 7 8 | void setup() { ESP.wdtDisable(); while (1){};}void loop(){} |
Kodu yükledikten sonra, çıktıyı kontrol etmek için seri bağlantı noktasını açın. WDT uygulaması tetiklendiğinde , seri bağlantı noktasına aşağıda gösterildiği gibi bir WDT tetiklenme günlüğü yazdırılır.

Yukarda gösterildiği gibi, resetlenmenin nedeni görülebilir. (WDT sıfırlama) ve sıfırlama nedeni, donanımsal WDT uygulaması sıfırlamasına karşılık gelen 4 rakamına sahiptir. Diğer sıfırlama sebeplerini ve rakamsal değerleri buradan kontrol edebilirsiniz.
Yazılımsal WDT tetikleme:
Yazılımsal WDT sıfırlamasını tetiklemek için, önceki kodun aynısını kullanıyoruz ve yazılımsal WDT uygulamasının devre dışı bırakılmasını kaldırıyoruz (varsayılan olarak etkindir).
1 2 3 4 5 6 7 8 | void setup() { ESP.wdtDisable(); while (1){};}void loop(){} |
WDT Sıfırlamak: (Beslemek)
Son olarak, WDT uygulamasını yeniden başlatma işlevini test etmek için aşağıda belirtilen kodu kullanacağız. Bu nedenle, sonsuz döngümüzün içinde wtdFeed WDT komutunu çağıracağız, bu da WDT nin sıfırlanmasını sağlayacaktır.1 2 3 4 5 6 7 8 | void setup() { //ESP.wdtDisable(); while (1){ESP.wdtFeed();};}void loop(){} |
[1] https://developer.mbed.org/cookbook/WatchDog-Timer
[2] http://searchmobilecomputing.techtarget.com/definition/watchdog-timer
[3] https://github.com/esp8266/Arduino/blob/4897e0006b5b0123a2fa31f67b14a3fff65ce561/doc/faq/a02-my-esp-crashes.md
[4] http://www.esp8266.com/viewtopic.php?p=2096#p2112
[5] https://techtutorialsx.com/2017/01/21/esp8266-watchdog-functions/



Yorumlar
Yorum Gönder