Dlaczego programy zatrzymują watchdog na MSP430?

11

Wiele przykładowych programów dla MSP430 ma swoją pierwszą linię jako:

WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer

Dlaczego to robią?

nekromanta
źródło

Odpowiedzi:

15

Timer watchdog (WDT) jest domyślnie włączony, warto mieć go w bardziej złożonych aplikacjach, ale wprawia w ruch wiele nowych osób. Często nie będą obsługiwać WDT w swoim kodzie ani zawierać procedury obsługi przerwań (ISR) w celu obsługi zdarzenia WDT, więc kiedy ich chip resetuje się, stają się bardzo sfrustrowani. Ponadto przykładowe programy w większości nie próbują zademonstrować WDT, więc jest on wyłączony.

Edycja: Strażnik mógł zostać nazwany „przełącznikiem trupa”. Jego domyślne zachowanie polega na resetowaniu mikrokontrolera, chyba że oprogramowanie układowe okresowo informuje go, że wszystko działa poprawnie. Jest to znane jako „karmienie psa” lub „kopanie psa”. W ten sposób, jeśli twoje oprogramowanie utknie w pętli lub w inny sposób przestanie działać zgodnie z oczekiwaniami, watchdog nie zostanie zasilony i zresetuje chip (mam nadzieję, że do świeżego, działającego stanu).

Możesz także używać WDT jako okresowego przerywania w celu wykonywania innych zadań, cokolwiek sobie wyobrażasz. Musisz tylko napisać odpowiedni ISR.

Samuel
źródło
+1 dzięki, chociaż ja i inni czytelnicy mogą to sprawdzić, miło byłoby poznać bardzo krótkie uzasadnienie, dlaczego WDT resetuje układ. (nie martw się jednak o dodanie go, twoja odpowiedź jest wystarczająco dobra, aby ją zaakceptować (po odczekaniu jeszcze kilku godzin na inne możliwe odpowiedzi))
nekromanta
Chyba powinienem wspomnieć w pytaniu, że jestem absolutnym nowicjuszem, który również nie ma pojęcia, co to jest watchdog :)
nekromanta
2
@necromancer Ah, nie martw się, dodałem odpowiednie informacje.
Samuel
2
Samuel - w prawie wszystkich przypadkach NIE powinieneś używać ISR do resetowania WDT. Prawie zawsze jest to coś złego do zrobienia. Przerwania mogą być wesoło kontynuowane, gdy inne części programu są wyłączone na lądzie. Czasami jest to możliwe / konieczne (przy komunikacji między ISR a innymi częściami oprogramowania układowego, które skutecznie ustawiają drugi poziom WDT), ale nie powinno się go sugerować nowicjuszowi jako pierwszego podejścia.
Spehro Pefhany
9

Oprócz uwag Samuela na temat osób, które przypadkowo potknęły się o WDT, istnieje jeszcze jeden ważny powód, dla którego należy go początkowo wyłączyć.

Nawet jeśli aplikacja jest w stanie poprawnie zresetować timer, może nie być w stanie tego zrobić podczas kodu inicjalizacji z dwóch powodów:

  • Inicjacja może potrwać dłużej niż pojedynczy tik WDT, ale wymaga wyłączenia przerwań. Oznacza to, że jeśli polegasz na powiedzmy na ISR timera, aby zresetować timer, możesz dostać się do nieskończonej pętli rozruchowej.
  • Niekoniecznie znasz stan rejestru timera na wszystkich MCU (tj. Następny tik może być znacznie wcześniej niż oczekiwano, ponieważ rejestr może nie rozpocząć się od 0).

W związku z tym dobrą praktyką jest wyłączanie WDT jako pierwszej rzeczy, nawet jeśli nigdy go nie włączałeś .

Jeśli chcesz go użyć, możesz go ponownie włączyć bezpośrednio przed włączeniem przerwań, co jest ostatnim krokiem kodu inicjującego.

sapi
źródło
+1 dziękuję za dodanie do odpowiedzi. odkryłem, że można go wyłączyć przed inicjalizacją za pomocą int _system_pre_init(void)funkcji, która wykonuje się przedmain
nekromanta