9

Watchdog Timer Nasıl Çalışır?

Bu yazıda Gömülü Sistemlerin kritik çevrebirimlerinden biri olan Watchdog Timer‘dan bahsetmek istiyorum. Öncelikle Watchdog Timer’a geçmeden önce aşağıdaki kodu bir inceleyelim. Aşağıdaki kod parçasını içeren sistemde her 100 ms de bir timer kesmesi oluştuğunu ve mikronetleyiciye pull-down olarak bağlı bir buton olduğunu farz edelim. Şimdi size bir soru; Butona bir kere basıldıktan 5 sn sonra ne olur?

Doğru cevap; 5 saniye sonra sistem aynı şekilde çalışmaya devam eder. Yani led toggle işlemi 200 ms de bir yürütülür. Kodda dikkat edilirse butona basıldığı anda program bir sonsuz döngüye girer. Peki butona basıldıktan 5 saniye sonra nasıl oldu da program led toggle işlemini yapmaya devam etti?

Kesme fonsiyonunun içerisinde her 100 milisaniyede bir count değişkeni azaltıldı. Butona basılmadığı sürece count değişkeni main fonksiyon içeresinde her 200 milisaniyede bir başlangıç değeri olan 30 a eşitlendi. Butona basıldıktan sonra program bir sonsuz döngüye girdiği için count değişkeni tekrar 30 a eşitlenemedi. Kesme fonksiyonu içerisinde count değişkeni sürekli azaltıldığı için bir süre sonra sıfıra eşit olacaktır. Yine kesme fonksiyonu içerisinde count değişkeni sıfıra eşitse yazılımsal reset fonksiyonun çağrıldığı bir if bloğu bulunmaktadır. Yani kısaca bu kod parçası butona basıldıktan 3 saniye sonra(30×100=3000 ms) mikrodenetleyici resetlemektedir.

İşte Watchdog Timer da buna benzer bir şekilde çalışmaktadır. Yazılım herhangi bir yerde bir döngüden çıkamadığında veya programın herhangi bir sebepten dolayı kitlendiği durumlarda mikrodenetleyiciyi resetlemek için kullanılan bir çevrebirimidir. Her mikrodenetleyicide watchdog timer birimi bulunmaktadır. Bu yazıda stm32f1 serisi için nasıl kullanıldığını inceleyelim.

Stm32f103 te iki tane watchdog timer birimi bulunmaktadır. Bunlar IWDG(Independent Watchdog) ve WWDG(Window Watchdog) ‘tur. Bunların arasında bazı farklar olsa da kullanım amacı aynıdır. Bu iki watchdog arasındaki başlıca farklar şunlardır.

  • IWDG dahili clock(40 kHz) kullanırken , WWDG APB1 clock’undan beslenir.
  • IWDG bir kesme oluşturmazken ,WWDG de kesme oluşur.
  • IWDG donanımsal veya yazılımsal olarak başlatılabilir. WWDG ise sadece yazılımsal olarak başlatılabilir.
  • IWDG 12 bit’liktir. WWDG ise 7 bitliktir.

Bu yazıda basit olan IWDG birimine değineceğim. Reference Manual incelendiğinde watchdog timer için iki değişken bizim için önem kazanmaktadır. Bunlar Prescaler ve  Reload değeridir. Bu değerlere göre ne kadar sürede mikrodenetleyicinin resetleneceği hesaplanmaktadır.

Yukarıdaki tablo reference manual’dan alınmıştır. Bu tabloya göre prescaler 32 ve reload register 4095 olarak ayarlanırsa ve yaklaşık 3.2 saniyede bir IWDG baştan başlatılmazsa işlemcinin kendini resetleyeciğini söyleyebiliriz.

CubeMX ayarları

Giriş çıkış olarak sadece led ve buton pinleri ayarlanmıştır. Led programın sonsuz döngüye girdiğini ve programın tekrardan başlayıp başlamadığını gözlemlemek için eklenmiştir. Buton ise yazılımı bir sonsuz döngüye sokmak için kullanılmıştır.

CubeMX ayarları

CubeMX ile IWDG clock frekansının reference manual de yazdığı gibi 40 KHz dahili olarak ayarlı olduğu görülebilir.

CubeMX ayarları

Reload register ve prescaler değerine göre watchdog timeout süresi projeye göre ayarlanmalıdır.Eğer watchdog timeout süresi 3 saniye iken programın watchdog timerı refresh etmesi 3 saniyeden fazla sürüyorsa program sürekli kendini resetleyecetir. Burada dikkat edilirse IWDG için maksimum 26 saniye olarak ayarlanabilmektedir(Prescaler = 256 ve Reload register=4095 iken).

CubeMX in yaptığı ayarları bir inceleyelim.

Hal_IWDG_Init() fonksiyonun tanımlandığı yere gidilirse bu fonksiyonun içinde __HAL_IWDG_START(hiwdg) makrosunun çağırıldığı görülmektedir. Yani main.c nin içerisinde MX_IWDG_Init() fonksiyonu çağırıldığında watchdog timer saymaya başlar. O andan itibaren ayarlanan timeout süresi aşılmadan HAL_IWDG_Refresh(&hiwdg) fonksiyonu çağrılmalıdır. Bu fonksiyon çağrıldıktan sonra watchdog timer tekrar baştan saymaya başlar. Bu fonsiyon yazının başındaki kodda  main fonksiyon içerisindeki count=30 işlemi ile benzerdir. Yazının başındaki kod örneği watchdog timerın modellenmiş halidir. Yani kendimiz yazılımsal olarak da bir watchdog timer oluşturabiliriz ama buna gerek yok çünkü adamlar bunu bir çevrebirimi olarak bize sunmuşlar.

Bu yazıda Watchdog Timer’ın çalışma mantığını anlatmaya çalıştım. Aşağıda IWDG kodların tamamını bulabilirsiniz.

STM32 Kodlarının Tamamı

 

Mehmet Topuz

9 Comments

  1. Abi ellerine sağlık watchdog timer’ın nasıl çalıştığını çok iyi anlatmışsın. Sabırsızlıkla diğer yazılarını bekliyorum.

    • Değerli yorumun için teşekkürler. Vakit buldukça yeni yazılar paylaşacağım inşallah.

  2. Merhaba Mehmet bey; bir sorum olacak. Arduino uno da ( yani atmega328 ) wdt yerine external 32.768 hz kristal kullanarak timer2 zamanlayıcısını kullansak olur mu? wdt hakkında anlayamadığım nokta yabancı kaynaklarda wdt nin, işlemcinin stuck olduğu durumlarda işlemciyi resetlediği yazıyor. Yani bu aynı stuck hatasını harici bir kristal ve timer kullanarak aşabilir miyiz. Şimdiden teşekkürler iyi çalışmalar

    • Merhaba İbrahim,
      Atmegada 32.768 khz bir osilatör kullanmadım hiç. Zaten bu osilatörler RTC(Real Time Clock) için kullanılıyor. Atmegada timer2 ye doğrudan bağlanıyor mu bilmiyorum. Eğer kullandığın mikrodenetleyicinin RTC interrupt’ı var ise ve RTC zamanını senin için çok önemli değilse RTC interrupt içinde bir değişken kontrol edip bu yazıdaki gibi bir şey yapılabilir diye umuyorum. Yani RTC interrupt içinde bir değişken arttırıp/azaltıp, eğer değişkenin değeri belli bir değere gelmiş ise resetleme yapabilirsin bence.

  3. Cevabınız için teşekkür ederim Mehmet bey, soruyu şu şekilde güncelleyebilirmiyim; genel olarak mcu larda wdt nın ortadan kaldırdığı sorun, dahili veya harici bir osc yi kullanan işlemcinin sonsuz döngüye ( mesela while(1){}) girmesi mıdır? Teşekkürler iyi günler

    • Rica ederim. Sadece sonsuz döngüye girmesi olarak düşünmek doğru olmaz. Sistemin herhangi bir sorun ile karşılaştığında kendini resetlemesini istiyorsak wdt sistemi resetleyebilir. Örneğin bir sensörden veri okunuyor ve sensör her okumaya cevap verdiğinde wdt refresh edilirse ve bir süre sonra sensörden cevap alınamıyorsa(mcu dan kaynaklı bir hatadan dolayı) sistem resetlenebilir. Tabii burada hata sensörün kendisinde de olabilir. Başka bir örnek RTOS tarafında bir deadlock oluştuğunda da kullanılabiliyormuş. Yani bir task uzun bir süre boyunca çalışmazsa sistem resetlenebilir. Bu tarz hata durumları için bir reset mekanizması kurulabilir wdt ile.

mehmettopuz için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak.