Czy wszystkie pułapki powinny być zawsze zdefiniowane?

18

Widziałem teraz dwa przypadki z dsPIC 30F4013, w których kontroler resetuje się z powodu niezdefiniowanej pułapki. Dlaczego te pułapki były podnoszone przede wszystkim, wciąż pozostaje tajemnicą, ale to nie jest moje bezpośrednie pytanie. Zaczynam myśleć, że dobrą praktyką programistyczną jest zawsze definiowanie wszystkich pułapek, nawet jeśli pułapki nigdy nie powinny wystąpić, więc otrzymuję przynajmniej wyraźny komunikat o błędzie zamiast losowego resetowania. Czy to standardowa praktyka, o której nie wiem? Czy należy wziąć pod uwagę wady tej praktyki?

Stephen Collings
źródło
4
Nie jest to odpowiedź na twoje pytanie, ale cierpiałem z powodu tego rodzaju symptomów w systemach dsPIC i PIC24 jakiś czas temu. W moim przypadku pułapki wynikały z bitów kodu, w których odsyłałem wskaźniki do wartości 16-bitowych, a same wskaźniki miały nieparzyste (nieparzyste) wartości, ponieważ wskazywały na okrągły bufor komunikacji - i nie miałem wcześniej sposób na sprawdzenie, czy 16-bitowa wartość zaczyna się na granicy nieparzystej czy parzystej. Kompilator XC16 nie chroni cię przed zawieszaniem się sprzętu. Skończyło się na napisaniu makra opakowania dla tych funkcji, które wymusiło 2 8-bitowe wycofanie wskaźnika
brhans

Odpowiedzi:

13

Moja nieformalna zasada brzmi:

  1. Jeśli przerwanie jest włączone, powinieneś mieć kod, który go obsługuje.
  2. Jeśli nie piszesz kodu dla przerwania, wyłącz go.
  3. Jeśli nie możesz tego wyłączyć, napisz dla niego kod.

Jednak nawet bez tej reguły arkusz danych wyraźnie odpowiada na twoje pytanie:

Jeśli użytkownik nie zamierza podejmować działań naprawczych w przypadku wystąpienia błędu pułapki, wektory te muszą zostać załadowane adresem domyślnej procedury obsługi, która zawiera po prostu instrukcję RESET. Z drugiej strony, jeśli wywoływany jest jeden z wektorów zawierających nieprawidłowy adres, generowana jest pułapka błędu adresu.

( Źródło , sekcja 8.3, pierwsza uwaga)

Ponieważ nie możesz maskować pułapek, musisz sobie z nimi poradzić. Jeśli nie chcesz zajmować się pułapką w określony sposób, odpowiednią metodą jest wykonanie RESETinstrukcji.

Adam Davis
źródło
Tak. Mam standardowy moduł z celami dla wszystkich pułapek.
Olin Lathrop
16

Tak, to dobry pomysł - jedynym minusem jest nieco większy rozmiar kodu i musisz zdecydować, co zrobić z pułapką (wyemitować komunikat na porcie szeregowym? Włączyć lampkę „FAILED”? Dyskretnie uruchomić ponownie itp. )

pjc50
źródło
4
Zwykle mam procesor działający w nieskończonej pętli NOP / GOTO. W ten sposób stos nie został uszkodzony z pułapki, a podczas debugowania mam szansę go rozwikłać i dowiedzieć się, co się stało. Nie dostaję często pułapek, ale w 80% przypadków jest to pułapka na nieparzyste adresy, zwykle dlatego, że śmieci są ładowane jako wskaźnik. Czasami wskaźnik stosu ulega uszkodzeniu i tworzy nieparzyste pułapki na adresy. Są trudniejsze do debugowania, ponieważ stosu już nie ma. Na szczęście to naprawdę rzadkie.
Olin Lathrop