Image153

Image153



■ Programowanie

ABC... C

Zmienne lokalne

Do tej pory wykorzystywaliśmy zmienne globalne. Jak pamiętasz, tworzyło sieje na samym początku pliku programu - poza jakimkolwiek ciałem funkcji. Często zdarza się jednak, żc jakiejś zmiennej potrzebujemy tylko na chwilę i tylko w jednej funkcji. Do takich celów zostały stworzone właśnie zmienne lokalne.

Tworzenie

Zmicnmi lokalną tworzy się dokładnie tak samo jak zmienną globalną. Możemy w tym celu korzystać ze wszystkich dostępnych typów. Różnica polega na miejscu deklaracji. Zmienną lokalną tworzymy zaraz po otwarciu klamry. Jeszcze zanim pojawi się jakakolwiek instrukcja.

CCC umożliwia stworzenie zmiennej lokalnej w dowolnym miejscu bloku*, nie tyłku nu jego początku. Jest to właściwość zaczerpnięta z języka C++. Jej wykorzystanie jest wygodne, jednnk trzeba liczyć się z mniejszą przenośnością kodu.

Inicjacja

Jeśli nie nadano wartości zmiennej lokalnej, jej wartość początkowa jest nieokreślona (przypadkowa). Jest to istotna różnica w stosunku do zmiennych globalnych, które w takim przypadku są automatycznie zerowane przy starcie programu.


WyswietlDECę.a if(l(owp:N & l«3w:))

{

g bDelay ■ 6; //'SOm^

wFile(q_bDelay 1= 0) {} if(l(swpin 4 i«swi))

{

ulnta_t a » 100;

—a;


Zmienna lokalna, która [_ ciała pętli for. Przy dcklaruc i zmiennej m.ejscu przy każdym ponownym przebiciu pęt.i zmienna jest na nowo inicjowana wartością 1!


KyawiotlDEC(a)

// Oczekiwanie na puszczenie whi1e(l(swPTN 4 1«SW1))

(

}


, Dostęp do zmiennej a zdcklsru-■----y wancj bliżej wywołania


if(l(3WPlN & 1«3W2))

<

g hr#»lay m 6; //5C«n? wFile(g_bDelay !■ 0} {> 1f(l(SWPIN 4 l«SW2j)

++a;

g_bueiay ® 120; //ls


W tym miejscu nic nui dostępu Ut> "m zmiennej a. Tamten blok zpatal juz u więc zmienna "niebieski" praktycznie ruc ' Zmieniana jest wartość zmiennej w pęt li foi


wfiiledCswpiN 4 l«sw2)) {

}


Zasięg zmiennej lokalnej

Zmienna, która zostanie utworzona w danym bloku", będzie dostępna tylko i wyłącznie w jego wnętrzu. Uważaj tutaj na nazwy. Nie jest błędem stworzenie zmiennej lokalnej o nazwie takiej samej jak, na przykład, zmienna globalna. Jednak uniemożliwi do dostęp do wyższej” zmiennej. Między innymi dlatego zaleca się stosowanie przedrostka g_ przed zmiennymi globalnymi.


Jeśli chcesz zobaczyć, jak zachowują się zmienne lokalne, spróbuj zmienić kod pętli głównej na przedstawiony w obrazku w tej ramce. Zobacz, co się stanie, jeśli „czerwoną” zmienną a przeniesiesz przed instrukcję for.


* Blokiem nazywamy część kodu obJę;ą klamrami.


Listing 16 Pozornie prostszy sposób dostępu do zmiennej typu wlatile.

if(g_bDelay > 0)

9_bDelay;


Jak to robi GCC

Co to są tak naprawdę zmienno lokalna?

Kiedy zdefiniujesz jakąś zmienną lokalną, zostanie ona umieszczona w jednym lub większej liczbie z 32 rejestrów obliczeniowych mikrokontrolera. Gdy rejestrów jest za mało lub tworzona jest zmienna typu tablicowego - zostanie ona umieszczona na wierzchołku stosu. Jeśli to konieczne, wartość wykorzystywanego rejestru zostanie wcześniej zapisana na stosie i odtworzona z chwilą gdy przestaniesz używać zmiennej. GCC wykorzystuje rejestry bardzo inteligentnie Jeśli na przykład kompilator „zauważy”, że jedna zmienna lokalna nie jest już używana, natomiast zaczynamy używać innej, może ona skorzystać z tego samego rejestru.

Gdy dana funkcja się kończy, rejestry zostaną zwykle zamazane inną wartością To wyjaśnia wszelkie ewentualne wątpliwości na temat, czy nic da się jakąś sztuczką dostać z zewnątrz do zmiennych lokalnych funkcji...


Generowanie opóźnień

Do generowania opóźnień wykorzystywana jest zmienna gJbDelay. Sztuczka polega na tym, że jeśli znajduje się w niej wartość różna od 0. jest ona zmniejszana w przerwaniu obsługi wyświetlacza. Zmniejszanie odbywa się z częstotliwością 122Hz. Aby uzystać na przykład opóźnienie równe jednej sekundzie, należy wpisać do gJbDelay wartość 122, a następnie odczekać, aż jej wartość spadnie do 0.

W punkcie O odbywa się deklaracja wspomnianej zmiennej. Informację co oznacza pojawiające się tutaj słówko volatile. znajdziesz w jednej ze wspomnianych na początku ramek. Zastanowienie może budzić sposób obsługi wspomnianej zmiennej w punkcie <Q . Wydawać by się mogło, że dostęp, realizowany jak to zostało przedstawione na listingu 16. będzie wymagał mniej działań ze strony procesora. Jednak w przypadku zmiennej typu volati)e nie jest to prawdą. Związane jest to z tym, że zabraniamy kompilatorowi optymalizacji dostępu do zmiennej gJbDelay. W przypadku jak na listingu 16, w pierwszej linii wartość zmiennej gJbDelay zostanie wczytana z pamięci do rejestru, następnie będzie porównana z wartością 0. Jednak już w drugiej linii konipilatoi musi założyć, że w tym czasie jej wartość mogła się zmienić. Tak więc przed zmniejszeniem jej wartości zostanie ona ponownie wczytana.

Ponieważ zmienna lokalna będzie przechowywana cały czas w rejestrze, przy zastosowaniu sztuczki jak na listingu 15, oszczędzimy jednego, zbędnego nam wczytania z pamięci RAM. Nie jest to wiele, jednak warto pamiętać o tej sztuczce, jeśli będziemy chcieli wykonać bardziej rozbudowany ciąg działań na zmiennej tego typu, w czasie którego nic interesuje nas, czy wartość zmiennej ulegnie zmianie albo nawet mamy pewność, że w tym miejscu zmiana laka jest niemożliwa.

Obsługa klawiatury

W celu obsługi klawiatury, na początku kodu do definicji wyprowadzeń zostały dodane linie nadające symboliczne oznaczenia wyprowadzeniom przycisków. Podczas inicjacji włączane jest wewnętrzne podciąganie wejść przełączników do dodatniego bieguna zasilania. Zauważ, że nie ma tutaj jawnej konfiguracji jako wejścia odpowiednich wyprowadzeń portu. W tym przypadku możemy oprzeć się na prostej zasadzie, że i tak wszystko, czego nie zdefiniujemy jako wyjście, będzie wejściem.

Miejsce na obsługę klawiatury znalazło się w pętli głównej. Znajdziesz tutaj dwie symetryczne części: każdą służącą do obsługi innego klawusza. Ze względu na symetrię omów ię tylko jedną z nich. Przydatne informacje na

40 Wrzesień2005 Elektronika dla Wszystkich


Wyszukiwarka

Podobne podstrony:
26 (683) begin Suma Suma+I; Write (Suma,  end; Writeln; Readln; end. Do tej pory wykorzystywal
CCF20090120100 STOSOWANIE METOD PRZYBLIŻONYCH Być imoże, Czytelnik nie zwrócił do tej pory uwagi na
46038 Slajd7 (28) Różnice między lokalnym i zdalnym wywołaniem procedury Wykorzystanie zmiennych glo
A.    Edytować można każdy rok wprowadzony do tej pory do programu oraz wybierać z
Zrozumiec Assembler4 viiiUwaga dla ludzi, którzy nigdy do tej pory nie programowali Książka ta jest
Dlaczego w pełni nie wykorzystujemy mózgu W obliczu przedstawionych do tej pory faktów, nie powinno
CCF20110301005 156 DANUTA KRZYŻYK wej są mało skuteczne, a obowiązujące do tej pory założenia progr
Image37 (5) Programowanie ■ Programowanie ■ sób jak do tej pory: COMPORT &=
CCF20110301005 156 DANUTA KRZYŻYK wej są mato skuteczne, a obowiązujące do tej pory założenia progr
złom ZŁOM Szacuje się, ze o<oło 75% z ponad miliarda ton wyprodukowanego do tej pory aluminium&nb
img06201 djvu mulę pisemną. Dlatego nie znał do tej pory i nie rozumiał znaków dodawania, odejmowan
img159 159 11.1. Analiza syntaktyczna drzew EDT Zwróćmy jeszcze uwagę na dwa ograniczenia, które do

więcej podobnych podstron