Skocz do zawartości

Problem z dziwnym zachowaniem programu z timerami


Pomocna odpowiedź

@etet100 czy masz jakis patent na pogodzenie obiektowego programowania z funkcjami przerywajacymi? Bo mocno niewygodnie sie z tym pracuje a z tego co czytalem nie da sie przerwan wewnatrz klas uzyc. Obecnie mam pomysl taki jak na repo (w starszym commicie, ktory oryginalnie wyslalem) czyli wywolanie metody z obiektu w przerwaniu

Przede wszystkim musisz zapomnieć o mechanizmach znanych z programowania wysokopoziomowego. Tu nie ma czegoś takiego jak `obserwuj przerwanie i wywołaj metodę`. Rozpoczęcie obsługi przerwania oznacza najczęściej po prostu skok pod jakiś konkretny adres, wynikający z architektury procesora. Po tym adresem kompilator umieszcza daną procedurę obsługi. Co w tej procedurze zrobisz to już twoja sprawa. Takie wykonanie metody obiektu raczej nie jest złym rozwiązaniem. Musisz jednak pamiętać o kilku niebezpieczeństwach. Zwykle nie wiesz w jakim stanie był twój główny program w momencie wystąpienia przerwania. Przykładowo wątek główny  jest w połowie zmiany jakiejś zmiennej, która używana jest także w przerwaniu. To oczywiście wywoła trudne do przewidzenia skutki. Twój przypadek jest akurat prosty i powinno się dać łatwo ograniczyć ryzyko takich problemów. Najlepiej pomyśleć o zupełnym wyłączeniu timera (a co za tym idzie przerwania) jeśli nic nie jest wysyłane. Czyli uzupełniamy zmienne wejściowe i włączamy dopiero timer. Potem aż do końca wysyłanie nie ruszamy tych zmiennych używanych w przerwaniu. Czasami w pewnych sytuacjach wyłącza się przerwania (cli) na jakiś krótki czas, kiedy robimy coś co nie może być przerwane. Kolejna rzecz to kwestia optymalizacji stosowanych przez kompilator. Poczytaj o przełączniku `volatile`. To co jest coś co wyłącza dla danej zmiennej niektóre optymalizacje, które będą używane także z przerwań. Nie wiem jednak jak to wygląda w przypadku obiektów. Można pewno zastosować do samego obiektu, można także do niektórych jego własności.

Na razie tyle żeby już nie mieszać.

 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...