Jak zmodyfikować oprogramowanie, aby stało się w czasie rzeczywistym? [Zamknięte]

9

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?

użytkownik172825
źródło
55
Jeśli Twój projekt ma kluczowe znaczenie dla bezpieczeństwa, naprawdę potrzebujesz kogoś, kto rozumie systemy czasu rzeczywistego na Twojej liście płac.
Blrfl,
18
System czasu rzeczywistego określa precyzję kodu pod względem czasu wykonania, a nie to, czy jest szybki czy wolny.
Pagotti
22
Mam wrażenie, że nie modyfikujesz istniejącego oprogramowania, aby działało w czasie rzeczywistym, projektujesz i piszesz od zera nowe oprogramowanie, biorąc pod uwagę wyraźne ograniczenia w czasie rzeczywistym. Twoje pytanie jest zbyt ogólne: co dokładnie robi twoje oprogramowanie? Na jakim konkretnym rodzaju systemu czasu rzeczywistego, dla jakiego konkretnego rodzaju systemu wbudowanego (jaki cel: infotainment w samolotach komercyjnych nie jest tym samym, co sterowanie reaktorem jądrowym)? Musisz edytować swoje pytanie, aby było bardziej konkretne, precyzyjne i motywowało je.
Basile Starynkevitch
24
Komentarz Reread @ Blrfl. A potem ponownie go przeczytaj, i znowu, i jeszcze raz, aż zatrudnisz osobę z odpowiednim doświadczeniem. Lub upewnij się, że ubezpieczenie od odpowiedzialności cywilnej jest opłacone. Ponieważ jeśli tworzysz oprogramowanie o kluczowym znaczeniu dla bezpieczeństwa z wymaganiami w czasie rzeczywistym i nie masz tego doświadczenia, popełniasz zaniedbania kryminalne.
kdgregory
4
Zapytałeś: „ czy w ogóle możliwe jest wdrożenie wieloplatformowego oprogramowania czasu rzeczywistego (dla systemów czasu rzeczywistego (RTOS), a także dla systemów ogólnych (GPOS))? ” Zgaduję, że nie, inaczej RTOS nie istnieć. „Cross Platform” jest bardzo podobny do „Holy Graal”.

Odpowiedzi:

38

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.

mouviciel
źródło
Panie mouviciel, dziękuję za odpowiedź na moje pytanie Potrzebujemy niektórych funkcji, aby były trudne w czasie rzeczywistym, a innych może być miękkich w czasie rzeczywistym Nie rozumiem, jak pisać oprogramowanie, aby zagwarantować terminy? Czy mógłbyś rzucić nieco światła na to pytanie?
user172825,
7
@ user172825 - Odpowiedzi na to pytanie dotyczą półek bibliotek. Punktami wyjściowymi mogą być google „programowanie w czasie rzeczywistym”, powiązany artykuł w Wikipedii lub samouczki dotyczące systemów RTOS, takich jak QNX lub RTEMS.
mouviciel
To było dla mnie najbardziej skomplikowane pytanie. Znalazłem wiele dużych książek na ten temat. Mam jednak nadzieję, że można to wyjaśnić w kilku zdaniach. :)
user172825
5
W informatyce są tylko dwie trudne rzeczy: unieważnienie pamięci podręcznej i nadawanie nazw. ” - Phil Karlton OK i w czasie rzeczywistym. Tam jedno zdanie wyjaśnia, dlaczego nie można tego wyjaśnić w dwóch zdaniach. Wracamy teraz do regularnego programowania.
1
Uważam, że nazywanie „twardego czasu rzeczywistego” „deterministycznym czasem” zwykle pomaga uświadomić ludziom.
whatsisname
15

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

  • Dynamiczna alokacja pamięci i odśmiecanie
  • (Wyższy priorytet) przerywa
  • Harmonogram w systemie operacyjnym
  • Dynamiczne tworzenie i niszczenie obiektów
  • Duże ilości warunkowo wykonywanego kodu

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.

Bart van Ingen Schenau
źródło
4
W warunkowo wykonywanym kodzie należy uważać na zamortyzowane algorytmy, w których przez większość czasu operacja jest tania, ale czasami może przekształcić się w znacznie droższą operację, na przykład gdy wektor dodaje się, gdy trzeba dokonać ponownego przydziału.
maniak zapadkowy
2
W niektórych przypadkach może być konieczne wykonanie analizy WCET , przewidywanie czasu wykonania z dokładnością do milisekundy
Basile Starynkevitch
3
@ user172825: Profilowanie może pomóc, ale w dużej mierze sprowadza się do doświadczenia i znajomości języka i bibliotek.
Bart van Ingen Schenau
3
Profilowanie może nie być wystarczająco dobre, jeśli masz trudne wymagania w czasie rzeczywistym. Jeśli czas wykonywania nie jest w pełni deterministyczny, wówczas profilowanie może sprawiać wrażenie, że zawsze zakończy się przed upływem terminu, podczas gdy w rzeczywistości dotrzymuje terminu 99 razy na 100. Jeśli masz trudne wymagania w czasie rzeczywistym, musi go spełnić 100 razy na 100.
James_pic
2
@ user172825 W czasie rzeczywistym oprogramowanie służy temu, czym jest chirurgia mózgu w medycynie - potrzebujesz dużego doświadczenia i umiejętności, aby poprawnie to wykonać i musisz być naprawdę bardzo pewny tego, co robisz. Projekty te są lepiej wykonywane pod nadzorem wykwalifikowanego specjalisty z danego obszaru. Nie są czymś, co można przekazać zwykłemu programistowi i powiedzieć „spraw, aby działało to jako system czasu rzeczywistego”.
T. Sar
8

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ć:

  • wejściową częstotliwość odpytywania i jak długo to trwa
  • opóźnienie przerwania wejścia
  • czas przełączania kontekstu systemu operacyjnego po wystąpieniu zdarzenia wejściowego
  • ustalanie priorytetów zadań przez system operacyjny
  • unikanie dynamicznego przydzielania lub wirtualnej pamięci w programie, aby uniknąć nieprzewidywalnego opóźnienia odpowiedzi lub zdarzeń OOM
  • unikanie korzystania z odśmiecania
  • unikanie używania O (n) lub gorszych algorytmów z wysokim lub nieprzewidywalnym N (czy ładowanie bardzo dużej listy odtwarzania do systemu rozrywki w samochodzie spowalnia reakcję hamowania?)
  • rozważyć opóźnienie dysku lub sieci (np. użycie magistrali CAN w samochodach)
  • opóźnienie kontroli wyjścia

W tego rodzaju środowisku zwykle zwraca się szczególną uwagę na niezawodność, na przykład standardy MISRA C.

pjc50
źródło
Czy prawdą jest również to, że bycie w czasie rzeczywistym obejmuje rozważenie, czy operacja jest deterministyczna, być może rekurencyjna, a nawet obliczalna w niektórych przypadkach?
Tak, wszystkie z nich byłyby „nieograniczone”. Algorytmy rekurencyjne mogą być dozwolone pod warunkiem, że na ich stosie nakłada się górna granica.
pjc50
5
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 typowa mallocimplementacja dla C).
8bittree