Wpis z mikrobloga

via Wykop Mobilny (Android)
  • 2
#malinoweauto

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
Pobierz
źródło: comment_trXwSdwqOsmKGsTlCx8FbPx5pf9IZ3g2.jpg
  • 11
via Wykop Mobilny (Android)
  • 0
@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

while(digitalRead(sensorEchoPin)==LOW)

       pulseStart = std::chrono::highresolutionclock::now();

    while(digitalRead(sensorEchoPin)==HIGH)

       pulseEnd = std::chrono::highresolutionclock::now();
konto usunięte via Wykop Mobilny (Android)
  • 0
@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:

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