Are you using the watchdog correctly?

Başlatan Müh. müh., 07 Haziran 2014, 16:35:28

Müh. müh.

Aşağıdaki yazı, st'nin, "SOFTWARE TECHNIQUES FOR IMPROVING MICROCONTROLLER EMC PERFORMANCE" isimli dökümanından alıntıdır..

2.1 USING THE WATCHDOG CORRECTLY

The watchdog is the most efficient tool you have available for ensuring that the MCU can recover
from software runaway failures. Its principle is very simple: it is a timer which generates
an MCU reset at the end of count. The only way of preventing the Watchdog resetting the microcontroller
is to refresh the counter periodically in the program.
But to make the watchdog work at its full potential, you have to insert the enable and refresh
instructions in your software in the right way.
Figure 1 shows the classic examples of bad watchdog implementation:
To do it the right way, the golden rules are:
– Enable the watchdog as soon as possible after reset, or use the Hardware Watchdog option
if its available.
– Never refresh the watchdog in an interrupt routine.

It is very important to optimize the period between the two refresh instructions according to the
duration of the various routines, including the interrupt rountines.
The minimum use of the watchdog resets the MCU, this means that the program execution
context is lost as well as the application data's integrity.
After reset, in addition to enabling the watchdog, on some MCUs you can use the reset flags
to distinguish between a Power On or Low Voltage reset and a Watchdog reset (refer to Section
3.3. for more details)


Türkçesini yazmadan önce sizlerin wdt ı nasıl kullandığınızı öğrenmek istiyorum. Yada kullanıyormusunuz, kullanmıyormusunuz bilmek istiyorum? :)

Destiny of white is dirtied. Destiny of black is found guilty...

Erol YILMAZ

WDT adi üzerinde bir timer dir.
TimER taştiği anda reset atar yada bir kesme oluşturur.

Reset sebebine işlemci tekrar calistiginda bir Reg ile bakılabilir genelde.

Wdt nin mcu calistiginda hemen aktive edilmesi önemlidir.

Pic te bu fuse dan secilebilir.
MSP430'da WDT acik gelir.

İnterrupt içinde wdt temizleme işi çok mantikli değil.

Çünkü yazilimsal kilitlenme durumunda interrupt ta her zaman temizlenecektir.

Temel kullanım:
Wdt ana döngüde 1 kere temizlenir.
Wdt periyodu ana döngünün en kötü  döngü süresinden daha uzun olmalidir.

z

Bilmek istersen ben dogru kullaniyorum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Müh. müh.

Alıntı yapılan: Allegro - 07 Haziran 2014, 16:59:02
WDT adi üzerinde bir timer dir.
TimER taştiği anda reset atar yada bir kesme oluşturur.

Reset sebebine işlemci tekrar calistiginda bir Reg ile bakılabilir genelde.

Wdt nin mcu calistiginda hemen aktive edilmesi önemlidir.

Pic te bu fuse dan secilebilir.
MSP430'da WDT acik gelir.

İnterrupt içinde wdt temizleme işi çok mantikli değil.

Çünkü yazilimsal kilitlenme durumunda interrupt ta her zaman temizlenecektir.


Temel kullanım:
Wdt ana döngüde 1 kere temizlenir.
Wdt periyodu ana döngünün en kötü  döngü süresinden daha uzun olmalidir.



İşin özeti budur. WDT dış etkenlerden dolayı duran program counter ın farkına varmak, sistemi kendi kendine yeniden başlatmaktır. Ayrıca, uyuyan mcu yu uyandırmak içinde kullanılabilir.

Bold ettiğim kısımlar çok önemlidir. Ayrıca, yazılım yazarken wdt yi açmak bazen size kafayı yedirtebilir. Önerilen yöntem, yazılımınız tamamlanınca yada bitimine yakın, main fonksiyonunun refresh süresini hesapladıktan sonra, main fonksiyon süresinin çok az fazlasına kurularak kullanılmalıdır.
Destiny of white is dirtied. Destiny of black is found guilty...

MT

#4
Benim kullanım amacım biraz daha farklı.  Uzaktan yazılım güncellemesi için kullanıyorum. Güncelleyeceğim zaman uyguluma yazılımım koşarken belirlediğim veri geldiyse watchdog'u çalıştırıp ardından interruptları kapatıp while(1) döngüsü içine giriyorum ve işlemci yazılımsal reseti yiyor. Kod kendi yazmış olduğum boot yazılımına girip güncelleme bilgisi bekliyor ve uygulama yazılımı mı bu şekilde güncelleyebiliyorum. Tavsiye ederim.

X-Fi

Peki işlemci neden durur? Resetlenirse neden düzelir? İşlemci duruyorsa wdt neden işlemciyle beraber durmaz? Bunu diğer timerlardan ayıran nedir? Yazılım yazarken wdt açık olunca neden kafayı yeriz.

Ben bunlarıda öğrenmek istiyorum açıklayabilirmisiniz?
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

yldzelektronik

Wdtnin kendi timeri var. Main clock sourceden ayri. Diger timerlardan ayrilan bi ozelligi yok saniyorum
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Müh. müh.

#7
Alıntı yapılan: X-Fi - 08 Haziran 2014, 00:01:12
Peki işlemci neden durur? Resetlenirse neden düzelir? İşlemci duruyorsa wdt neden işlemciyle beraber durmaz? Bunu diğer timerlardan ayıran nedir? Yazılım yazarken wdt açık olunca neden kafayı yeriz.

Ben bunlarıda öğrenmek istiyorum açıklayabilirmisiniz?

Hay hay.

Mcu bizim bazi seyleri duzgun becerememizden, yada etraftaki asiri gurultuden(aslinda yine biz bazi seyleri duzgunce becerememisizdir) takilabilir.

Resetlenirse duzelmez. sadece el ile mudahele edeceginize, otomatik resetlenmis olur.
Wdt mizin olmasi, 2 dk da 1 reset yiyen tasarimlar yapabilecegimiz manasina gelmez.
Hayati bir cihaz takilip durursa, hayata mal olur. Takilinca 2 sn sonra calismaya devam edrse, hayat kurtarilmis olur.

Wdt nin yapisi hakkinda bilgim yok. yani mcu duruyorda o nasil durmuyor. yani mcu calisirken o neden gurultuden etkilenip, durmuyor?

Yazilimi sonlandirmadan wdt yi acarsaniz, ve mainin timingi wdt yi asarsa reset yerseniz. zaten birseyler gelistiriyorsunuz. Sorunlari minimize etmek gerekir. Bu bir tavsiyedir. isterseniz siz aksini uygulayabilirsiniz. Size kalmis.

iyice aciklayabildimmi?  8)
Destiny of white is dirtied. Destiny of black is found guilty...

z

Eger islemcinin illegal address dedect tipinde bir mekanizmasi yoksa flashin en sonuna

while(1);

gibi bir satir eklerim.

Boyle yapmazsam, program counter icerigi bozulup ileri adreslere atlarsa donup dolasip romun en basina gelir. Islemcinin adina sanina bagli olarak burda ya reset rutini vardir yada vektor.

Sonucta hic bir sey olmamis gibi islemlere devam edebilir.

Fakat flashin en sonuna konan while(1); bir tusak rutindir ve PC buradan gecerken kapana yakalanir ve WDT  tetiklenir.

Not: Romun bos adresleri 0xFF 0xFFFF gibi veriler genellikle anlamli bir hex komuta denk duser.

Ote yandan her islemcinin WDT si basitce resetlenmez.

Ardisil olarak 0x55 ve 0xAA ile resetlenen islemcilerde timer int rutininde 0x55 kullanirsam ana rutinde 0xAA kullanirim.

Boylece ardisil 0x55 ler yada 0xaa lar WDT i tetikleyip alarm verdirirken interrupt rutinimin de isleyip islemediginden emin olurum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

kimlenbu

En son okuldayken wdt kullandım, o da gereklilikten değil istek üzerineydi. bu kilit bilgilerden haberim yoktu, teşekkür ederim.

Bir soru sorayım, wdt kurduk diyelim, işlemci kilitlendi, reseti yedi baştan başladı. stm32f4'ü örnek verirsek programın hangi satırda kilitlendiğini bulmak için stratejimiz ne olurdu ?

fahri-

Pic mcu lar için konuşursak;
WDT osc si diğer donanımlardan bağımsız bir rc osilatörle çalışır. Bu nedenle diğer donanımlardaki oluşan kitlenme problerinden etkilemez. Diğer timerlardan ayrılan en büyük özelliği de budur. Ve üreticiler uyarırlar; Dahili rc osilatörle çalıştığı için WDT süresi çalışma sıcaklığına bağımlı olarak değişebilir ve hatta bu süre her MCU için aynı şartlarda bile olsa çok küçük de olsa farklıdır.
Bu nedenle zamanlamanın önemli olduğu projelerde timer olarak kullanılmamalıdır.
Diğer işlemcileri tam incelemedim ama sanırım onlar için de yukarıdaki yazdıklarım geçerlidir.

Müh. müh.

#11
Alıntı yapılan: fahri- - 08 Haziran 2014, 12:12:37
Pic mcu lar için konuşursak;
WDT osc si diğer donanımlardan bağımsız bir rc osilatörle çalışır. Bu nedenle diğer donanımlardaki oluşan kitlenme problerinden etkilemez. Diğer timerlardan ayrılan en büyük özelliği de budur. Ve üreticiler uyarırlar; Dahili rc osilatörle çalıştığı için WDT süresi çalışma sıcaklığına bağımlı olarak değişebilir ve hatta bu süre her MCU için aynı şartlarda bile olsa çok küçük de olsa farklıdır.
Bu nedenle zamanlamanın önemli olduğu projelerde timer olarak kullanılmamalıdır.
Diğer işlemcileri tam incelemedim ama sanırım onlar için de yukarıdaki yazdıklarım geçerlidir.

Wdt nin ocs nin durmasından bahsetmiyoruz. Sonuçta rc osc dijital bir conter ı prescaller bölümüne göre artışlar sağlatıyor. Mcu dışarıdaki gürültüden etkilenip, takılıyorda, bu sayıcının bitleri nasıl etkilenmiyor?

Örnek ile açıklacak olursak,

Wdt yazımı kolay olduğu için 8 bit olsun.

Binary olarak:

00000100 iken, Parazit geldiğinde içerik:
01100101 gibi bozulmuyor?


Eğer böyle bozulursa, mcu takılmamış olsa bile reset yer.Sürekli böyle olursa, mcu takılmadanda reset yer.. Parazit sonrası, sayıcının değeri düşük bir değer alırsa, bu seferde resetleme gecikir.


Alıntı yapılan: kimlenbu - 08 Haziran 2014, 10:59:11
En son okuldayken wdt kullandım, o da gereklilikten değil istek üzerineydi. bu kilit bilgilerden haberim yoktu, teşekkür ederim.

Bir soru sorayım, wdt kurduk diyelim, işlemci kilitlendi, reseti yedi baştan başladı. stm32f4'ü örnek verirsek programın hangi satırda kilitlendiğini bulmak için stratejimiz ne olurdu ?

Güzel bir konuya değindiniz.

Wdt reseti sonrası, mcu nun hangi sebep yüzünden resetlendiğini anlayabiliriz. Wdt ile resetlendi ise, ram in ve registerların yedeğini alıp, programı kaldığı yerden devam ettirebilirmiyiz? Bunu bende merak ediyorum.. Belkide bazı mcularda bunu hardware olarak yapılıyordur?
Destiny of white is dirtied. Destiny of black is found guilty...

MT

#12
Alıntı yapılan: kimlenbu - 08 Haziran 2014, 10:59:11
En son okuldayken wdt kullandım, o da gereklilikten değil istek üzerineydi. bu kilit bilgilerden haberim yoktu, teşekkür ederim.

Bir soru sorayım, wdt kurduk diyelim, işlemci kilitlendi, reseti yedi baştan başladı. stm32f4'ü örnek verirsek programın hangi satırda kilitlendiğini bulmak için stratejimiz ne olurdu ?

Önerdiğim yöntem hata tespiti için geçerli:
Biraz angarya bi yöntem işlem hızı yönünden çok sıkıntımız yoksa , her döngünün başında o döngü için belirlediğimiz adrese bir değer yazarız döngüden çıkarken de değerin içini temizleriz. Eeprom yoksa flash'ın bilmemne adres aralığını kullanabiliriz. Daha sonra işlemcideki hex'i çekip hangi döngüde kaldığını bulabiliriz. Stm8L için Flash unlock lock işlemi 22ms sürüyo her döngüde bu kadar bir kayıp yaşanacak 32 bit için bilmiyorum. Benimki biraz vur dedik öldürdün hesabı oldu ... 


@X-Fi
Yazılım yazarken wdt açık olunca neden kafayı yeriz.

Bu yazılımı yazarken başlangıçta belirlediğimiz wdt değerini farkında olmadan kod yazdıkça aşmış olabiliriz bu yüzden test aşamasında wdt aktif olup yazılım sürekli saçmalamış olur. Tüm yazılımı bitirip en büyük döngü değerini dikkate alarak wdt değeri belirlenmeli.