ATNEL tech-forum
https://forum.atnel.pl/

Wysyłanie znaku przez RS z i bez użycia przerwania
https://forum.atnel.pl/topic20355.html
Strona 1 z 1

Autor:  xamrex [ 4 mar 2018, o 18:01 ]
Tytuł:  Wysyłanie znaku przez RS z i bez użycia przerwania

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?

Autor:  skalarro [ 4 mar 2018, o 18:09 ]
Tytuł:  Re: Wysyłanie znaku przez RS z i bez użycia przerwania

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

Autor:  xamrex [ 4 mar 2018, o 18:25 ]
Tytuł:  Re: Wysyłanie znaku przez RS z i bez użycia przerwania

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

Autor:  mirekk36 [ 4 mar 2018, o 18:41 ]
Tytuł:  Re: Wysyłanie znaku przez RS z i bez użycia przerwania

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ć

Autor:  abel11 [ 4 mar 2018, o 19:05 ]
Tytuł:  Re: Wysyłanie znaku przez RS z i bez użycia przerwania

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ń.

Autor:  mirekk36 [ 4 mar 2018, o 21:33 ]
Tytuł:  Re: Wysyłanie znaku przez RS z i bez użycia przerwania

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

Autor:  xamrex [ 4 mar 2018, o 22:05 ]
Tytuł:  Re: Wysyłanie znaku przez RS z i bez użycia przerwania

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;)

Autor:  abel11 [ 4 mar 2018, o 23:40 ]
Tytuł:  Re: Wysyłanie znaku przez RS z i bez użycia przerwania

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:  mirekk36 [ 5 mar 2018, o 01:14 ]
Tytuł:  Re: Wysyłanie znaku przez RS z i bez użycia przerwania

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:  xamrex [ 5 mar 2018, o 08:27 ]
Tytuł:  Re: Wysyłanie znaku przez RS z i bez użycia przerwania

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

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/