Facebook RSS Feed
 

.NET Micro Framework: Watchdog Timer Kullanımı

-Watchdog Timer'ın amacı, uygulama tepki vermeyi durdurduğunda sistemi yeniden başlatmaktır. Uygulamanın yapısına ve kritiklik durumuna göre bir sayaç taşım değeri belirtilir. Bu sayaç değerinden daha kısa bir süre içerisinde sürekli sayaç sıfırlanarak yeniden başlatılır. Başlangıçta verilen taşım değerine ulaşılması durumunda watchdog timer reset eventi oluşur ve sistem yeniden başlar.

İnsan denetiminde olmayan gömülü sistemlerde devamlı çalışmayı sağlamak için watchdog sayacı, kullanılması gereken bir fonksiyondur. Bazı watchdog sayaçları sistem reset durumunda hatanın nereden kaynaklandığı bilgisini kaydeder ve sistem açılırken bunu raporlar. Örneğin, sisteme bağlı bir sensör arızası nedeniyle sistem tepki vermeyi durduruyorsa, cihazın otomatik olarak bu sensörü devreden çıkararak servise haber vermesi gibi senaryolar düşünülebilir. İlk watchdog sayacı hata raporunu toplarken sistemin yine tepki vermemesi durumunda ikinci watchdog sayacı devreye girerek kesin reset işlemi sağlar.

Watchdog Timer Uygulaması

Micro Framework SDK'sı ile gelen Watchdog özelliği, beklenilen özellikleri karşılamamaktadır, kullanım amacı anlatılandan farklıdır. Bu nedenle, kullandığınız donanımın SDK'sı ile gelen Watchdog Timer'ı kullanmanız gerekmektedir. GHI Electronics'in SDK'sı ile çalışacak bir uygulamayı inceleyelim.

Micro Framework Console Application oluşturup referanslar arasına "GHIElectronics.NETMF.Hardware.dll" dosyasını ekleyin. Program.cs'in namespace'leri arasına da "using GHIElectronics.NETMF.Hardware.LowLevel" satırını ekleyin.

Watchdog Komutları

Watchdog.Enable(timeout milisaniye): Watchdog sayacını belirlenen milisaniyeye göre ayarlar ve başlatır.
Watchdog.Disable(): Watchdog sayacını iptal eder.
Watchdog.ResetCounter(): Sayacı sıfırlar. Taşmayı engellemek için periyodik olarak kullanılması gerekir.

Uygulama Kodları

Geliştireceğimiz uygulamada Watchdog Timer'ını 1000 milisaniyeye ayarlayacağız. Daha sonra, bu süreden daha sık tetiklenecek başka bir timer ile Watchdog Timer sayacını sürekli sıfırlayacağız. Uygulamanızın kilitlenmesi durumunda Watchdog Timer sayacı belirtilen değeri aşacak ve mikrodenetleyici sıfırlanacaktır. Bu işlem işlemci üzerinde donanımsal olarak çalışır, yani Watchdog Timer Reset olayının - işlemci arızalanması dışında - herhangi bir şekilde tetiklenmemesi sözkonusu değildir.

using System;
using System.Threading;
using Microsoft.SPOT;
using GHIElectronics.NETMF.Hardware.LowLevel;
 
namespace MFWatchdogUygulamasi
{
    public class Program
    {
        public static void Main()
        {
            //Saniyede bir tetiklenmek üzere Watchdog Timer'ı başlatalım:
            Watchdog.Enable(1000);
 
            //Watchdog Timer sayaç değerinden düşük bir sürede tick edilecek Timer oluşturalım:
            Timer tmr = new Timer(new TimerCallback(WatchdogResetTick), null, 0, 500);
 
            //Uygulamanızın kodları
 
            //Main Thread'i uyutalım:
            Thread.Sleep(Timeout.Infinite);
        }
 
        private static void WatchdogResetTick(object state)
        {
            Watchdog.ResetCounter(); //Watchdog Timer'ı sıfırla.
        }
    }
}

Yukarıdaki uygulamada sistem kilitlenmesi yada handle edilmemiş exception fırlaması durumlarında sistem yeniden başlayacaktır. Uygulamamızın başına ekleyeceğimiz bir komut ile, sistem başlangıcının normal açılış mı yoksa reset sonrası açılış mı olduğunu sorgulayalım:

using System;
using System.Threading;
using Microsoft.SPOT;
using GHIElectronics.NETMF.Hardware.LowLevel;
 
namespace MFWatchdogUygulamasi
{
    public class Program
    {
        public static void Main()
        {
            if (Watchdog.LastResetCause == Watchdog.ResetCause.WatchdogReset)
                Debug.Print("Watchdog reset oluştu");
 
            //Saniyede bir tetiklenmek üzere Watchdog Timer'ı başlatalım:
            Watchdog.Enable(1000);
 
            //Watchdog Timer sayaç değerinden düşük bir sürede tick edilecek Timer oluşturalım:
            Timer tmr = new Timer(new TimerCallback(WatchdogResetTick), null, 0, 500);
 
            //Uygulamanızın kodları
 
            //Main Thread'i uyutalım:
            Thread.Sleep(Timeout.Infinite);
        }
 
        private static void WatchdogResetTick(object state)
        {
            Watchdog.ResetCounter(); //Watchdog Timer'ı sıfırla.
        }
    }
}

Eklediğimiz komut ile sistem başlangıcının nedenini sorgulayıp beklenmedik bir durumda gereken işlemleri yaptırabiliriz.




 
Hoşgeldiniz!
Son güncelleme: 25.12.2016
-
Yeni Teknik Yazılar
Latte Panda İncelemesi
Turta IoT HAT İncelemesi
USB Gamepad Kullanımı
GPIO Kullanımı
VEML6075 UV Sensör Kullan...
-
İlgili Gruplar
.NET MF ve Gadgeteer FB Grubu
İst. IoT & Wearables Meet-up
-
 

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.Copyright © 1999 - 2017, Umut Erkal. Bu materyal, "Creative Commons Public Licence" ile sunulmuştur.
Kaynak göstererek ve ücretsiz olarak, aynı şartlar altında paylaşabilir ve kullanabilirsiniz. | Kullanım Sözleşmesi