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



Teraz jest 22 gru 2024, o 18:35


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 1 sty 2018, o 14:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 24 cze 2012
Posty: 414
Lokalizacja: Oborniki
Pomógł: 5

Witam Was.

Na razie mogę tylko ogólnikowo zapytać, gdyż nie mam pod ręką żadnego kodu.

Zacząłem zabawę z systemem operacyjnym jak w tytule (FREERTOS). Pisanie sterowników bazujących na sprzętowych rozwiązaniach (i2c, uart itp) jest generalnie dość proste. Kolejki są do opanowania. Jednak przy próbach na zastawie uruchomieniowym pojawiły się pewne komplikacje.

Nie potrafię wprost przepisać kodów z AVR (mirekk36) na ARM (STM32) tak, aby działały na systemie FreeRTOS. Wszystko jest jasne i logiczne do momentu, aż nie natknę się na linijkę w stylu "_delay_us(47)". Jak takie opóźnienie prawidłowo implementować w systemie operacyjnym? Oczywiście rozumiem, że brzydko wstawić delay, ale przy częstotliwości proca 400MHz czekanie tyłu cykli zegara to marnotrawstwo zasobów.

Ma ktoś jakieś pomysły na to?

Przy okazji najlepsze życzenia dla forumowiczów na nowy 2018 rok:)

Mikołaj

Wysłane z mojego Redmi Note 4 przy użyciu Tapatalka

_________________
Pozdrawiam:
Mikołaj



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 sty 2018, o 15:31 
Offline
Nowy

Dołączył(a): 21 kwi 2016
Posty: 16
Lokalizacja: Mińsk Mazowiecki
Pomógł: 1

Ahoj,
generalnie to wykorzystuje się funkcje wbudowane w FreeRtos :-) vTaskDelay, vTaskDelayUntil.
Jeśli chodzi o implementację FreeRtos na STM32 to mogę polecić Tobie stronę autora ciekawej książki :-)
https://www.carminenoviello.com/2015/06 ... toolchain/
Wszystkiego dobrego w Nowym Roku 2018, wielu ciekawych pomysłów :-)
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 sty 2018, o 19:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 24 cze 2012
Posty: 414
Lokalizacja: Oborniki
Pomógł: 5

roberto_k_w napisał(a):
Ahoj,
generalnie to wykorzystuje się funkcje wbudowane w FreeRtos :-) vTaskDelay, vTaskDelayUntil.
Jeśli chodzi o implementację FreeRtos na STM32 to mogę polecić Tobie stronę autora ciekawej książki :-)
https://www.carminenoviello.com/2015/06 ... toolchain/
Wszystkiego dobrego w Nowym Roku 2018, wielu ciekawych pomysłów :-)
Pozdrawiam


Dzięki za link, przejrzę co tam mają ciekawego :D Niestety nie ma w nim słowa o moim problemie...

dambo napisał(a):
vTaskDelay, vTaskDelayUntil - spoko jeśli nie są to jakieś krytyczne rzeczy itp. Jednak w przypadku 1W itp gdzie te czasy w uS są kluczowe trzeba jakoś inaczej podejść - nadać większy priorytet + zrobić ten delay na osobnym timerku z odliczaniem uS. Jeśli chodzi o delaye w LCD, lub bardziej ogólnie o obsługę LCD - to się u mnie dzieje zawsze na najniższym priorytecie i każdy wątek może to przerwać, ale jak pisałem w LCD to na nic nie wpłynie, ale komunikację 1W trzeba inaczej zorganizować.


No właśnie... Tylko jak? ;)

_________________
Pozdrawiam:
Mikołaj



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 sty 2018, o 20:11 
Offline
Użytkownik

Dołączył(a): 29 lip 2014
Posty: 195
Pomógł: 44

Witam,

mikandrzej napisał(a):

No właśnie... Tylko jak? ;)


Tworzysz taska np. vYaskPomTemp, nadajesz mu najwyższy priorytet. Opóźnienia rzędu us realizujesz za pomocą dodatkowego timera, po prostu w pętli ( w tym tasku) czekasz na jego wyzerowanie. Pamiętaj tylko o umieszczeniu tego opóźnienia w sekcji krytycznej. Oczywiście, mówię tu o najprostszej i nieoptymalnej implementacji tego 1W. Z praktyki mogę Ci napisać, że opóźnienia dla wygenerowania resetu możesz wygenerować nawet za pomocą vTaskDelay - pod warunkiem, że ustawisz sobie tick dla RTOS na poziomie 0.2-0.5ms. Początkowo zastosowałem tą metodę u siebie i nawet w miarę sensownie to działało.
Jeśli chcesz zrobić to bardziej "po ludzku" ;-), to niestety trzeba już trochę bardziej się namęczyć. Ja u siebie mam obecnie maszynę stanów napędzaną przez jeden z timerów w OPM i w przerwaniu od tego timera mam obsługę 1W na poziomie "bitowym". I tu uwaga - gdybyś chciał tak to zrealizować, to musisz ustawić najwyższy (0) priorytet dla tego przerwania.

Pozdrawiam, QuadMan.

P.S. Widzę, że kol dambo był szybszy, ale zostawię tego posta tak jak jest.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 sty 2018, o 22:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 24 cze 2012
Posty: 414
Lokalizacja: Oborniki
Pomógł: 5

Dzięki Panowie. Ma to sens, w sumie taki urok tej magistrali, że trzeba ją obsługiwać badając stan pinu co jakiś czas, a nie na przerwanie przy zboczu.

Co do pisania obsługi tego na FREERTOS, to faktycznie takie podejście można zastosować, tylko zastanawiam się czy nie lepiej jednak wówczas szukać termometru na I2C, albo inne sprzetowo zaimplementowane rozwiązanie? Czekanie w pętli mnie odrzuca, nie po to chce stosować STM32F7, żeby zajmować jego cenny czas czekaniem tysięcy cykli w pętli... Już wolałbym osobnego STM32F1 dać obok, żeby robił wszystko co związane z 1wire i oddawał to przez i2c :)

W innym wątku poruszę temat obsługi 1wire za pomocą UART, byc może będzie już ktoś miał z tym jakieś doświadczenie:)

Pozdrawiam

Wysłane z mojego Redmi Note 4 przy użyciu Tapatalka

_________________
Pozdrawiam:
Mikołaj



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

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