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



Teraz jest 25 lis 2024, o 08:13


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
 Tytuł: Printf i UART
PostNapisane: 27 wrz 2018, o 13:29 
Offline
Użytkownik

Dołączył(a): 14 wrz 2017
Posty: 85
Pomógł: 1

Witam,
Zapewne pytanie banalne, ale w przypadku użycia skonfigurowaniu UART i skorzystanie z printf() z standardowej bibloteki to czy do wysylki odbioru to wykorzystywane jest przerywanie czy na czas wysyłki program jest blokowany i całość jest robiona w programie głównym?

Michał Szymanski



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 wrz 2018, o 19:24 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 546
Pomógł: 27

Słuchaj co to znaczy standardowa biblioteka dla Mirka jego jest standardowa dla mnie Moja dla kogoś innego jego jest standardowa chce Ci przez to powiedzieć że to nie forum wróżek jak chcesz uzyskać pomoc to wklej kod albo jak masz bibliotekę z BB lub GB to napisz że chodzi o te.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 wrz 2018, o 20:55 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

tonygryps napisał(a):
Słuchaj co to znaczy standardowa biblioteka...

https://pl.wikibooks.org/wiki/C/Biblioteka_standardowa

Funkcja printf należy do biblioteki standardowej avr-libc stdio
Zgodnie z tym cytatem:
Cytuj:
The standard streams stdin, stdout, and stderr are provided, but contrary to the C standard, since avr-libc has no knowledge about applicable devices, these streams are not already pre-initialized at application startup. Also, since there is no notion of "file" whatsoever to avr-libc, there is no function fopen() that could be used to associate a stream to some device. (See note 1.) Instead, the function fdevopen() is provided to associate a stream to a device, where the device needs to provide a function to send a character, to receive a character, or both.

biblioteka ta nie zawiera funkcji wysyłających czy też odbierających dane przez UART. Użytkownik biblioteki musi sobie taką funkcję napisać sam. To od niego zależy, czy będzie używał przerwań czy też nie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 paź 2018, o 11:47 
Offline
Użytkownik

Dołączył(a): 14 wrz 2017
Posty: 85
Pomógł: 1

andrews napisał(a):
tonygryps napisał(a):
Słuchaj co to znaczy standardowa biblioteka...

https://pl.wikibooks.org/wiki/C/Biblioteka_standardowa

Funkcja printf należy do biblioteki standardowej avr-libc stdio
.



To może inaczej zadam pytanie. Jak tworzycie soft na atmege to domyslam sie, ze uzywacie UARTa aby przez putty miec wglad co wykonuje procek - pytanie uzywacie jakies gotowej bibloteki czy po prostu tworzycie stringi i uzywacie w petli funkcji uart_putc i wysylacie cały string?

Michał



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 paź 2018, o 11:59 
Offline
Moderator
Avatar użytkownika

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

szymanskim napisał(a):
To może inaczej zadam pytanie. Jak tworzycie soft na atmege to domyslam sie, ze uzywacie UARTa aby przez putty miec wglad co wykonuje procek - pytanie uzywacie jakies gotowej bibloteki czy po prostu tworzycie stringi i uzywacie w petli funkcji uart_putc i wysylacie cały string?

Panie - wysyłanie danych czy to w trybie ASCII czy binarnym to NAJMNIEJSZY problem, przy większych prędkościach nie wymaga nawet praktycznie buforowania - a więc można wysyłać w oparciu o fragment kodu praktycznie wprost z noty PDF (jak chodzi o pojedynczy znak) bo przecież później wysyłanie stringa to tylko

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 tu żadnej filozofii nie ma .... Ale jeśli chce się mieć buforowanie cykliczne nadawanych danych, co ma szczególne znaczenie gdy np korzysta się z niskich prędkości żeby nie blokowało programu głównego - no to wtedy warto oprzeć wszystko o jakiegoś LIB'sa - napisać go samemu nawet .... a przykład i DOKŁADNE omówienie w jaki sposób to zrobić masz w Bluebooku:

https://atnel.pl/mikrokontrolery-avr-jezyk-c.html

tyle że NAJWAŻNIEJSZE jest jednak odbieranie danych ..... bo tu PRAKTYCZNIE zawsze (no może nie zawsze) ale stosuje się buforowanie (bufory cykliczne) niezależnie od baudrate, żeby nie tracić danych

_________________
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: 3 paź 2018, o 12:09 
Offline
Użytkownik

Dołączył(a): 14 wrz 2017
Posty: 85
Pomógł: 1

To ja wiem i w kodzie mam bufor cykliczny i przerywania , chyba zbyt mało precyzyjnie napisałem :) oczywiście można użyć tą funkcję która ze stringa przepisuje do bufowa.
Ja się o co innego pytam, jeśli przykładow chciałbym przesłać na putty taki tekst "Aktualna temperatura 20C" gdzie 20C jest brane z inta to muszę to zrzutować na string a później ten string przesłać przez UART'a.
Pytanie czy używacie printf czy po prostu używacie sprintf a później w pętli uart_putc ?
Znalazłem jakieś przykłady gdzie jest taka konstrukcja:

FILE uart_str = FDEV_SETUP_STREAM(uart_putc , NULL, _FDEV_SETUP_WRITE);

chociąż nie bardzo rozumiem z przykładu implementacje uart_putc

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


Zastanawiam się jaki sens jest parametru "stream" chyba, że on po prostu musi być i tyle.

i z tego co na razie zrozumiałem "wiążę" to strumień z naszą funkcją do wysłania znaku (a właściwie do wrzucenia znaku do bufora) i jak to zrobimy po prostu można używać printf. Co prawda jeszcze tego nie testowałem, zrobię to jak wróce do domu - pytanie jakie rozwiązanie jest przez was rekomendowane.



Michał



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 paź 2018, o 12:36 
Offline
Moderator
Avatar użytkownika

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

Już wyżej kolega andrews odpisał ci precyzyjnie:

post212091.html#p212091

a ty wciąż zadajesz ....hmm sorki wybacz, troszkę dziwne pytanie: "jak wy to robicie?" Toż to zależy od programisty, indywidualnych potrzeb, założeń projektu itp itd - nie ma uniwersalnej odpowiedzi.

Z praktyki mogę tylko powiedzieć, choć mogę się mylić oczywiście, że rzadko kto sobie przełącza strumień do printfa - skoro i tak używa jakiejś biblioteki do obsługi UARTA, która jeśli już jest to zwykle serwuje różne gotowe funkcje....

szymanskim napisał(a):
gdzie 20C jest brane z inta to muszę to zrzutować na string a później ten string

ło matko ;) ..... ja bym ci jednak polecił zapoznać się z podstawami języka C zanim będziesz pisał o takich rzeczach ... których delikatnie mówiąc nie ma w C ;) jakie rzutowanie inta na stringa ? Jak masz miejsce we Flash to wystarczy zrobić

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


i wysłać bufor czyli tak utworzony string przez UARTA

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


i po zawodach.

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

oczywiście można i bez sprintf() .... można samemu tworzyć w locie string, można posługiwać się funckjami do sklejania stringów jak strcat() , itoa() itp itd itp

_________________
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: 3 paź 2018, o 12:58 
Offline
Użytkownik

Dołączył(a): 14 wrz 2017
Posty: 85
Pomógł: 1

Ok, rozumiem. W C i innych językach programuję już 20 lat i to w ramach normalnej pracy (i w tym czasie tekstów naparsowałem się bez liku) tak więc 'mniej więcej' wiem o co w tym chodzi z tym że programowałem duże systemy serwerowe, użycie słowa "rzutowanie" było skrótem myślowym.

Co do pytania "jak to robicie" zdaje sobie sprawy, że nie ma rozwiązania uniwersalnego chodziło o dobre praktyki. W dużych systemach nikt się nie bawi nawet w używanie w printf (czy jak mowa o javie system System.out.println) bo są bibloteki typu log4j, tylko zdaje sobię sprawę że programowanie mikrokontrolerów rządzi się swoimi prawami i to co w programowaniu serwerów jest normą (typu programowanie obiektowe, dążenie do jak największej czytelności/łatwości utrzymania kodu kosztem np. pamięci) w kontrolerach wygląda inaczej. Z tego powodu chciałem się podpytać co sugerujecie , bo może np. użycie printf jest to armata na muchę.

Tak czy inaczej dzięki za informację :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 paź 2018, o 17:38 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

szymanskim napisał(a):
i z tego co na razie zrozumiałem "wiążę" to strumień z naszą funkcją do wysłania znaku (a właściwie do wrzucenia znaku do bufora)

Chciałbym jeszcze tylko wyjaśnić, że jeśli już zdecydujesz się na użycie printf, to ta przykładowa funkcja podana przez Ciebie (czy też ta w dokumentacji biblioteki stdio z avr-libc) blokuje mikrokontroler na czas wysłania całego ciągu znaków przez UART, a więc na dość długo (szczególnie przy małych prędkościach transmisji). Zdecydowanie lepiej byłoby właśnie napisać funkcję, która (tak jak podałeś w nawiasie) dodaje tylko znak do bufora (cyklicznego), a transmisja odbywa się z wykorzystaniem przerwań.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 paź 2018, o 19:31 
Offline
Użytkownik

Dołączył(a): 14 wrz 2017
Posty: 85
Pomógł: 1

Dzięki. Swoją droga czy w bluebooku w kodzie do obsługi nie brakuje załączenia wszystkich przerywań przynajmniej w Atmega328p musiałem dodać SREG |= 0x80 zeby kod ruszył. Chyba, że domyśnie w atmega32 przerywania są włączone.

Michał



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 paź 2018, o 19:56 
Offline
Moderator
Avatar użytkownika

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

szymanskim napisał(a):
Dzięki. Swoją droga czy w bluebooku w kodzie do obsługi nie brakuje załączenia wszystkich przerywań przynajmniej w Atmega328p musiałem dodać SREG |= 0x80 zeby kod ruszył. Chyba, że domyśnie w atmega32 przerywania są włączone.

Michał


Nic nie brakuje, a przerwania włącza się poleceniem w C dla AVR:

sei();

_________________
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: 11 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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