Po raz pierwszy chciałbym wspomnieć, że jestem nowicjuszem w programowaniu systemów czasu rzeczywistego. Dlatego nie jestem pewien, czy moje pytania są prawidłowe. Przepraszam za to Ale potrzebuję pomocy
Pytanie w skrócie: Jak wdrożyć twarde oprogramowanie czasu rzeczywistego, aby mieć pewność, że dotrzyma on trudnych terminów? Czy konieczne jest użycie niektórych funkcji QNX? A może wystarczy napisać to dla Linuksa, podłączyć do QNX i domyślnie będzie to czas rzeczywisty?
Pełne pytanie: wdrożyliśmy złożone, wieloplatformowe oprogramowanie wieloprocesowe z komunikacją między procesami dla systemów Linux, Windows, Android i QNX. Językiem programowania jest C ++, używamy Boost i planty innych bibliotek. Nasze oprogramowanie działa dobrze i szybko, ale nadal jest prototypowe. Do celów produkcyjnych musimy to robić w czasie rzeczywistym Niektóre z naszych funkcji muszą być działające w czasie rzeczywistym i bardzo niezawodne, ponieważ są one bardzo ważne, a bezpieczeństwo osób korzystających z naszego oprogramowania może zależeć od nich. Działają dość szybko - do setek milisekund. Ale nie jestem pewien, czy nasz system działa w czasie rzeczywistym z tego powodu (mam rację?).
Jest więc główne pytanie: jak zmodyfikować nasze oprogramowanie, aby działało w czasie rzeczywistym? Często googlowałem, ale wciąż nie mam pojęcia, jak to zrobić.
Niektóre dodatkowe informacje o naszych platformach: Linux i Windows, których obecnie używamy tylko do celów testowych. Android - wciąż nie zdecydowaliśmy, czy go potrzebujemy. QNX - to nasz docelowy system operacyjny do produkcji. Wydaje mi się, że odpowiedź na moje następne pytanie brzmi „NIE” :) Ale czy w ogóle można wszczepić wieloplatformowe oprogramowanie czasu rzeczywistego (dla systemów czasu rzeczywistego (RTOS), a także dla systemów ogólnych (GPOS))?
Być może musimy podjąć wysiłki, aby wdrożyć wszystkie funkcje w czasie rzeczywistym tylko dla QNX? Ale nadal nie rozumiem, jak to zrobić. Czy ktoś mógłby rzucić światło na to pytanie?
Odpowiedzi:
Szybki nie oznacza w czasie rzeczywistym, a czas rzeczywisty nie oznacza szybkiego.
W czasie rzeczywistym oznacza, że data dostarczenia wyniku jest równie ważna jak jego wartość. Innymi słowy, jeśli wynik ma prawidłową wartość, ale jest dostarczany za wcześnie lub za późno, ogólny wynik jest błędny.
Pomyśl na przykład o odtwarzaczu wideo. Jeśli klatki wideo nie są wyświetlane z odpowiednią częstotliwością, użytkownicy nie będą zadowoleni. Gorzej, jeśli obraz i dźwięk nie są zsynchronizowane.
Ten przykład pokazuje, że niektóre aplikacje w czasie rzeczywistym można zaimplementować w obecnych systemach operacyjnych ogólnego przeznaczenia.
Istnieje jednak różnica między twardym czasem rzeczywistym a miękkim czasem rzeczywistym w odniesieniu do konsekwencji upływu terminu: w miękkich systemach czasu rzeczywistego jest to po prostu irytująca lub zdegradowana usługa (pomyśl o zatrzymanych obrazach przez kilka sekund w przykład odtwarzacza wideo), podczas gdy jest to (potencjalnie katastrofalna) awaria w systemie czasu rzeczywistego, na przykład w elektrowni jądrowej.
źródło
Jak już powiedział @mouviciel , czas rzeczywisty i szybki to tak naprawdę dwie niezależne właściwości, chociaż wiele terminów w czasie rzeczywistym sugeruje, że potrzebna jest stosunkowo szybka reakcja.
Podczas pisania oprogramowania w czasie rzeczywistym najważniejszą właściwością obok poprawnej odpowiedzi jest to, że możesz dokładnie przewidzieć, jak szybko zostanie udzielona odpowiedź. W przypadku trudnych funkcji czasu rzeczywistego musisz nawet być w stanie zagwarantować, że termin zostanie dotrzymany we wszystkich możliwych warunkach, z wyjątkiem całkowitej awarii zasilania.
Typowe źródła nieprzewidywalności można znaleźć w
Nie twierdzę, że musisz unikać tych obszarów (jak najprawdopodobniej nie możesz), ale musisz wiedzieć, jak mogą one wpłynąć na łatwość, z jaką możesz przewidzieć, że dotrzymasz terminów odpowiednich funkcji w czasie rzeczywistym.
źródło
Przypuszczam, że dwustopniowe wyjaśnienie czasu rzeczywistego jest takie, że system czasu rzeczywistego jest zaprojektowany do zrozumienia i kontrolowania czasu reakcji w najgorszym przypadku od zmiany danych wejściowych do zmiany wartości wyjściowych.
Wymaga to analizy obejmującej cały system. Załóżmy, że masz prosty system, który składa się z klawiatury USB i serwo hamulca. Jaką szybkość reakcji można uzyskać dzięki temu systemowi? Być może będziesz musiał rozważyć:
W tego rodzaju środowisku zwykle zwraca się szczególną uwagę na niezawodność, na przykład standardy MISRA C.
źródło
avoiding use of garbage collection
- Powinno byćavoiding use of non-deterministic memory management
. Odśmiecanie może odbywać się w czasie rzeczywistym, a ręczne zarządzanie pamięcią niekoniecznie jest deterministyczne (patrz typowamalloc
implementacja dla C).