• Email
  • Forum
[Rozmiar: 25078 bajtów]

Krok w stronę optymalizacji obsługi przerwań

Breaking news
------------------------------------------------------------------------

Nowa wersja omija zakomentowane fragmenty kodu/inne konfiguracje dla INT
Dodatkowo przed każdą instrukcją asm dodano " ! "
Jeśli jesteś posiadaczem poprzedniej wersji to napisz bo może kogoś przeoczyłem

[Rozmiar: 35946 bajtów]

-------------------------------------------------------------------------------

Kiedy program przechodzi do obsługi przerwania, najprawdopodobniej do wykonania zadań będzie potrzebował którychś z rejestrów R0 - R31.
Rejestry te są używane także w programie głównym więc żeby zachować ich wartości musi je zapisać.
Zapisuje je, i kiedy kończy obsługę zadań w przerwaniu odnawia zapisy w rejestrach tymi zapisanymi wartościami.
Robi to po to, by móc podjąć prace znów od miejsca w którym musiał przerwać.
Kompilator Bascom bezpiecznie odkłada prawie wszystkie rejestry na stos i przed powrotem przywraca ich wartości.

Proszę sobie teraz wyobrazić przerwanie z szybkiego enkodera. Do odnotowania impulsu i kierunku nie potrzeba wielu rejestrów. Niestety Bascom będzie odkładał wszystkie za każdym razem i tak samo wszystkie będzie przywracał.

Mikrokontroler więcej czasu poświęci na prace nad rejestrami niż potrzeba na właściwą obsługę przerwania.

[Rozmiar: 375937 bajtów]

Pomocny może być NoSave Tool

Bascom pozostawia programiście możliwość przejęcia kontroli nad tym które rejestry zachować.
Program NoSave Tool pokazuje które rejestry zostały użyte podczas obsługi przerwania i wspomaga pracę nad oprogramowaniem.
Szybko i wygodnie możemy bardzo przyspieszyć nasze programy.
Powiedziałbym, że poszerzają się możliwości.


Możemy usprawnić częste przerwania
-z enkoderów
-multipleksowania wyświetlaczy
-do minimum skrócić obsługę Timerów
i wiele więcej..

Poniższy zrzut ekranu pokazuje o ile może skrócić się czas reakcji na opadające zbocze kiedy użyjemy NoSave Tool

[Rozmiar: 57975 bajtów]

Niektórzy programiści potrafią śledzić użyte rejestry ładując plik OBJ do debugera, na przykład wbudowanego w Atmel Studio, jednak śledzenie rejestrów może być pracochłonne, ponieważ nie wszystkie instrukcje są wykonywane "na miejscu" w przerwaniu.

Kiedy, na przykład, używamy funkcji Rotate, Shift, albo Incr dla zmiennych Dword, wykonany zostanie skok do osobnej procedury która tez używa rejestrów.
Trzeba wiec zliczać je wszystkie. Łatwo o przeoczenie któregoś..

NoSave Tool robi to automatycznie




Poniższy zrzut ekranu pokazuje, że do obsługi przerwań niepotrzebnie zachowywane są wszystkie rejestry

[Rozmiar: 33164 bajtów]

Po dodaniu do kodu parametru Nosave program pokazuje tylko faktycznie używane rejestry

[Rozmiar: 75295 bajtów]

Automatycznie generuje wstawki do kodu usprawniając pracę

[Rozmiar: 47769 bajtów]


Email

Jeśli mogę w czymś pomóc, napisz.