Muszę zmierzyć różnicę czasu między wysokim -> niskim a niskim -> wysokim zboczem sygnału na pinach GPIO. Napisałem prosty program, który to robi. Po uruchomieniu przez pewien czas byłem całkiem zadowolony z wyniku (warianty 0,01 s). Ale od czasu do czasu występował błąd 0,5 s. Myślałem, że może to wynikać z jakiegoś innego procesu systemowego działającego w tym czasie. Więc moje pytanie brzmi:
Czy mogę zarezerwować jeden rdzeń procesora tylko dla mojego programu i pozwolić innym 3 rdzeniom na system?
Używam Raspbian Jessie Lite, więc myślę, że 3 rdzenie będą wystarczające, aby go uruchomić.
operating-systems
process
NonStandardModel
źródło
źródło
Odpowiedzi:
Poświęcenie rdzenia jest prawdopodobnie przesadą.
Proponuję wypróbować moją bibliotekę pigpio . Domyślnie czas zmiany GPIO zmienią się z dokładnością do 10µs.
Jako szybki test proponuję spojrzeć na ten przykład w Pythonie , który wydrukuje dowolne przejście na poziomie GPIO i czas w mikrosekundach od ostatniego przejścia na tym GPIO.
pigpio nie jest domyślnie instalowany w Jessie Lite. Zainstaluj najnowszą wersję z połączonej witryny lub starszą wersję w repozytoriach.
sudo apt-get install pigpio python-pigpio python3-pigpio
źródło
Możesz zablokować swój program na jednym rdzeniu, korzystając z
schedutils
opisu opisanego w tym artykule Cyberciti :Inne procesy można jednak nadal planować na tym samym rdzeniu. Drugą rzeczą do zrobienia jest upewnienie się, że twoje polecenie działa z najwyższym priorytetem za pomocą polecenia nice (to poinformuje jądro Linuksa, że inne procesy powinny być w razie potrzeby wyprzedzone ). Uruchom swój program w ten sposób:
Istnieje kilka innych możliwych przyczyn problemów z synchronizacją. Nie jest to tak łatwe do zrobienia:
Istnieją sposoby, aby proces był przetwarzany w czasie rzeczywistym , co oznacza, że będzie on przebiegał z pewnymi gwarancjami czasowymi. Problem polega na tym, że wszystko inne może być wolniejsze i jest to złożony temat. Jeśli chcesz pójść w dół tej króliczej nory, sugeruję, abyś zaczął czytać o procesach czasu rzeczywistego w Linuksie .
źródło
Ponieważ masz wymagania dotyczące czasu, Raspberry Pi nie jest już odpowiednią platformą do tego. To nie jest platforma czasu rzeczywistego, a czas może zostać zepchnięty przez wiele różnych źródeł zakłóceń.
Zamiast tego powinieneś użyć mikrokontrolera, aby zmierzyć ten czas, najlepiej za pomocą przerwań i przekazać informację Pi później.
źródło
Zgodnie z twoimi wymaganiami nie sądzę, że musisz używać procesora jednordzeniowego. Musisz mieć pewność, że Twój program działa cały czas. Aby to osiągnąć, możesz ustawić priorytet swojego programu na bardzo wysokim poziomie, aby nie zakłócał go żaden inny proces.
O ile mi wiadomo, system operacyjny (ogólnego przeznaczenia), którego używamy, nie jest przeznaczony do użytku w systemach czasu rzeczywistego, więc jeśli chcesz uruchomić proces w czasie rzeczywistym, aby żaden inny proces go nie zakłócał, musisz iść dla systemu operacyjnego czasu rzeczywistego (RTOS). Może wymyślą podstawowy wybór. :)
źródło