Skocz do zawartości

Raspberrypi i korzystanie z wektorów przerwań pod Raspbianem


nse

Pomocna odpowiedź

Potrzebuję skorzystać z przerwania UART'a tak by poślizg czasu nie przekroczył 10 ms od zakończenia wysłania ramki danych, pisząc program w GCC.

Czy ktoś przerabiał ten problem ? Oferowane sygnały obsługi zdarzeń tego przerwania nie obsługują, może jest możliwość skorzystania z wektora przerwań bezpośrednio w kodzie ? , lub za pomocą wstawki assemblerowej ?

Albo jest możliwość modyfikacji jądra systemu tak by ten sygnał został zadeklarowany w miejsce przykładowo SIGUSR2 ?

Link do komentarza
Share on other sites

Jeśli napiszesz własny sterownik jądra masz dostęp do wszystkiego, w tym do przerwań. Z drugiej strony modyfikowanie jądra to raczej zaawansowany temat.

Skoro opóźnienie, które Cię interesuje to aż 10ms, możesz spróbować rozwiązać problem znaczenie prościej - możesz nadać programowi obsługującemu port szeregowy wyższy priorytet, najlepiej zmieniając szeregowanie zdania na real-time. Nadal nie będzie 100% pewności zmieszczenia sie w 10ms, ale to bardzo łatwo zrobić i chociaż sprawdzić czy wystarczy.

Link do komentarza
Share on other sites

Jeśli napiszesz własny sterownik jądra masz dostęp do wszystkiego, w tym do przerwań. Z drugiej strony modyfikowanie jądra to raczej zaawansowany temat.

Skoro opóźnienie, które Cię interesuje to aż 10ms, możesz spróbować rozwiązać problem znaczenie prościej - możesz nadać programowi obsługującemu port szeregowy wyższy priorytet, najlepiej zmieniając szeregowanie zdania na real-time. Nadal nie będzie 100% pewności zmieszczenia sie w 10ms, ale to bardzo łatwo zrobić i chociaż sprawdzić czy wystarczy.

Mi jest potrzebna 100% kontrola nad czasem reakcji na UART'cie, a pod Linuksem lub wyższymi systemami tego tematu nie przerabiałem, więc jestem zielony jak trawka na wiosnę 😉 Przerwania przerabiałem pod AVR'ami robiąc wstawki assemblerowe jako osobne pliki *.S i to mi działa, a teraz muszę to co wykonałem na atmedze skomunikować z RPI i tam napisać resztę kodu obsługującego całe urządzenie, a o pisaniu programu pod Linuksa to jeszcze nic nie wiem 🙂

Link do komentarza
Share on other sites

Skoro nie wiesz, to na pewno nie zaczynaj od modyfikacji jądra. Tak jak napisałem, wysoki priorytet zadania powinien wystarczyć. Niestety Linux nie jest systemem czasu rzeczywistego, więc może nie być tak łatwo. Inna opcja to użycie dwóch procesorów - jednego dla RT, a drugiego dla linuxa. W roli dodatkowego procka może być nawet Arduino, na nim masz dużo większą kontrolę nad czasem przetwarzania.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Skoro nie wiesz, to na pewno nie zaczynaj od modyfikacji jądra. Tak jak napisałem, wysoki priorytet zadania powinien wystarczyć. Niestety Linux nie jest systemem czasu rzeczywistego, więc może nie być tak łatwo. Inna opcja to użycie dwóch procesorów - jednego dla RT, a drugiego dla linuxa. W roli dodatkowego procka może być nawet Arduino, na nim masz dużo większą kontrolę nad czasem przetwarzania.

Problem polega na tym że już w atmedze zagnieździłem 4 przerwania w sobie, teraz jak do kodu dopiszę obsługę bufora tak by komunikacja mogła już się odbywać w pełnym dupleksie, to jest obawa że rozsypią mi się kryteria czasowe niezbędne do precyzji pomiaru, oczywiście rozważam też pośrednika na atmedze który mi to załatwi ..., na razie szukam jak najmniej materiałochłonnych rozwiązań 😉 ... albo kogoś kto zmodyfikuje jądro na takie potrzeby ?

Ps. Choć ja akurat to jestem chciwy na wiedzę i doświadczenie 😉

Link do komentarza
Share on other sites

Może napisz coś więcej o tym co chcesz zrobić - bez tego ciężko doradzać, może poza odradzaniem zbyt ambitnych planów 🙂

Urządzenie wysyła paczkę danych i przechodzi w nasłuchiwanie do ok 0,5s,
Jeśli ten czas zostanie przekroczony wysyła ostatnio wysłaną paczkę, cała "zabawa" polega na tym by czas nasłuchu został zredukowany do minimum, a odpowiedź z RPI nie zachodziła na wysyłanie kolejnej paczki po przekroczeniu czasu nasłuchu.

Kolega który miał napisać tą drugą część oprogramowania się na tym wysypał. 🙁

Ps. To ma być rozwiązanie przemysłowe, nie może być "przypadków" 🙂

możesz nadać programowi obsługującemu port szeregowy wyższy

priorytet, najlepiej zmieniając szeregowanie zdania na real-time.

Jak możesz to podaj więcej szczegółów jak te przydziały priorytetów się realizuje w praktyce ?

Jeśli by jeszcze dało się wywoływać funkcje obsługującą UART'a w regularnych odstępach powiedzmy co 5ms, to też powinno rozwiązać problem ?

Link do komentarza
Share on other sites

Trochę to wszystko dziwne - 0,5s to wieki dla tak szybkiego układu, nie powinno stanowić wyzwania odpowiedzenie w takim czasie. 5ms to już trochę gorzej, ale jak nie musi być bardzo dokładnie, to też nie powinno być problemu.

O priorytetach zadań, szeregowaniu itd wszystko jest w sieci, wujek google powinien pomóc. Na początek np. taki link: http://man7.org/linux/man-pages/man7/sched.7.html

Może te problemy z opóźnieniami są spowodowane programem, a nie samym systemem?

  • Lubię! 1
Link do komentarza
Share on other sites

Trochę to wszystko dziwne - 0,5s to wieki dla tak szybkiego układu, nie powinno stanowić wyzwania odpowiedzenie w takim czasie. 5ms to już trochę gorzej, ale jak nie musi być bardzo dokładnie, to też nie powinno być problemu.

O priorytetach zadań, szeregowaniu itd wszystko jest w sieci, wujek google powinien pomóc. Na początek np. taki link: http://man7.org/linux/man-pages/man7/sched.7.html

Może te problemy z opóźnieniami są spowodowane programem, a nie samym systemem?

Też tak myślę, ale kolega był drażliwy i wolał wymuszać bym to ja zmieniał oprogramowanie w atmedze które zostało już przetestowane, a że wyskoczył z tym na ostatnią chwilę to zrezygnowałem z jego oprogramowania, bo dla mnie jest nie do pomyślenia by procesor w RPI 3 nie umiał sobie poradzić z tak prostymi uwarunkowaniami komunikacji RS232 i rozsypywał się podczas próby generalnej. 🙁 Wyszło na to że sam sobie muszę z tym poradzić, ale nie szkodzi mam okazje się czegoś nauczyć 😉

RPI jest mi potrzebne do wyświetlania, drukowania i zapisywania danych pomiarowych, więc opanowanie tej technologi mi się przyda na przyszłość 🙂

Link do komentarza
Share on other sites

Chyba udało mi się rozwiązać problem implementując funkcje która to załatwia na wstępnych testach analizatorem mam zwłokę mieszczącą się w 1ms, zobaczę co się będzie działo jak kod się rozbuduje ?

Czy jest jakiś fajny debugger, by można śledzić krok po kroku co się dzieje w procesorze pod Linuksem ?

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.