Valvetaimer

**Valvetaimer** (ingl *watchdog timer*, *watchdog*, WDT) on elektrooniline taimer, mille abil tuvastatakse arvutites tekkivad tark- ja riistvaraprobleeme. Probleemi olemasolul antakse sellest teada arvutile, mis tegutseb vastavalt probleemi olemusele. Normaalse arvuti töö korral nullitakse valvetaimerit regulaarselt arvuti poolt. Kui arvutil tekib tark- või riistvara viga, siis jääb valvetaimer nullimata ning taimer loendab üha edasi. Kui valvetaimer loendab liiga kaua, annab see signaali arvutile, et see saaks normaalse töö jätkamiseks vastavalt tegutseda. Kõige tavalisem arvuti reageerimine valvetaimeri signaalile on süsteemi taaskäivitamise protseduur.

Valvetaimerit kasutatakse enamjaolt süsteemides, kus süsteemi töökindlus on eriti tähtis. Valvetaimeri leiab nii arvutisse sisseehitatult kui ka eraldi integraallülitusena. Sisseehitatud kujul leiab seda laialdaselt mikrokontrolleritest. Valvetaimerist on kasu siis, kui süsteemi vigade tekkimisel pole võimalik inimesel füüsiliselt või piisavalt kiiresti sellele reageerida.

Valvetaimeri nullimist nimetatakse ka löömiseks (ingl *kicking*) või toitmiseks (ingl *feeding*). Mõlemad sõnad tulevad piltlikult öeldes füüsilise koera söötmisest või löömisest, mille käigus pole võimalik koeral inimest hammustada.

## Ajalugu

Clementine kosmoseaparaat, mis lennutati kosmosesse 1994. aasta jaanuaris, suundus pärast kahekuulist Kuu kaardistamist Maa-lähedase asteroidi Geographos suunas. Clementini põhiline juhtprotsessor oli kahetuumaline Honeywell 1750, mis juhtis telemeetriat ning palju teisi funktsioone. Kuigi 1750 sai juhtida ka kosmoseaparaadi tõukureid, siis tegi see seda ainult hädaolukorras. Kogu tõukurite juhtimine toimus manuaalselt maapealsest juhtimiskeskusest.

Nagu oli juhtunud varemgi, tekkis ka 7. mail 1994 tarkvaras aritmeetikaviga. Varem oli tuvastatud umbes 3000 sellist probleemi, kuid kõik saavutasid lahenduse ning kosmoseaparaat sai oma tööga jätkata. Pärast vea tekkimist 7. mail sai juhtimiskeskus kosmoseaparaadilt segast infot ning veidi hiljem kogu andmevahetus katkes. Kosmoseaparaadil olev kontroller üritas äratada 1750 protsessorit taas ellu, saates sellele 20 minutit käske tarkvaraliseks taaskäivitamiseks. Alles pärast riistvaralise taaskäivitamise käsku ning protsessori algkäivitamist sai tarkvara normaalset tööd jätkata.

Kosmoseaparaat oli küll taas töökorras, kui tarkvara vea tõttu käivitas Honeywell 1750 tõukurid, mis kulutasid ära kogu saadaoleva kütuse. Samal ajal kui protsessorit püüti taas töökorda saada, tiirles kosmoseaparaat ringiratast 80 pööret minutis, kuniks riistvaraline taaskäivitamine sulges kütuseventiili.

Honeywell 1750-l oli sisseehitatud valvetaimer olemas, aga seda ei kasutatud.

## Struktuur

### Üheastmeline ehk lihtne valvetaimer

Üheastmelise valvetaimeri korral on kasutusel üks taimer, mille aja lõppedes alustab süsteem kohe taaskäivitamise protseduuri. Seda tüüpi valvetaimerit kasutatakse enamikus mikrokontrollerites. Valvetaimer saab taktsageduse enamasti samast allikast nagu ka protsessor, millega see ühendatud on. On ka selliseid taimereid, mille taktsignaal on pärit eri allikast. Mõlemad taktsignaali allikatüübid on kasutusel nii sisemiste kui ka välimiste valvetaimerite korral. Seda tüüpi struktuuri puuduseks on see, et aja täitumisel tehakse arvutile kohe taaskäivitus, kuigi tekkinud viga võib olla lahendatav mõnel muul viisil. 

### Mitmeastmeline valvetaimer

Mitmeastmelise struktuuri korral on pandud mitu taimerit jadamisi, kus ainult esimest taimerit söödetakse. Selle struktuuri eelis lihtsa struktuuriga võrreldes on võimalus süsteem parandada ilma taaskäivitamiseta. Esimese astme aja lõppedes saab arvuti vastava signaali ning käivitatakse ka järgmine aste. Esimeselt astmelt saadud signaaliga arvuti otsustab, kas on võimalik süsteemi parandada või peab tegema süsteemile taaskäivitamise. Samuti paneb arvuti vea kirja vastavasse logisse, mida kasutaja saab hiljem kasutada süsteemi hooldamiseks või parandamiseks. Arvuti poolt positiivse parandamiskatse korral toimub kõigi mitmeastmelise valvetaimeri astmete taastamine ning arvuti saab alustada uuesti normaalset tööd. Juhul kui probleem on tõsisem ja arvuti ignoreerib esimeselt astmelt saadud signaali, siis loendab teine aste aja lõppemiseni. Kaheastmelise valvetaimeri korral alustatakse pärast teist astet kogu süsteemi taaskäivitamisega. Kolmeastmelise korral aga pärast teise astme aja lõppemise signaali alustatakse protseduuriga mida teostatakse ka juhul, kui arvuti enam ei reageeri. Selle protseduuriga kirjutatakse vastav viga logisse ning oodatakse valvetaimeri kolmanda astme täitumist, mille väljundsignaali ilmumisel alustatakse süsteemi taaskäivitamist.

### Intervall
Valvetaimeri ajaline intervall on kas konstantne või muudetav. Konstantse korral on väärtus juba tootja poolt eelseadistatud. Muudetava korral toimub väärtuse seadistamine kas riistvaraliselt või tarkvaraliselt. Riistvaraliselt seadistatav ajaline intervall on peamiselt eraldiseisva integraallülitusega valvetaimeritel. Riistvaraline seadistamine tähendab, et taimeri intervall seadistatakse väliselt, kas täiendavate elektroonikakomponentidega või signaaliradadega. Tarkvaraliselt seadistatavat taimerit saab seadistada programmi algkäivitamisel, kirjutades vajalikud väärtused õigesse kohta valvetaimeri konfiguratsiooni registrisse. Olenevalt arvutist on võimalik ka seadistada väärtused programmist eraldi.

### Aknaga valvetaimer

Tavapärast valvetaimeri ajaline intervall on 0 kuni n, kus n on seadistatud lõppväärtus. Kui taimerit sööta ajavahemikul 0 kuni n, siis taimeri väärtus on tagasi nullis ning alustatakse uut loendamist. Sellisel kujul valvetaimer ei pruugi alati tuvastada tark- või riistvaras juhtuvaid vigu. Kui tarkvaras tekkiva vea tõttu jääb tarkvara konstantselt valvetaimerit söötma, kuigi tarkvara enam normaalset tööd ei jätka, on tavalise 0 kuni n loendava valvetaimeri kasutamine kasutu. Sellist tüüpi vigade vältimiseks kasutatakse aknaga valvetaimerit. Aknaga valvetaimer võimaldab leida tark- või riistvara vigu ka siis, kui söötmine toimub ebanormaalselt kiiresti. Nimest tulenevalt on aknaga valvetaimeril ajaaken ehk kindel aeg, mille jooksul tuleb taimer nullida. Kui nullimine toimub aknast väljaspool saadab valvetaimer välja veasignaali. Nagu ka tavaline valvetaimer loendab aknaga valvetaimer 0 kuni n, kuid nende kahe väärtuse vahel asub ka väärtus m, mis märgib ära akna algusaja.

## Näited

### Väline valvetaimer

STM6321 on integraallülitus, mis võimaldab lisada valvetaimeri eraldiseisvana elektroonikadisaini. Seda mikrokiipi on saadaval viiejalgses SOT-23 pakendis. See on mõeldud protsessoritele või mikrokontrolleritele millel pole integreeritud ehk sisse-ehitatud valvetaimerit. STM6321 on ettevõtte ST Microelectronics toodetud valvetaimer. On palju teisi tootjaid ja mudeleid, mis on parameetrite poolest ligilähedased.

Lisaks valvetaimerile on 6321-l ka toitepinge jälgimise üksus, mis mõõdab ning tuvastab toitepinge muutuse üle etteantud lävendi. Pingelävendite väärtused on saadaval erinevaid ning see sõltub STM6321 täpsemast mudelist. Pingelävendi ületamine tekitab samasuguse väljundsignaali nagu valvetaimeri loenduri täitumine. STM6321 valvetaimeri ajaline intervall on tüüpiliselt 1,6 sekundit. Taimeri söötmine toimub kasutades 6321 sisendviiku numbriga 4. Sisendviik numbriga 4 on tähistatud tähisega *WDI* (*Watchdog input*). Seni kuni *WDI* sisendsignaal on kõrge (1) või madal (0) toimub taimeri loendamine. Taimeri nullimiseks ehk söötmiseks tuleb *WDI* sisendi olekut muuta ehk tuleb muuta olekut kõrgelt madalaks või madalast kõrgest. Kui valvetaimeri aeg saab täis või pingenivoo on üle etteantud lävendi, väljundviik numbriga 1 ehk *RST*(*Reset*) muudetakse madalaks. WDI on avatud neeluga aktiivselt madal väljund, seega sobib see hästi ühendamiseks otse protsessori või mikrokontrolleri taaskäivitamise sisendi külge.

### Integreeritud ehk sisemine valvetaimer

STM8S on ST Microelectronicisi toodetud mikrokontroller, millel on integreeritud harilik valvetaimer kui ka aknaga valvetaimer. Mõlemad valvetaimerid on tarkvaraliselt seadistatavad. Protsessor ning harilik valvetaimer saavad oma taktsignaali eri allikatest, selleks et valvetaimer püsiks aktiivne ka siis, kui protsessori taktsignaal lõpetab töötamise. Harilik valvetaimer saab oma taktsignaali integreeritud aeglase taktsignaali generaatorilt, milleks on 128&nbsp;kHz. Edasi toimub taktsignaali kahega jagamine ning seejärel on tarkvaraliselt signaali veel omakorda võimalik jagada seitsme erineva väärtusega (4, 8, 16, 32, 64, 128, 256). Erinevad eeljagamise väärtused annavad võimaluse valvetaimeri ajalise intervalli muutmiseks. Samuti on võimalik tarkvaraliselt muuta loenduri loendamisaega mille väärtus saab olla 0–255. Muutes taktsignaali eeljagamis väärtust ja loenduri loendamisaja väärtust on võimalik ajaline intervall muuta 128&nbsp;kHz taktsignaali korral vahemikus 62,5–1,02 s. STM8 valvetaimer kasutab allalugevat loendurit, seega valvetaimeri toitmisel ei nullita taimerit, vaid see hoopis algväärtustatakse. Taimeri jõudmisel nulli saadetakse taaskäivitusliinile signaal ning kogu mikrokontroller taaskäivitatakse. Kõik seadistusregistrid on kirjutuskaitstud selleks, et vigase tarkvara tõttu ei toimuks nendes registrites kindlasti mitte mingeid muudatusi. Samal põhjusel on ka valvetaimeri söötmise jaoks vajalik kirjutada ettemääratud väärtus kindlasse registrisse. 

```c
/*
Näide valvetaimeri seadistamisest ja söötmisest STM8S mikrokontrollerile C keeles.
*/

#include "stm8s.h"

void wtd_init(void){
    // Valvetaimeri seadistamine
    IWDG_KR = 0xCC;      // Valvetaimeri käivitamine
    IWDG_KR = 0x55;      // Kirjutuskaitse inaktiveerimine
    IWDG_PR |= 6;        // Taktsageduse eeljagamine 256-ga
    IWDG_RLR = 250;      // Ajaline intervall 1 sekund
    IWDG_KR = 0xAA;      // Taasta kirjutuskaitse värskendades taimerit
}

void main(void){

    wtd_init();
    
    while(1){
    
        /*
        Programmi põhitsükkel asub siin
        */
        
        IWDG_KR = 0xAA; // Perioodiline valvetaimeri söötmine
    }
}
```
Aknaga valvetaimer STM8S mikrokontrolleril saab oma taktsageduse põhikellalt ehk kiirelt taktsignaali generaatorilt. Kellasignaali allikas võib olla nii sisemine kui ka väline generaator. Aknaga valvetaimeri üksuse taktsignaal on alati konstantselt jagatud 12 288-ga, seega 16&nbsp;MHz taktsignaali korral jõuab taimerini 1,302&nbsp;kHz. Antud taktsagedusega on võimalik saavutada 0,768–49,152-millisekundiline intervall. STM8 aknaga valvetaimeril on ainult ´kaks seadistusregistrit. Üks neist annab ette taimeri loendamise väärtuse ning teine akna alguse väärtuse. Taimeri loendamise väärtus saab olla vahemikus 64–127 ning akna alguse väärtus saab olla 64 kuni väärtuseni seadistatud loendamise väärtuseni. Süsteemi taaskäivitamine toimub kui taimeri väärtus loendatud alla 64 või kui taimeri algseadistamine toimus väärtuse juures, mis on suurem kui akna alguse väärtus.


```c
/*
Näide aknaga valvetaimeri seadistamisest ja söötmisest STM8S mikrokontrollerile C keeles.
*/

#include "stm8s.h"
#include "delay.h"

void wwtd_init(void){
    // Valvetaimeri seadistamine
    WWDG_CR |= (1 << WDGA); // Valvetaimeri käivitamine
    WWDG_CR |= (1 << T6);   // T6 biti kõrgeks tõstmine, et vältida kohest taaskäivitamist
    WWDG_CR |= 0x7F;        // Ajaline intervall 49,152 ms
    WWDG_WR = 0x68;         // Akna alguse väärtus 18,432 ms
}

void main(void){

    wwtd_init();
    
    while(1){
    
        /*
        Programmi põhitsükkel asub siin mis võtab aega umbes 25-30 ms
        */
        
        delay_ms(30); // Põhitsükli viide
        
        WWDG_CR |= 0x7F; // Perioodiline valvetaimeri söötmine
    }
}
```


## Viited