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



Teraz jest 28 mar 2024, o 23:00


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 4 mar 2018, o 18:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

Hej
W całości rozumiem sen używania przerwań RS232 podczas gdy obieramy dane.

Ale mam problem ze zrozumieniem wysyłania danych kiedy wykorzystujemy i nie wykorzystujemy przerwań.
Czym różnią się te zapisy:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


Program załącza diodę, czeka 500ms,wysyła dane po rsie, potem wyłącza diode i znów czeka 500ms

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

Tu też załączana jest dioda, mamy opoźnienie 500ms, potem wysyłamy dane przez przerwanie, czyli program skacze do obsługi przerwania, wysyła to co ma wysłać i wraca, po powrocie wyłącza diodę i czeka 500ms.

Czym się różnia w takim razie te 2 programy (korzystające i niekorzystające z przerwań)?
Byłbym w stanie to zrozumieć, że jeśli wysyłamy coś przez HAL_UART_Transmit_IT, to program w pętli main dalej działa,a wysyłanie jest realizowane niejako równolegle,, ale chyba się to tak nie dzieje?, tylko program z miana jest zatrzymany i potem jest skok do obsługi przerwania?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 mar 2018, o 18:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 cze 2014
Posty: 820
Lokalizacja: Tam gdzie PYRY są
Pomógł: 64

Po pierwsze kolego, to w avr nie ma, że jak coś się wykonuje w przerwaniu to robi się równolegle. Obsług przerwania też zatrzymuje niejako pracę pętli głównej i zajmije czas procesorowi Dlatego między innymi obsługa przerwania powinna być jak najkrótsza. Dlatego też w niektórych bardzo ważnych czasowo częściach programu blokuje się możliwość zadziałąnie przerwania komendą cli. Potem odblokowuje się je z powrotem.

Wysyłanie i odbiór przez uart sprzętowy "idzie" poza programem głównym i niezależnie od niego ale obsługa przerwania już nie

Co do różnic w funkcjach, musiałbyś pokazać ich ciała a nie tylko nagłówki...

Poza tym wysłąnie czegokolwiek przez RS jest niczym w porównaniu z czekaniem bezczynnie 500ms

_________________
IntegraMETEO
WordCLOCK
IntegraTOUCH



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 mar 2018, o 18:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

Troche tu namieszane będzie bo temat jest w dziale o ARM,ale spójrz:

W nocie do Amtegi32 znajdziemy taką funkcję, która wysyła znak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Mirek w swoich bibliotekach również stworzył funckję wysyłająca char (ale korzystając z przerwań)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


No i moje pytanie to jakie sa różnice pomiędzy tymi 2 funkcjami?

BO przy OBDIERANIU DANYCH to w 100% to rozumiem, ze lepiej korzystać z przerwań i nie blokować programu, ale przy wysyłaniu to nie do końca to przemawia do mnie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 mar 2018, o 18:41 
Offline
Moderator
Avatar użytkownika

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

to weź kalkulator i sobie policz ile potrwa wysłanie np 200 bajtów przy prędkości np 2400 i 115200 - może wtedy zacznie coś ci świtać

_________________
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: 4 mar 2018, o 19:05 
Offline
Użytkownik

Dołączył(a): 05 wrz 2017
Posty: 169
Pomógł: 31

Ja uzmysłowiłem sobie sens korzystania z przerwań UART TX przy nadawaniu danych, gdy chciałem w jednej ramce nadać więcej niż wynosi sprzętowy bufor nadajnika UART. Wtedy ustawiasz przy jakim zapełnieniu bufora ma wystąpić ISR, który wczytuje z bufora programowego do bufora sprzętowego kolejne dane. W ten sposób nadajesz ciągłą ramkę bez jakiś nieokreślonych odstępów pomiędzy znakami.
Tak jak napisał Pan Mirek, przy większej ilości znaków zobacz jak kod będzie wyglądał z wykorzystaniem przerwań i bez przerwań.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 mar 2018, o 21:33 
Offline
Moderator
Avatar użytkownika

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

abel11 napisał(a):
przy większej ilości znaków zobacz jak kod będzie wyglądał z wykorzystaniem przerwań i bez przerwań

Kod jak kod ;) nie chodzi nawet o większe ilości znaków

proponuję przeliczyć sobie ile zajmuje wysłanie jednego bajtu przy dwóch różnych prędkościach np 2400 i 115200, pomnożyć to przez kilkanaście chociażby bajtów i spróbować sobie odpowiedzieć na pytanie - o co chodzi z tym czasem ? ;) gdzie i kiedy może on przeszkadzać ? o jaki czas w ogóle chodzi ? .... ot proste ćwiczenie

_________________
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: 4 mar 2018, o 22:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

Mirku, staram się jak mogę a ogarnąć nie potrafię.
Domyślam się, że przy niskiej prędkości np. 2400 wysyłanie powiedzmy 500 bajtów zajmie masę czasu.

Ale przecież każda funkcja zarówno blokująca :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

wyśle te dane w tak samo długim czasie - jestem nawet w stanie powiedzieć, że uart_putc będzie wysyłało dłużej.

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


załóżmy tę prędkość 2400 więc:
1/2400=0,4ms
czyli jedna ramka z jednym bajtem leci w ciągu ok 0,4ms.
Pomnóżmy to razy pięćset i mamy całą transmisję wykonaną w 2sekundy.

A co się zmieni jeśli teraz zamiast funkcji blokującej użyjemy tej korzystającej z przerwań?
Czas transmisji CHYBA dalej będzie wynosił 2sek ?
Niestety zostawiłem w domu zestaw uruchomieniowy i nie mogę sobie na żywym organizmie sprawdzić jak będą się różniły czasy wysłania tego przy korzystaniou z funkcji blokującej i nieblokującej.
Więc proszę o wyjaśnienie tego;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 mar 2018, o 23:40 
Offline
Użytkownik

Dołączył(a): 05 wrz 2017
Posty: 169
Pomógł: 31

Może się mylę ale prędkość przy podanym BAUDRATE = 2400 to będzie 1/2400 * ( [liczba bitów danych] + START + STOP + PARITY )
Przyjmując, że mamy 8 bit danych, rezygnujemy z parity i dajemy jeden bit stop to wychodzi: 1/2400 * ( 8 + 2 ) = 4,167 ms na znak.

Powiedzmy, że chcesz wysłać 5 znaków w ramce; przyjmijmy też, że sprzętowy bufor może pomieścić max 3 znaki.
Teraz skąd funkcja blokująca 'wie' kiedy można wpisać kolejny znak do bufora sprzętowego? Pewnie sprawdza flagę czy bufor jest wolny.
Tym sposobem program spędzi 2 * 4.167ms = 8.334 ms głównie na sprawdzaniu flagi zajętości bufora sprzętowego (2 * 4.167ms ponieważ 2 bajty trzeba dodać do bufora 5-3 = 2).

Natomiast z przerwaniem wyglądało by to tak:
Przerwanie wystapi jak bufor sprzętowy jest pusty (właśnie nadaje ostatni znak) -> dopisanie kolejnych bajtów z programowego bufora do bufora sprzętowego (kilka cykli zegara zaledwie) -> powrót na 3 * 4.167ms (długość bufora * czas znaku) do pętli głównej programu (jeśli przyjmiemy, że przerwanie ma być wywołane gdy nadawany jest ostatni bajt ).

Teraz zastanów się co będzie przy 400 znakach.
Dla funkcji nie blokującej będzie to 100 wywołań ISR po kilka us każde.
Natomiast funkcja blokująca będzie czekała, aż nada wszystkie znaki z wyjątkiem ostatnich 3 mieszczących się w buforze, czyli 400 - 3 = 397 znaków * 4.167ms każdy = 1.654 sekundy.

Jeśli nic nie pokiełbasiłem to by był powód stosowania ISR w nadajniku, jeśli pokiełbasiłem Pan Mirek z pewnością naprostuje mój błąd.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 mar 2018, o 01:14 
Offline
Moderator
Avatar użytkownika

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

No DOKŁADNIE o to chodzi ;) dzięki przerwaniom i wolniejszej prędkości można uzyskać (oczywiście w zależności od ilości przesyłanych danych) to, że główny program nie będzie blokowany.

Oczywiście jeśli stosujemy prędkość 115200 to często czas nadawania krótkich wiadomości nawet bez przerwań będzie na tyle krótki, że można pokusić się (w zależności od potrzeb) żeby nie używać buforów nadawczych z przerwaniami

oczywiście te dwie prędkości podałem tak dla kontrastu i przykładu aby porównać czasy - bo jak widać wtedy zaczynamy czuć w czym rzecz ;)

W efekcie końcowym teraz mam nadzieję będzie jaśniej kiedy i jak dobierać sobie odpowiednie mechanizmy w tym zakresie dla dowolnych prędkości


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: 5 mar 2018, o 08:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

Dzięki wielkie;-)
Teraz już to rozumiem ;-)
Dzięki za pomoc;-)



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: 10 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 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