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



Teraz jest 3 kwi 2026, o 06:13


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 40 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
PostNapisane: 21 maja 2014, o 22:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

Witam.
Napisałem tak dla własnego sprawdzenia bibliotekę do obsługi UART opartej o przerwania. Jest to właściwie biblioteka taka jak w Blue Book-u , ale postanowiłem w funkcji do wysyłania znaku oraz w obsłudze przerwania do odbioru znaku usunąć dodatkową zmienną tmp_head .

tutaj właśnie się zaczął mój problem okazało się że np. gdy wysyłałem jakiś dłuższy string
to na terminalu pojawiały się np. dwie pierwsze literki słowa, długo
nad tym myślałem i nie mam pojęcia dlaczego tak się dzieje. Jakie mają
znaczenie te zmienne ? Prosiłbym o wytłumaczenie o co chodzi. (Oczywiście gdy potem przywróciłem te zmienne problem ustąpił), a i jeszcze jedno gdy zwiększyłem rozmiar buforu problem ustępował, ale tylko pozornie kwestia ile znaków chciałem wysłać.


problem dotyczy funkcji ( send_data oraz obsługi przerwania ISR( USART_RXC_vect ) )

Oto kod

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

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



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

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

Ale to mi nadal nie wyjaśnia dlaczego usunięcie zmiennej wpływa na działanie programu, a tak przy okazji po co używasz przy funkcjach słowa extern ?



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

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

extern daje się w deklaracji funkcji, gdy jej zawartość nie będzie widziana (kompilowana) przez kompilator z danym plikiem. Kompilator zakłada wtedy że wywołanie funkcji będzie zgodne z podaną definicją i znajdzie się ona w innym pliku. Jak jej nie będzie to kompilator nigdy nie zgłosi błędu. Zrobi to dopiero linker, który będzie chciał zlinkować skompilowane pliki do pliku wynikowego i nie znajdzie w żadnym podanej funkcji.

--
Pozdrawiam,
Robert


Autor postu otrzymał pochwałę


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

Dołączył(a): 22 gru 2013
Posty: 296
Lokalizacja: Szczecin
Pomógł: 47

Przeglądnij w BB omówienie zmiennych, a problem sam się wyjaśni.
Zmienna lokalna tmp_head w przerwaniu zostanie umieszczona przez kompilator np. w rejestrze ( tu trzeba doczytać dokładniej) i będzie to szybsza obsługa niż zmiennej typu volatile ( co ma znaczenie w szybkości obsługi przerwania).
Wyciąłeś w przerwaniu odbiorczym sprawdzanie nadpisania bufora i dla dłuższych stringów mogą się pojawić powtórzenia znaków.


Autor postu otrzymał pochwałę


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

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

krish, tak właśnie myślałem że o to chodzi, ale wydawało mi się że szybsze będzie unikanie dodatkowego przepisywania zmiennej dobra nieważne co mi się wydawało :) w każdym razie dzięki za odpowiedz.... a właśnie czy w funkcji wysyłającej znak send_data() również o to chodzi ??? Bo to właśnie z nią miałem problemy gdy chciałem wysłać dłuższy string i jeszcze jedno pytanko Dlaczego w takim razie dodatkowe zmienne nie sa używane w obsłudze przerwania nadawczego oraz w funkcji odbierającej znak ???

------------------------ [ Dodano po: 25 minutach ]

rskup, a ja zwykle widzę w bibliotekach Mirka że do funkcji to chyba wogóle nie używa słowa extern, a jedynie do zmiennych więc dlaczego tu sie używa, a tu nie i kiedy należy użyć, a kiedy nie ? co nam daje to słowo extern ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 maja 2014, o 22:12 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

rajmund96 napisał(a):
a tu nie i kiedy należy użyć, a kiedy nie ? co nam daje to słowo extern ?


ale masz to DOKŁADNIE opisane w BB

- tylko jak kolega wyżej pisał, poczytaj i postaraj się przede wszystkim zrozumieć co to jest i czym się różni DEFINICJA od DEKLARACJI zmiennej, wałkuję to w książce wiele razy - tłumacząc, że to KLUCZ do zrozumienia mnóstwa rzeczy w C ... bo kto tego nie załapie - to wciąż będzie miał takie pytania ...

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



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

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

W zwykłym projekcie extern ma zastosowanie do zmiennych. Przy funkcjach jest konieczność wykorzystania tylko gdy ich autor dostarczył skompilowaną bibliotekę (plik z rozszerzeniem .a). Przy dostępnym kodzie źródłowym nie ma sensu tego robić.

Najprościej zapamiętać sobie, że extern to jest powiedzenie kompilatorowi, że taka funkcja / zmienna będzie istniała i możesz z niej bezpiecznie korzystać zgodnie z informacją po extern, i nie interesować się jej brakiem. O to by była poprawnie dowiązana zatroszczy się linker.

--
Pozdrawiam,
Robert


Autor postu otrzymał pochwałę


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

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

mokrowski dzięki za odpowiedz :), ale dlaczego w takim razie dodatkowe zmienne nie są używane w funkcji odbierającej znak oraz w obsłudze przerwania nadawczego ??
( w bibliotece Mirka nie było tych zmiennych )

------------------------ [ Dodano po: 36 minutach ]

Mirku wiem czym się różni deklaracja od definicji, ale dalej nie do końca rozumiem dlaczego w deklaracjach zmiennych używa się słowa extern, a w deklaracjach funkcji bardzo rzadko. Z tego co zrozumiałem co wcześniej koledzy pisali że extern przy funkcjach używa się wtedy gdy mamy skompilowaną gotowa bibliotekę, a jak mamy dostęp do kodu czyli np. sami piszemy tą bibliotekę to potem w pliku nagłówkowym nie musimy dodawać extern, ale w przypadku deklaracji zmiennych w pliku nagłówkowym zawsze używamy extern dlaczego ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 maja 2014, o 10:30 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

rajmund96 napisał(a):
ale dalej nie do końca rozumiem dlaczego w deklaracjach zmiennych używa się słowa extern, a w deklaracjach funkcji bardzo rzadko.


wcale nie rzadko albo mniej rzadko itp ..... ot słówko extern przy funkcjach w plikach nagłówkowych jest po prostu NIEKONIECZNIE POTRZEBNE i można go w ogóle nie używać.

Ale już jeśli chodzi o zmienne - to POZBYCIE się specyfikatora "extern" .... spowoduje panie, tragedię ponieważ NAGLE zmienisz DEKLARACJĘ w DEFINICJĘ i dlatego pozwalam sobie pisać wyżej, że nie do końca jeszcze rozumiesz różnicę pomiędzy DEKLARACJĄ a DEFINICJĄ zmiennych.

rajmund96 napisał(a):
Z tego co zrozumiałem co wcześniej koledzy pisali że extern przy funkcjach używa się wtedy gdy mamy skompilowaną gotowa bibliotekę, a jak mamy dostęp do kodu czyli np. sami piszemy tą bibliotekę to potem w pliku nagłówkowym nie musimy dodawać extern,


Na tym etapie nauki pozostaw na razie rozważania na temat kompilacji prawdziwych bibliotek w C, gdzieś z tyłu, bo to mało istotne dla zrozumienia na początku różnic pomiędzy deklaracją a definicją funkcji. Tak jak pisałem PROSTO w książce, jeśli chodzi o funkcję to :

1. KAŻDY zapis samego nagłówka funkcji (bez jej ciała) to jest jej DEKLARACJA (nagłówek. header - jak zwał tak zwał) i to je powinniśmy umieszczać w plikach *.h (wyjątkiem są funkcje inline'owe) (specyfikator extern można spokojnie więc pomijać nic się nie stanie i tak samo nic się nie stanie gdy go podamy - żadna różnica .... dlatego w kodach niektórych ludzi widzisz extern w plikach *.h a w kodach innych ludzi nie widzisz .... ale chyba już wiesz teraz raz na zawsze dlaczego tak jest .... i sam wybierzesz sposób jaki ty będziesz pisał

2. KAŻDY zapis funkcji wraz z jej ciałem to jest jej DEFINICJA i umieszczamy TYLKO w plikach *.c

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

Inaczej jest z DEKLARACJAMI zmiennych bo tu (jak wyjaśniałem wyżej) .... specyfikator EXTERN jest bezwzględnie wymagany, inaczej będzie to DEFINICJA zmiennej i to jeszcze o zgrozo np w pliku *.h czego się NIGDY nie robi w C

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

już inaczej nie potrafię tego doprecyzować


Autor postu otrzymał pochwałę

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 maja 2014, o 10:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

I wszystko stało się jasne wielkie dzięki Mirku. Ty to jednak potrafisz wytłumaczyć :)

------------------------ [ Dodano po: 4 minutach ]

Mirku a mógłbyś jeszcze wytłumaczyć dlaczego w swojej bibliotece do obsługi UART dodatkowe zmienne tzn. tmp_head użyłeś tylko do funkcji wysyłającej znak oraz do obsługi przerwania odbiorczego, a w przypadku funkcji odbierającej znak nie użyłeś dodatkowej zmiennej i w przerwaniu nadawczym też jej nie użyłeś dlaczego ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 maja 2014, o 11:18 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

rajmund96 napisał(a):
Mirku a mógłbyś jeszcze wytłumaczyć dlaczego w swojej bibliotece do obsługi UART dodatkowe zmienne tzn. tmp_head użyłeś tylko do funkcji wysyłającej znak oraz do obsługi przerwania odbiorczego, a w przypadku funkcji odbierającej znak nie użyłeś dodatkowej zmiennej i w przerwaniu nadawczym też jej nie użyłeś dlaczego ?


jak to nie użyłem jak użyłem .... No panie kolego ;) ... to po co niby tworzyłbym zmienne głowy i ogona węża zarówno dla nadawania jak i odbioru ?

Poczytaj ale DOKŁADNIE w Bluebooku - po kolei jeszcze raz rozdział o buforach cyklicznych - jak to działa ... to ważne

w przypadku NADWANIA masz przecież użycie głowy węża w funkcji

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


więc dlaczego mówisz że przy nadawaniu nie ma ? hmmm ?

tak samo w przypadku przerwania NADAWCZEGO ISR( USART_UDRE_vect) , też jest użycie UART_TxHead

więc nie za bardzo wiem o czym mówisz może

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 maja 2014, o 11:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

Nie chodzi mi o te zmienne z specyfikatorem volatile tylko o zmienne lokalne wewnątrz funkcji. Chodzi o to że dodatkowe zmienne lokalne używa Pan tylko w funkcji wysyłającej znak oraz w obsłudze przerwania odbierającego znak. Natomiast w przypadku funkcji odbierającej znak nie używa pan dodatkowej zmiennej lokalnej, podobnie w przerwaniu wysyłającym znak . O te zmienne właśnie mi chodzi :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 maja 2014, o 13:48 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

no ale weź się przypatrz na ten kod


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


oczywiście można to napisać na milion sposobów ale w tym przypadku - nie mogę nawet zrozumieć za bardzo dlaczego pytasz po co użyłem zmiennej lokalnej tmp_head ? :(

przecież z kodu widać że chcę ją RAZ mieć w zmiennej a później już nie obliczać tylko posługiwać się tą obliczoną wartością w kilku miejscach. Nie chcesz zmiennej lokalnej ? to nie rób - ale dwa razy w przerwaniu w takim akurat wypadku będziesz musiał ją wyliczać.... w sumie to nie problem.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 maja 2014, o 14:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

No właśnie jak wykasowałem zmienną tmp_head i wysyłałem dłuższe stringi na terminal to działy się dziwne rzeczy a konkretnie wyświetlały się dwie pierwsze literki danego słowa...
O tak jak w kodzie poniżej zrobiłem czyli bez zmiennej tmp_head . Próba wysłania dłuższego stringa kończyła się wyświetleniem dwóch literek i o to mi cały czas op początku tego wątku chodzi dlaczego tak się dzieje ?

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 maja 2014, o 21:10 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

No nic dodać nic ująć co do tego co napisał wyżej kolega mokrowski ....

a tym bardziej że próbowałem wyjaśnić po co ta zmienna lokalna - tymczasem kolega dalej swoje - "dlaczego nie działa gdy ją usunę"

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



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

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

No właśnie rozumiem jak działa bufor cykliczny oraz zmienne lokalne wiem że istnieją tylko w funkcji w której są powołane oraz że gdy funkcja skończy swoje działanie to one tez znikają chyba że właśnie opatrzymy je specyfikatorem static wtedy wartosć tych zmienny nie zostanie skasowana po zakończeni danej funkcji lecz będze zapamiętana, a volatile używamy po to aby procek nie operował dla tej zmiennej na rejestrach tzn. odwoływał się zawsze dla tej zmiennej do odpowiedniej komórki w pamięci RAM ponieważ może się zdarzyć, że gdy nastąpi przerwanie w której zostanie wywołana owa zmienna,
i zostaną wykonane operacje na innym rejestrze następnie wartość tej zmiennej zostanie zapisana w komórce pamięci RAM, a program główny który tylko za pierwszym razem wczytuje wartość tej zmiennej z pamięci RAM nie będzie wiedział że zmienna została zmodyfikowana i wiadomo co dalej.

mokrowski napisał(a):
rajmund96 myślę że większość pytań które stawiasz wynika z:
1. Braku zrozumienia działania bufora kołowego
2. Zrozumienia ,,lokalności" zmiennych i czasu ich życia.

Mi się wydaje że jednak to rozumiem, ale to nie zmienia faktu dlaczego usunięcie zmienne lokalnej w funkcji nadawczej wpływa na działanie programu. Dlaczego w takim razie w funkcji odbiorczej oraz w przerwaniu nadawczym NIE występuje dodatkowa zmienna lokalna np o nazwie analogicznie tmp_Tail .To było moje podstawowe pytanie i nie wiem dlaczego nie możecie mnie zrozumie.Może dla was jest to oczywistą oczywistością ale ja tego niestety nie rozumiem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 maja 2014, o 11:42 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

rajmund96 napisał(a):
To było moje podstawowe pytanie i nie wiem dlaczego nie możecie mnie zrozumie


Widzisz - gdyby to było takie proste - że gdy coś piszemy to inni od razu nas w lot rozumieją ..... to popatrz - nie byłoby np problemu ze zrozumieniem książki. Tymczasem autor napisał a ty nie możesz tego zrozumieć. To nie wstyd .... ale teraz postaw się w roli autora - to ty PISZESZ pytanie .... no coś piszesz.... i dziwisz się, albo może za chwilę zarzucisz wszystkim że nie chcą ci specjalnie pomóc kisząc dla siebie jakąś wiedzę.

Tymczasem powód jest prozaiczny - no nie możemy zrozumieć tego o co pytasz .... może jeszcze ktoś inny wpadnie, i akurat zaskoczy. To tak samo jak z czytelnikami - jedni zaskoczą od razu inni nie ....

więc ew postaraj się jeszcze doprecyzować swoje pytanie .... może to pomoże

bo ja wyżej mówiłem ci już dlaczego użyłem zmiennej tmp_head .... ale ty z kolei W OGÓLE się do tego nie odniosłeś ... i dziwisz się że np ja nie wiem tym bardziej o co ci chodzi ? .... tymczasem chyba nie można tu nikogo posądzić o brak chęci do pomocy ... bo jak widać po całym wątku kilka kwestii chyba już udało ci się wyjaśnić.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



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

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

Mirku to może tak zadam pytanie, tak mi się nasunęło na podstawie twojego postu wyjaśniającego właśnie po co jest zmienna tmp_Head
mirekk36 napisał(a):
przecież z kodu widać że chcę ją RAZ mieć w zmiennej a później już nie obliczać tylko posługiwać się tą obliczoną wartością w kilku miejscach. Nie chcesz zmiennej lokalnej ? to nie rób - ale dwa razy w przerwaniu w takim akurat wypadku będziesz musiał ją wyliczać.... w sumie to nie problem.
O i tu jest chyba mój problem dlaczego będę musiał ją dwa razy wyliczać ?
A nie wystarczy zrobić tak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i przecież też obliczam ją tylko raz ...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 maja 2014, o 16:29 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

jeszcze raz:

Obrazek

1. obliczam wartość tmp_head

2. używam jej pierwszy raz

3. używam jej dwukrotnie drugi raz

widzisz to ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



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

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

Tak to rozumiem, ale napisał Pan wcześniej że jak NIE będę używał zmiennej lokalnej to będę musiał dwa razy "coś" wyliczać rozumiem że chodziło o UART_RxHead ...
Ale przecież ją będę też tylko raz obliczał
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

o tak, a potem mogę jej użyć w warunku if oraz jako indeksu bufora prawda ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 maja 2014, o 17:26 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

rajmund96 napisał(a):
o tak, a potem mogę jej użyć w warunku if oraz jako indeksu bufora prawda ?


ale ja nie widzę co to za zmienna twoja Tx_Head ? :(

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



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

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

O czy mogę zrobić tak w funkcji wysyłającej znak :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


------------------------ [ Dodano po: 2 minutach ]

O moje zmienne typu volatile umieczczone na początku pliku w którym znajdują sie funkcje obsługujące UART
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
[



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 maja 2014, o 18:35 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

no i działa ci to ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



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

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

Działa, ale tylko dla krótkich stringów przy dłuższych tzn. troche dłuższych niż długość bufora nadawczego przestaje działaś tzn.na terminalu pokazują się tylko pierwsze dwie literki danego stringa

------------------------ [ Dodano po: 55 minutach ]

Huraaaaa :D wiem dlaczego to nie działa tak jak powinno. Nawet nie chodzi o to że zmienna ze specyfikatorem volatile działa wolniej.

Testowałem teraz ten program na różne sposoby z dodatkową zmienną lokalna czyli tak jak jest w Pana orginalnej bibliotece i odkryłem że gdy wystąpi zbyt WCZESNE zwiększenie wartości zmiennej Tx_Head co występuje właśnie gdy nie używamy dodatkowej zmiennej lokalnej, bo przecież bezpośrednio zwiększamy Tx_Head ( a jest to zmienna typu volatile czyli jej wartość zostaje zapisana w pamięci ram i każde odwołanie odnosi się do pamięci ram ) to przecież jeśli wysyłamy string to zmienna jest zapisywana wcześniej niż dane zostają przypisane do bufora. To z kolei oznacza że Jeśli w przerwaniu sprawdzamy warunek po pierwszym wysłanym znaku
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

to jeśli wartość Tx_Head zostanie zwiększona przy wysyłaniu kolejnego znaku , a flaga przerwania przecież sama się nie zeruje po wysłaniu znaku to przez to zwiększenie zmiennej warunek zostanie spełniony pomimo tego że bufor nie został załadowany ( ponieważ zmienna Tx_Head została zwiększona zanim został zapisany bajt do bufora) czyli zostanie wysłany pusty bajt czyli 0 co poskutkuje nie wyświetleniem się niczego :D



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

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

Muszę jeszcze dokładnie wyczaić dlaczego to dzieje się tylko dla długich stringów tzn. dłuższych niż długość buforu i dlaczego wtedy zostają wyświetlone tylko dwie pierwsze literki. Wydaje mi się że ma to związek z zapętlaniem bufora



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

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

rajmund96 napisał(a):
Muszę jeszcze dokładnie wyczaić dlaczego to dzieje się tylko dla długich stringów tzn. dłuższych niż długość buforu i dlaczego wtedy zostają wyświetlone tylko dwie pierwsze literki. Wydaje mi się że ma to związek z zapętlaniem bufora


To pomyśl sobie co się dzieje w twojej funkcji, gdy ona sobie trwa i trwa a w międzyczasie odbywają się przerwania i zmieniają wskaźnik głowy węża .... A tobie po drodze zachciało się bawić zmiennymi globalnymi, które w międzyczasie mogą stracić ważność ...

więc może jednak warto sięgnąć po zmienną lokalną czasem ?


Autor postu otrzymał pochwałę

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



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

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

DOkładnie tak przez własną niewiedze się zaplątałem :D



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

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

Dobra chyba sobie dam spokój z myśleniem dlaczego wyświetlają się tylko dwie pierwsze literki. Chyba że któryś z kolegów wie dlaczego się tak dzieje to bardzo chętnie posłucham ?

A tak w ogóle to dziękuję wszystkim którzy pomagali mi wyjaśnić mój problem :)



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

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

mokrowski Napisałem obsugę bufora cykliczny :) i uwierz mi że naprawdę wiem jak on działa i rozumiem sens jego działania więc dlaczego ciągle mi zarzucasz, chyba od samego początku że nie rozumiem jak działa bufor cykilczny :) Moim problemem nie było zrozumienie jak działa bufor cykliczny, ale to że przy tym buforze wykorzystywałem przerwania i stąd wszystkie problemy, jest to raczej moje niedopatrzenie niż to że nie rozumiem działania zmiennych czy bufora cyklicznego . W przeciwnym wypadku nie doszedł bym do tego dlaczego się tak dzieje czyż nie ? :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2014, o 18:59 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

rajmund96 napisał(a):
uwierz mi że naprawdę wiem jak on działa i rozumiem sens jego działania więc dlaczego ciągle mi zarzucasz


rajmund proszę nie złość się ... nikt ci nie zarzuca, a to że kolega mokrowski uważa, że nadal nie do końca rozumiesz działanie bufora cyklicznego - no to hmmm moim zdaniem ma rację .... i to nie jest żaden zarzut dla ciebie ...

skoro ci nie działa wg twojej metody - no to znaczy że gdzieś popełniasz poważny błąd. Ja rozumiem że ty rozumiesz sens działania bufora cyklicznego - no ale z implementacją masz kłopot - to jedno ...

a drugie ... po prostu totalnie (i to od początku) nieprecyzyjnie opisujesz swój problem .... No ja np nie mogę się połapać i co chwilę ci o tym piszę ...

nawet wcześniej zadałem ci pytanie

"czy działa ci to?"

odpowiedziałeś , że działa! .....

żeby po chwili dodać że działa ale dla krótkich stringów a dla długich nie ....

no to jeśli dla ciebie to oznacza że "działa" ..... matko ;) no to tak - uwierz mi ciężko będzie z kimkolwiek ci się dogadać ....

Poza tym masz:

1. opis w książce
2. przykład kodu w książce który można śledzić z opisem krok po kroku

a ty wyjmujesz zmienną lokalną, która właśnie zabezpiecza przed takimi przypadkami .... robisz sobie globalną i to volatile (z tego co zrozumiałem to nawet jej w przerwaniu nie używasz) więc po co volatile ???? .....

i na końcu dodajesz - że no już tylko gubi ci znaczki

tymczasem kolega mokrowski już wcześniej jak jasnowidz przewidział - że niedługo zapytasz

"to co to jest to volatile?"

a jest sens żebyś i to zrozumiał zamiast dawać to sobie "ot tak na wszelki wypadek w programie" .... bo taką drogą to będziesz jeszcze DŁUUUUGO chodził zanim zrozumiesz i zaimplementujesz bufor cykliczny

------------------------ [ Dodano po: 2 minutach ]

rajmund96 napisał(a):
W przeciwnym wypadku nie doszedł bym do tego dlaczego się tak dzieje czyż nie ?


no i sam widzisz ;) jesteś normalnie niepoprawny - toż - po przeczytaniu kilku postów z tego wątku można dostać chyźla :lol: .... ja jeszcze raz powtórzę - nie wiem nadal działa ci to czy nie działa ...

ale chyba też już dam spokój .... bo widzę że ciężko jakoś się domówić ....

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



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: 40 ]  Przejdź na stronę 1, 2  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO