Witam.
Natrafiłem dziś na problem z przerwaniem. Mianowicie mam DS18B20, LCD, UART i timery. Program wygląda tak, że temperatura z DSa jest wyświetlana na LCD, wszystko gra. Mam też przerwanie, w którym co sekundę wysyłane jest 6 bajtów do kompa (przez UART). Przerwanie jest od Timera co 1 sekundę. Wszystko gra do czasu. W pewnym momencie program sie "wywala", nie chodzi pomiar temp.i LCD. Wg mnie przyczyną jest to, że w czasie np zapisu do 1-wire występuje to przerwanie, jest wykonywane (wysylanie 6 bajtow do UARTa troche trwa) i jest powrót do 1-wire. Ale wtedy już czas np zapisu na 1-wire upłynął i program czeka w pętli na daną która nigdy nie nadejdzie. Oczywiście przerwanie cały czas jest wywoływane (co 1 sekundę), ale reszta programu już wisi.
Jakie macie pomysły na takie problemy? W skrócie problem polega na tym, że wykonując jakiś kod wyskoczy przerwanie, ale po jego powrocie zewnętrzne urządzenie już nie odpowie z powodu przekroczenia czasu, który "zabrał" kod przerwania. Wtedy program wisi na pętli sprawdzającej odpowiedź.
Mam dwa pomysły.
Jednym jest nie wykonywanie kodu (czasochłonnego) w przerwaniu, a np ustawienie jakiegoś znacznika i szybki powrót do programu głównego. Oszczędzi to czas, ale i tak upływa ileś tam us na to przerwanie. Minus to sprawdzanie cały czas flagi i ewentualne wykonanie tego co miało być w przerwaniu w zwykłej funkcji, trochę bez sensu w przypadku długich kodów (sprawdzanie w main).
Inne to zablokowanie przerwań na czas wykonywania tych wrażliwych funkcji czasowych (jak obsługa 1wire). Minus to wstawianie wszędzie blokady (cli()) i zezwolenia (cei()) - kupa roboty przy dużym programie i jeśli funkcja długo czeka to zablokowanie przerwań może powodować przepadnięcie kilku wystąpień przerwania (np zablokowanie przerwania na 2 sekundy powoduje przepadnięcie jednego wykonania przerwania). Do tego - czy jeżeli w czasie blokady przerwań wystąpi jakieś przerwanie to po ich odblokowaniu jest ono wykonywane czy przepada? Co jeśli w czasie blokady wystąpią 2 zgłoszenia przerwania?
Natrafiłem dziś na problem z przerwaniem. Mianowicie mam DS18B20, LCD, UART i timery. Program wygląda tak, że temperatura z DSa jest wyświetlana na LCD, wszystko gra. Mam też przerwanie, w którym co sekundę wysyłane jest 6 bajtów do kompa (przez UART). Przerwanie jest od Timera co 1 sekundę. Wszystko gra do czasu. W pewnym momencie program sie "wywala", nie chodzi pomiar temp.i LCD. Wg mnie przyczyną jest to, że w czasie np zapisu do 1-wire występuje to przerwanie, jest wykonywane (wysylanie 6 bajtow do UARTa troche trwa) i jest powrót do 1-wire. Ale wtedy już czas np zapisu na 1-wire upłynął i program czeka w pętli na daną która nigdy nie nadejdzie. Oczywiście przerwanie cały czas jest wywoływane (co 1 sekundę), ale reszta programu już wisi.
Jakie macie pomysły na takie problemy? W skrócie problem polega na tym, że wykonując jakiś kod wyskoczy przerwanie, ale po jego powrocie zewnętrzne urządzenie już nie odpowie z powodu przekroczenia czasu, który "zabrał" kod przerwania. Wtedy program wisi na pętli sprawdzającej odpowiedź.
Mam dwa pomysły.
Jednym jest nie wykonywanie kodu (czasochłonnego) w przerwaniu, a np ustawienie jakiegoś znacznika i szybki powrót do programu głównego. Oszczędzi to czas, ale i tak upływa ileś tam us na to przerwanie. Minus to sprawdzanie cały czas flagi i ewentualne wykonanie tego co miało być w przerwaniu w zwykłej funkcji, trochę bez sensu w przypadku długich kodów (sprawdzanie w main).
Inne to zablokowanie przerwań na czas wykonywania tych wrażliwych funkcji czasowych (jak obsługa 1wire). Minus to wstawianie wszędzie blokady (cli()) i zezwolenia (cei()) - kupa roboty przy dużym programie i jeśli funkcja długo czeka to zablokowanie przerwań może powodować przepadnięcie kilku wystąpień przerwania (np zablokowanie przerwania na 2 sekundy powoduje przepadnięcie jednego wykonania przerwania). Do tego - czy jeżeli w czasie blokady przerwań wystąpi jakieś przerwanie to po ich odblokowaniu jest ono wykonywane czy przepada? Co jeśli w czasie blokady wystąpią 2 zgłoszenia przerwania?