Procedura obliczenia() musi być wykonana po każdym przepełnieniu timera i tylko po przepełnieniu timera (musi się wykonać dokładnie tyle samo razy ile razy wystąpiło przerwanie timera). Wymagana jest też w szybka reakcja na inne przerwania - szybsza niż trwają obliczenia()
Prawie dobre rozwiązanie nr 1(pseudokod):
Powyższe będzie działać, chyba że wydarzy się czarny scenariusz:
1. procesor zostanie wybudzony przez inne niż timer przerwanie
2. if(timer_flag) będzie niespełniony więc obliczenia() się nie wykonają
3. w miejscu zaznaczonym komentarzem pojawi się przerwanie od timera
4. procesor więc pójdzie spać, obliczenia() nie zostaną wykonane
Wiem że prawdopodobieństwo wystąpienia tej sytuacji jest małe i prawdopodobnie to nigdy się nie zdarzy. Wolałbym jednak mieć pewność
Rozwiązanie nr 2, z użyciem zagnieżdżonych przerwań:
Wady:
- zagnieżdżone przerwania to zło. Chociaż w tym przypadku mam mieszane uczucia, obliczenia() + obsługa ewentualnych innych przerwań spokojnie wyrobi się przed wystąpieniem kolejnego przepełnienia timera)
- wszystkie zmienne na których działa obliczenia() trzeba będzie zadeklarować jako volatile
Rozwiązanie nr 3, z sekcją krytyczną:
Według dokumentacji avr libc użycie konstrukcji z wykorzystaniem sleep_enable() gwarantuje wykonanie instrukcji po sei() zanim zostanie uruchomiona obsługa przerwania, więc to powinno działać.
Wady:
- nie jestem całkowicie pewien poprawności tego rozwiązania, i nie mam sposobu żeby je przetestować
Proszę wytknięcie błędów, opinie który sposób uważacie za lepszy, może lepszy pomysł na rozwiązanie problemu?
Prawie dobre rozwiązanie nr 1(pseudokod):
Kod: C / C++
Powyższe będzie działać, chyba że wydarzy się czarny scenariusz:
1. procesor zostanie wybudzony przez inne niż timer przerwanie
2. if(timer_flag) będzie niespełniony więc obliczenia() się nie wykonają
3. w miejscu zaznaczonym komentarzem pojawi się przerwanie od timera
4. procesor więc pójdzie spać, obliczenia() nie zostaną wykonane
Wiem że prawdopodobieństwo wystąpienia tej sytuacji jest małe i prawdopodobnie to nigdy się nie zdarzy. Wolałbym jednak mieć pewność
Rozwiązanie nr 2, z użyciem zagnieżdżonych przerwań:
Kod: C / C++
Wady:
- zagnieżdżone przerwania to zło. Chociaż w tym przypadku mam mieszane uczucia, obliczenia() + obsługa ewentualnych innych przerwań spokojnie wyrobi się przed wystąpieniem kolejnego przepełnienia timera)
- wszystkie zmienne na których działa obliczenia() trzeba będzie zadeklarować jako volatile
Rozwiązanie nr 3, z sekcją krytyczną:
Kod: C / C++
Według dokumentacji avr libc użycie konstrukcji z wykorzystaniem sleep_enable() gwarantuje wykonanie instrukcji po sei() zanim zostanie uruchomiona obsługa przerwania, więc to powinno działać.
Wady:
- nie jestem całkowicie pewien poprawności tego rozwiązania, i nie mam sposobu żeby je przetestować
Proszę wytknięcie błędów, opinie który sposób uważacie za lepszy, może lepszy pomysł na rozwiązanie problemu?