logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega, projektowanie watchdoga w C++.

bestmlody 12 Paź 2009 21:12 6551 61
  • #1 7120793
    bestmlody
    Poziom 14  
    Dotychczas nie zależało mi, żeby jakiś układ zabezpieczać watchdog'iem, ale w miarę rozwoju mojego projektu zaistniała taka potrzeba.
    Przeczytałem tutorial na "wkrętaku" i wszystko niby jasne, proste a jednak musi być jakieś ale...
    W moim programie jest funkcja while(1) gdzie mógłbym wstawić _WDR();
    ale jest tez funkcja programowania, gdzie na bardzo długi czas opuszczam pętle główną. Podprogramów jest dużo, funkcji cała masa musiałbym resetować go w prawie każdej funkcji. Wymyśliłem, że będę wyłączał mojego strażnika na czas programowania i włączał wracając do pętli while(1).
    Czy da się go włączać i wyłączać?
    Jeśli tak to jak to robić?
  • #3 7121009
    SebMarszal
    Poziom 14  
    Witam,
    Powinno się dać to zrobić, ale jaki ma to sens, bo jak program utknie w tej funkcji to będzie lipa :-))
  • #4 7121115
    Konto nie istnieje
    Poziom 1  
  • #5 7121206
    JarekC
    Poziom 32  
    Cóż ja wyznaję zasadę albo zrobić coś porządnie albo nie robić tego wcale.

    Wiele procesorów nie daje możliwości wyłączenia WatchDoga.
    Niektóre specjalizowane WatchDogi zewnętrzne wymagają wręcz kasowania
    w ściśle wyznaczonych okienkach czasowych.

    Umieszczenie w kodzie sekwencji wył. WatchDoga może w krytycznym przypadku
    doprowadzić do jego przypadkowego wyłączenia.

    Pozdrawiam
    JarekC
  • #6 7121310
    bestmlody
    Poziom 14  
    Układ będzie załączony 24h. Program będę zmieniać może raz na rok, niech nawet codziennie i potrwa to np 3min, zatem olbrzymią większość czasu spędzi pod "ochroną". Kolega ATOM wie o co chodzi :)
    Czyli wystarczy ustawiać na 0 i 1 ten bit WDE? Bo w datasheet jest to troche zagmatwane, coś jest napisane, że trzeba manipulować dwoma bitami, żeby go włączać i wyłączać, za bardzo tego nie zrozumiałem...
  • #7 7121316
    Konto nie istnieje
    Poziom 1  
  • #8 7121320
    bestmlody
    Poziom 14  
    A tak w ogóle... jak to działa? tak jak przycisk reset? Czyli zupełny powrót do początku programu?
  • #9 7121364
    Konto nie istnieje
    Poziom 1  
  • #10 7121396
    bestmlody
    Poziom 14  
    Dzięki. Pomajstruje zatem bitem WDE.
  • #11 7121643
    michalko12
    Specjalista - Mikrokontrolery
    bestmlody napisał:
    Dotychczas nie zależało mi, żeby jakiś układ zabezpieczać watchdog'iem, ale w miarę rozwoju mojego projektu zaistniała taka potrzeba.
    Przeczytałem tutorial na "wkrętaku" i wszystko niby jasne, proste a jednak musi być jakieś ale...
    W moim programie jest funkcja while(1) gdzie mógłbym wstawić _WDR();
    ale jest tez funkcja programowania, gdzie na bardzo długi czas opuszczam pętle główną. Podprogramów jest dużo, funkcji cała masa musiałbym resetować go w prawie każdej funkcji. Wymyśliłem, że będę wyłączał mojego strażnika na czas programowania i włączał wracając do pętli while(1).
    Czy da się go włączać i wyłączać?
    Jeśli tak to jak to robić?


    Ja bym zrobił to tak że WD kasowałbym w przerwaniu np od timera, ale pod jednym warunkiem. WD byłby kasowany tylko wtedy gdy wszystkie flagi w jakieś zmiennej byłby ustawione przez poszczególne fragmenty programu. Wtedy nie ma znaczenia ile czasu zajmują poszczególne podprogramy. WD może cały czas być odświeżany, ale co jakiś czas byłyby brane pod uwagę te flagi i jeśli nie byłby spełniony warunek odświeżenia WD, odświeżanie byłoby zawieszone i WD zresetowałby procesor.

    Sceneriusz wyglądałby mniej więcej tak:
    - WD odświeżany jest w przerwaniu
    - mija jakiś odcinek czasu lub ilość odświeżeń, brana jest pod uwagę zmienna z flagami ustawianymi przez poszczególne fragmenty kodu.
    - Flagi porównywane są z maską która może być dynamicznie zmieniana w zależności od stanu programu, nie zawsze wszystkie funkcje programu są wykorzystywane non stop, więc za pomocą maski można włączać i wyłączać je spod działania WD.
    - Jeśli zawartość zmiennej nie zgadza się z maską wtedy następuje wstrzymanie odświeżania WD i reset procesora, jeśli natomiast wszystkie fragmenty programu potwierdziły swoją poprawną pracę zgłaszając swoja flagę, następuje wyzerowanie zmiennej z flagami oraz licznika czasu odświeżania WD i cykl się powtarza.

    Jest pewne niebezpieczeństwo, że przy odpowiednio ustawionej masce warunek odświeżania mógłby być zawsze spełniony więc i przed tym trzeba się zabezpieczyć
    stosując np część flag niemaskowalnych które zawsze muszą być potwierdzane.
  • #12 7121696
    Konto nie istnieje
    Poziom 1  
  • #13 7122886
    tmf
    VIP Zasłużony dla elektroda
    Jesli jakas funkcja jest wykonywana dluzej to najprosciej jest w niej umiescic dodatkowy WDR. Okresowe blokowanie WD jest bez sensu, bo, zeby WD mial sens to trzeba ustawic fusebita uniemozliwiajacego jego blokowanie...
    Co do tych flag - nie prosciej ustawic ktrotki okres WD i w kazdym miejscu umiescic WDR? Wtedy na biezaco WD jest resetowany w miare poprawnego wykonywania kodu.
  • #14 7123004
    kulmar
    Poziom 31  
    Jaki jest okres pomiędzy kolejnymi kasowaniami watch-doga ? Na ogól mozna go ustawić. Nie wiem, czy jest to mozliwe w tym konkretnym procesorze. Ten okres dobiera się wtedy na tyle długi, żeby kasowanie odbywało się w jednym miejscu programu (pętli głównej). Jeśli w programie są pętle oczekiwania na zdarzenie i czas trwania takiej pętli może być dłuższy niż okres watch-doga, to niestety takie miejsca trzeba wyłapać. Kasowanie w przerwaniach - ma taką wadę, że jeśli program główny się zapętli, to przerwania będą się wykonywały (i kasowały watch-doga), ale procesor poza tym jest martwy. Druga strona medalu jest taka, że jeśli żle przeanalizowalismy działanie programu i watch-dog będzie go gdzieś przerywał, to takie przypadki są bardzo nieprzyjemne do zdiagnozowania.

    Pozdrawiam

    Mariusz
  • #15 7123310
    Konto nie istnieje
    Poziom 1  
  • #16 7123985
    tmf
    VIP Zasłużony dla elektroda
    A niby dlaczego? I co te flagi maja dac? Bardziej zawila strukture programu, zeby potem juz absolutnie nikt sie nie polapal dlaczego pisany program okresowo sie resetuje?
  • #17 7124509
    Konto nie istnieje
    Poziom 1  
  • #18 7124890
    Freddie Chopin
    Specjalista - Mikrokontrolery
    atom1477 napisał:
    Alw program ma działać a nie umilać zrozumienie jego zasady działania.

    Naczelna zasada assemblerowców*

    4\/3!!
    _____________________________
    * assemblerowiec - gatunek na wymarciu, wypierany przez osobników zainteresowanych językami wysokiego poziomu, które poza działaniem umożliwiają też zrozumienie
  • #19 7125085
    janbernat
    Poziom 38  
    Ciekawe kiedy informatycy pozbędą się "sprzętu" wiążącego "ducha informatyki" jak jakieś nieznośne betonowe buty.
    Wtedy nareszcie będą mogli poruszać się w niebieskich sferach czystej platońskiej idei.
    Po co te prądy, napięcia, procesory i płytki.
    Bez nich będzie lepiej.
  • #20 7125192
    Konto nie istnieje
    Poziom 1  
  • #21 7125213
    Freddie Chopin
    Specjalista - Mikrokontrolery
    @janbernat:
    Zupełnie nietrafiona odpowiedź.

    int8_t i;

    if (i < 0) { ... }

    // albo

    if (i & 0x80) { ... }

    Obydwie linijki robią to samo, obydwie zapewne skompilują się do takich samych rozkazów (ewentualnie adekwatnych, zajmujących tyle samo miejsca i cykli), ale z pierwszej coś wynika, a druga oznacza tylko tyle, że piszący chciał pokazać czego to on nie wie o kodzie U2.

    Jest nawet takie powiedzonko, że kodu nie powinno się komentować - jak nie wiadomo o co w nim chodzi z SAMEGO kodu, to jest beznadziejny i należy go napisać tak, żeby był zrozumiały - self-documenting.

    Tu nie chodzi o "wiązanie się ze sprzętem", ale o odwiązanie się od niego przez kolejne poziomy abstrakcji. W końcu nawet assembler jest abstrakcją pierwszego stopnia, bo procesor nie wie co to r1, mov i str - dla niego istnieją tylko różne napięcia na tranzystorkach. Jedna abstrakcja na drugiej i już jesteśmy przy zmiennych, które mają nazwy i określone zachowanie / znaczenie. Obiekty i pełna abstrakcja znajduje się tylko krok dalej - wtedy już nic nikogo nie wiąże.

    @A-T-O-M:
    a niby co takiego nie działa w językach wysokiego poziomu, a działa w assemblerze?

    4\/3!!
  • #22 7125276
    Konto nie istnieje
    Poziom 1  
  • #23 7125825
    janbernat
    Poziom 38  
    Jak na "nietrafioną odpowiedź" to wcale długa odpowiedź.
    Najpierw wymrą asemblerowcy, potem wymrą ci od zer i jedynek, potem ci co projektują komórki pamięci a potem ci od ścieżek mierzonych w nanometrach.
    A potem można uprawiać jedną abstrakcję na drugiej.
    Tylko nie wiadomo kto będzie te "abstrakcje" tłumaczył na zera i jedynki.
    To jak z samochodem, lodówką czy telewizorem.
    Jak jedziesz- po co wiedza jak skonstruować wtryskiwacz czy hamulce.
    Ale jak wymrą- to kto to będzie wiedział jak to zrobić?
    Samochody prowadzą czasem rajdowcy- geniusze drogi.
    Ale żaden nie skonstruuje samochodu.
  • #24 7125902
    Konto nie istnieje
    Poziom 1  
  • #25 7126257
    Freddie Chopin
    Specjalista - Mikrokontrolery
    No pięknie sobie słodzicie, więc nie przeszkadzajcie sobie w tej kwestii.

    Nikt tu nie pisał, że assembler jest niepotrzebny, tyle że idee w rodzaju "nie ważne, że nikt tego nie zrozumie, ważne że (jakoś) działa" jakoś jednak kojarzą mi się właśnie z tą frakcją. Kod taki (tak jak i kod assemblerowy w 99% przypadków) do niczego się później nie nadaje - drobna zmiana założeń (jak wiadomo często następująca) i pół programu trzeba pisać od nowa, bo 2 tygodnie temu jakaś "chroniona" i "poszukiwana" jednostka zoptymalizowała 2 cykle procesora w niekrytycznym miejscu, dzięki czemu cały program oszczędza dziennie do 10us! Dobrze chociaż jeśli ktoś wie, że super optymalny kawałek wymaga teraz przeróbki! Gorzej jeśli ten super optymalny kawałek został już zapomniany, a teraz 5 "nie-chronionych" i "nie-poszukiwanych" osób będzie szukało błedu przez 2 tygodnie, co odpowiadać będzie czasowi zaoszczędzonemu przez program w okresie 200 lat. Faktycznie oszczędność!

    "Premature optimization is the root of all evil" - poszukajcie w google.

    A potem - na początek kolejnych poszukiwań - to http://en.wikipedia.org/wiki/Self-documenting

    To jest dokładnie ten sam problem, co ostatnio linie pamięci SDRAM na płytce którą zaprojektował atom1477 - na początku pomyślał "eee tam, co za różnica jak to podłącze, ważne żeby każda była gdzieś połączona, jakoś to będzie działać". Takie podejście zemściło się już raz - w sprzęcie. Policz sam, ile czasu i kasy straciłeś przez tą oszczędność kilku godzin na etapie projektu pierwszego PCB. Opłacało się? Tego typu założenia które tu przedstawiacie mają identyczne implikacje. Raz, drugi, trzeci nie będzie problemu, ale jak się w końcu pojawi (a pojawi się na pewno!), to wtedy zniweczy oszczędności wszystkich poprzednich sytuacji.

    Istnieje też szansa, że nawet nie uznacie tego za problem, dochodząc do wniosku, że to "normalne", że kod po zmianie w jednym miejscu sypie się w 15 innych, z czego znalezienie ostatniego problemu zajmuje kilka dni. Może nawet uważacie to za normalne, że po dwóch tygodniach braku kontaktu kod jest już nie do zrozumienia. To tłumaczy wasze podejście do tej sprawy i powoduje, że dyskusja jest niemożliwa, bo rozmijamy się w podstawowej kwestii - to co ja uznaję za patologię, wy widzicie jako zupełnie normalną sprawę.

    4\/3!!
  • #26 7126440
    kulmar
    Poziom 31  
    Są sytuacje, w których programowanie w asemblerze jest jedynym możliwym rozwiązaniem problemu. Choćby programowanie małych procesorów stosowanych w pilotach podczerwieni, gdzie po pierwsze jest bardzo mało pamieci programu i po drugie trzeba spełnić dosyć rygorystyczne zależności czasowe. Tak więc asembler jet takim samym narzędziem jak każde inne i używa się go tam, gdzie jest to konieczne (lub optymalne). A kod programu powinien być czytelny niezależnie od tego, czy jest napisany w języku wysokiego poziomu, czy też w asemblerze.

    Pozdrawiam

    Mariusz
  • #27 7126466
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Owszem, ale to jest extremalny przypadek - niech każdy sobie po cichu odpowie, ile razy pisał ostatnio program na układ o tak ograniczonych zasobach, że naprawdę NIE DA SIĘ go napisać w C.

    4\/3!!
  • #29 7126532
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Przypuszczam, że będziesz osamotniony w tych liczbach. Każdy mikrokontroler który miałem w ręce można było oprogramowywać conajmniej w C. Mocny mikrokontroler kosztuje zwykle tyle co słabiutki, więc...

    4\/3!!
  • #30 7126581
    kulmar
    Poziom 31  
    Nie zgadzam się z Twoją opnią, która sprowadza się do tego, że skoro jest dostepny C, to zapomnijmy o asemblerze. Masz rację, jeśli dotyczy to projektów amatorskich (hobby) lub krótkoseryjnych, w których ważniejszy jest czas wykonania prototypów niż korzyści ekonomiczne.
    Podam jeszcze inny przykład stereotypu: system Windows całkowicie wyparł inne systemy operacyjne z komputerów klasy PC, DOS poszedł w absolutne zapomnienie. Ja musiałem wykonać sterowanie linii produkcyjnej. Gdybym założył, że korzystam z systemu Windows, to musiałbym dokonać cudów przy projektowaniu i oprogramowywaniu modułów wykonawczych podłączonych do komputera klasy PC z systemem Windows. Ja wybrałem DOS i:
    1.żaden moduł wykonawczy nie ma własnego procesora, bo jest to niepotrzebne
    2.wszystkie moduły są sterowane bezpośrednio z komputera klasy PC (Pentium 450Mhz, koszt ok. 50zł) i pracują w czasie rzeczywistym.
    3.całe oprogramowanie sterujące jest wykonane w C++ for DOS i wydajność starego peceta pracującego pod DOS'em wystarcza na jednoczesne obsłuzenie kilku modułów wykonawczych.
    4.w czasie wykonanania wielu milionów cykli produkcyjnych nigdy nie zauważono zadnego objawu zawieszenia systemu.

    Ale w momencie, kiedy przedstawiałem taką koncepcję rozwiązania problemu usłyszałem, że przeciez nikt tak nie robi, bo wszyscy uzywają systemu Windows.

    Pozdrawiam

    Mariusz
REKLAMA