zabrałem się już bardziej do projektu. jesem w trakcie pisania obsługi czujników. na poczatku byłk tak że main robił wątek asynchroniczny. tam robił się trigger na czujniki, czyli wysłanie sygnału by zaczął sie pomiar. a potem kolejne wątki asynchroniczne zbierały równolegle z wszystkich czujników dane. okazało się że to za bardzo obciąża. zmieniłem na to by robiło tak by był trigger potem odpytuje jeden czujnik, trigger i kolejny. to poprawiło sytuacje. tylko trochę. bo wciąż to zżera za dużo jak na taką czynność.
problem leży w tym że w pętli odpytuje ciągle czy na danym pinie pojawił się stan wysoki. więc zasoby mocno zżera.
pytanie takie. w jaki sposób bym mógl zatrzymać proces dopóki nie będzie dany warunek spełniony np. True. while(True) odpada. widziałem też condition_variable ale pojawia się problem że też bym musiał sprawdzać stań pina w pętli by wysłać notify.
potrzebuje czegoś takiego
czekajAż(będzie tutaj True, ma sobie samo sprawdzać) dopiero idź dalej...
@nicniezgrublem: to jest odczytywanie długości impulsu stanu wysokiego. potrzebuje to zoptymalizować. digitalRead zwraca 0 lub 1, zależy jaki stan jest na danym pinie. chciał bym użyć czegoś innego niż whike czy inne pętoe które mi nie obciążą CPU
@nicniezgrublem: nie jest blokująca bo ciągle się wykonuje na wątku. ale problem jest taki że while zbyt szybko i czesto sie wywoluwuje co powoduje duze obciazenie
@mapache: to jest właśnie problem z tymi czujnikami, one są asynchroniczne tylko w teorii. Jak pisałem ich obsługę pod stm32 stwierdziłem że nie chce mieć super dokładnej odległości +/- 1cm mi wystarczy. Dlatego mam 1 timer który triggeruje i liczy sobie długość stanu wysokiego na tych czujnikach (oczywiście z jakimś tam błędem)
@mapache: nie potrzeba żadnych dodatkowych wątków, żadnej asynchroniczności. Tworzysz wektor przerwania ustawiony na CHANGE, w przerwaniu dwie maski bitowe z operatorem & i wybranym pinem:
To jest oczywiście pseudokod, sprawdź jaki to port i pin i zrób odpowiednie maski dla tych czujników, całość trwa, jak już wcześniej pisałem mniej niż dzielenie
mały update i pytanie.
zabrałem się już bardziej do projektu. jesem w trakcie pisania obsługi czujników. na poczatku byłk tak że main robił wątek asynchroniczny. tam robił się trigger na czujniki, czyli wysłanie sygnału by zaczął sie pomiar. a potem kolejne wątki asynchroniczne zbierały równolegle z wszystkich czujników dane. okazało się że to za bardzo obciąża. zmieniłem na to by robiło tak by był trigger potem odpytuje jeden czujnik, trigger i kolejny. to poprawiło sytuacje. tylko trochę. bo wciąż to zżera za dużo jak na taką czynność.
problem leży w tym że w pętli odpytuje ciągle czy na danym pinie pojawił się stan wysoki. więc zasoby mocno zżera.
pytanie takie. w jaki sposób bym mógl zatrzymać proces dopóki nie będzie dany warunek spełniony np. True. while(True) odpada. widziałem też condition_variable ale pojawia się problem że też bym musiał sprawdzać stań pina w pętli by wysłać notify.
potrzebuje czegoś takiego
czekajAż(będzie tutaj True, ma sobie samo sprawdzać)
dopiero idź dalej...
#programowanie #raspberrypi #tworczoscwlasna #elektronika #robotyka
Pojęcia nie mam, co Ty kombinujesz. To nie możesz po prostu wyłączać triggera mnożąc go bitowo jakąś maską?
Przecież to jest analogowy sensor, mierzy tylko czas i zajmuje 2 cykle zegara, mniej niż jedno dzielenie, jak to za dużo zasobów?
while(digitalRead(sensorEchoPin)==LOW)
pulseStart = std::chrono::highresolutionclock::now();
while(digitalRead(sensorEchoPin)==HIGH)
pulseEnd = std::chrono::highresolutionclock::now();
if (maskabitowa&portipin==maskabitowa)
{
pulseEnd = std::chrono::highresolutionclock::now();
timeIncr = pulseEnd - pulseStart;
}
else pulseStart = std::chrono::highresolutionclock::now();
To jest oczywiście pseudokod, sprawdź jaki to port i pin i zrób odpowiednie maski dla tych czujników, całość trwa, jak już wcześniej pisałem mniej niż dzielenie