w1941s napisał: Chodzi o to, że zmienna volatile cały czas odczytywana jest z pamięci i ładowana do rejestru a zmienna bez volatile, ładowana jest tylko raz? Czy dobrze myślę?
Dobrze myślisz.
Ogólnie zmienna globalna
volatile ma sens w sytuacji, gdy ze zmiennej korzystasz jednocześnie w programie głównym i w procedurze obsługi przerwania. W Twoim przypadku, gdy korzystasz ze zmiennej tylko wewnątrz procedury obsługi przerwania,
volatile jest niepotrzebne. Mało tego, w takim przypadku zawsze lepiej (bezpieczniej) jest zastosować zmienną statyczną (czyli taką, która nie zmienia wartości pomiędzy wywołaniami funkcji) wewnątrz procedury.
Jeśli nawet musisz zastosować
volatile, to jest ono istotne bardziej z punktu widzenia programu głównego, ponieważ w nieprzewidywalnym momencie może wystąpić przerwanie i zmienić wartość zmiennej (w przypadku zmiennych wielobajtowych należy dodatkowo zapewnić
atomowy dostęp do zmiennej).
Z punktu widzenia procedury obsługi przerwania natomiast,
volatile zwykle nie jest już takie istotne, ponieważ przeważnie zezwolenie na przerwania w czasie wykonywania procedury jest wyłączone, więc nieoczekiwana zmiana wartości zmiennej jest niemożliwa. Jeśli wewnątrz procedury kilkakrotnie trzeba korzystać ze zmiennej
volatile, korzystniej jest załadować ją raz i korzystać z jej kopii. Pozwala to zaoszczędzić kilka taktów na każde odwołanie do zmiennej (razy ilość odwołań) i czasami znacząco skrócić czas wykonywania procedury. Jest to szczególnie istotne w sytuacjach, kiedy stosunek czasu pomiędzy wywołaniami przerwania a czasem wykonania procedury jest duży.
Z grubsza licząc procedura obsługi przerwania trwająca 120 taktów wywoływana co 160 taktów konsumuje ok. 75% czasu procesora. Zaoszczędzenie nawet 20-30 taktów w tej sytuacji może okazać się kluczowe dla poprawnego działania programu, szczególnie jeśli chcemy korzystać także z innych przerwań.