No ale nawet jeśli jest tak beznadziejny, że nie zrobi, to i tak pamięci to nie zajmie, bo x byłoby tworzone tymczasowo na stosie. Ale praktycznie nie ma szans na to, aby x było utworzone poza rejestrami. Z prostej przyczyny - analizując kod wynika z niego, że mamy jedno przesłanie z Timer do x, dekrementację x i przesłanie z powrotem do Timer. Nie ma szans, aby nawet najgłupszy kompilator próbował utworzyć x w pamięci. Tu paradoksalnie pomaga atrybut volatile dla zmiennej Timer, który wymusza, że jej przesłanie do x musi się odbyć z pamięci, a nie jej kopii w rejestrach. W efekcie musi zostać wygenerowany optymalny kod.
Zresztą zobacz na kod dla gcc z opcją -Os:
Zaloguj się, aby zobaczyć kod
A tu, wersja głupiego kompilatora (wyłączona optymalizacja -O0):
Zaloguj się, aby zobaczyć kod
Jak widać w drugim przypadku x zostało umieszczone na stosie i następują niepotrzebne operacje przesłań - ale poza stratą czasu mamy zajęte tylko 4 bajty.
Ale już dla optymalizacji -O1 mamy znowu idealny kod:
Zaloguj się, aby zobaczyć kod
Dodano po 5 [minuty]: janbernat napisał:
Jak się pozbyć tego _delay() nie tracąć tego dwusekundowego wyświetlania i czy jest możliwość użycia do tego Timer0 skoro jest już używany?
Oczywiście, że jest. Jak rozumiem problem leży w tym, że na chwilę mignie ci to co chcesz i jest ponownie wyświetlane menu? Jeśli tak, t dzieje się to dlatego, że wracając z funkcji powodujesz przerysowanie menu. Aby tego uniknąć musisz zmodyfikować samo menu - tak, aby wprowadzić jakąś blokadę przerysowywania na interesujący cię czas. Czyli swoją funkcję masz ok, zmień kod samego menu.