Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 26 sty 2026, o 07:49


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 13 maja 2014, o 22:22 
Offline
Nowy

Dołączył(a): 28 kwi 2014
Posty: 19
Lokalizacja: Katowice
Pomógł: 0

Witam

Mam funkcję obsługi Timera0

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Jaką wartość ma zmienna cnt w punkcie 3. za pierwszym razem, drugim, trzecim itd
Czy nie ustawia za każdym razem na 0.?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 22:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 27 maja 2013
Posty: 562
Lokalizacja: Bydgoszcz
Pomógł: 23

Ona jest startowo ustawiona na wartość 0. Potem się zwiększa i zeruje w obiegu pętli.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 22:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 maja 2013
Posty: 41
Lokalizacja: Zielona Góra
Pomógł: 1

Zauważ że zmienna jest
Kod:
STATIC
a to znaczy że została tylko raz zadeklarowana i siedzi gdzieś tam w RAM'ie. Tak więc nie jest za każdym razem ustawiana na 0. Można powiedzieć że program sprawdza, aha to jest zmienna statyczna, sprawdza czy jest w pamięci jeżeli tak to zostawia ją w spokoju. Za to po każdym cyknięciu timera jest ona zwiększana o 1 przez inkrementacje ;)


Jeżeli się mylę to niech ktoś mądrzejszy mnie poprawi :)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 22:37 
Offline
Nowy

Dołączył(a): 28 kwi 2014
Posty: 19
Lokalizacja: Katowice
Pomógł: 0

Czyli moglibyśmy to wywalić
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i umieścić gdzie na początku funkcji main



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 22:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 maja 2013
Posty: 41
Lokalizacja: Zielona Góra
Pomógł: 1

Nie, nie powiem Ci dokładnie dlaczego ale wtedy w przerwaniu nie będziesz mógł korzystać z tej zmiennej (chyba).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 23:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Oczywiście, że nie można deklaracji tej zmiennej przerzucić do funkcji głównej main, ponieważ ograniczony zostanie do niej zasięg tylko dla main. Jedyne co można zrobić to umieścić ją poza wszelkimi funkcjami (zmienna globalna).
Dodam tylko, że w takim wypadku jeżeli nie korzystają z niej inne funkcje, a jedynie przerwanie to można pominąć modyfikator volatile.

Ogólnie tak jak mój przedmówca powiedział zmienna jest inicjalizowana tylko przy pierwszym wywołaniu funkcji. Każde kolejne odwołanie powoduje jej inkrementację (w tym przypadku). W ten sposób zmienna zachowuje się jak globalna, ale jej zasięg ogranicza się tylko to funkcji obsługującej przerwanie.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 23:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

O Atnel mnie ubiegł :P

Moim zdaniem koledzy pomieszali dwie rzeczy.

Zmienna określana jako STATIC jest trzymana w obszarze zmiennych globalnych.
Dzięki temu zachowuje swoją wartość po wyskoczeniu z funkcji.

Zmienne, w obrębie funkcji, nie posiadające spec. STATIC "żyją" tylko tyle i "żyje" funkcja. Po wykonaniu funkcji są usuwane ze stosu. Po ponownym uruchomieniu funkcji są tworzone od nowa. Czyli jeśli chcemy by zmienna występująca tylko w funkcji zachowała swoją wartość pomiędzy wykonaniami tej funkcji, musi być rodzaju STATIC.

Czym innym jest globalna zmienna używana w programie i w przerwaniu. Wtedy musi być on rodzaju VOLATILE. Aby jej wartość była dostępna zarówno w przerwaniu jak i w programie głównym. Chodzi o to aby kompilator nie dokonał na niej optymalizacji polegającej na zapisaniu jej do rejestru procesora.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 23:19 
Offline
Nowy

Dołączył(a): 28 kwi 2014
Posty: 19
Lokalizacja: Katowice
Pomógł: 0

Dziękuje za pomoc.

Pozdrawiam;



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO