Come modificare il software per diventare in tempo reale? [chiuso]

8

Per prima cosa vorrei menzionare che sono un principiante nella programmazione di sistemi in tempo reale Ecco perché non sono sicuro che le mie domande siano corrette. Scusa per quella cosa Ma ho bisogno di aiuto

Domanda in breve: Come implementare un software in tempo reale per assicurarsi che soddisfi scadenze rigide? È necessario utilizzare alcune funzionalità QNX? O è sufficiente scriverlo per linux, port per QNX e sarà in tempo reale per impostazione predefinita?

Domanda completa: Abbiamo implementato alcuni complessi software multiprocesso multipiattaforma con comunicazione inter-process per Linux, Windows, Android e QNX. Il linguaggio di programmazione è C ++, usiamo Boost e planty di altre librerie. Il nostro software fa bene e rapidamente il suo lavoro ma è ancora un prototipo. Per scopi di produzione, dobbiamo farlo in tempo reale Alcune delle nostre funzionalità devono essere in tempo reale e molto robuste perché sono molto importanti e la sicurezza delle persone che utilizzano il nostro software può dipendere da esse. Funzionano abbastanza rapidamente, fino a centinaia di millisecondi. Ma non sono sicuro che il nostro sistema sia realmente in tempo reale a causa di questo fatto (ho ragione?).

Quindi c'è una domanda principale: come modificare il nostro software in tempo reale? Ho cercato su Google molto ma non ho ancora idea di come farlo.

Alcune informazioni aggiuntive sulle nostre piattaforme: Linux e Windows attualmente vengono utilizzati solo a scopo di test. Android: non abbiamo ancora deciso se ne abbiamo bisogno. QNX - è il nostro OS di destinazione per la produzione. Immagino che la risposta alla mia prossima domanda sia "NO" :) Ma è possibile impiantare software multipiattaforma in tempo reale (per sistemi operativi in tempo reale (RTOS) e per sistemi operativi generici (GPOS))?

Forse dovremmo fare i nostri sforzi per implementare tutte le funzionalità in tempo reale solo per QNX? Ma ancora non capisco come farlo. Qualcuno potrebbe far luce su questa domanda?

    
posta user172825 05.01.2017 - 11:16
fonte

3 risposte

37

Veloce non significa in tempo reale e in tempo reale non significa veloce.

In tempo reale significa che la data in cui il risultato viene consegnato è importante quanto il suo valore. In altre parole, se il risultato ha un valore corretto ma viene consegnato troppo presto o troppo tardi, il risultato complessivo è sbagliato.

Ad esempio, pensa a un lettore video. Se i frame video non vengono visualizzati alla giusta velocità, gli utenti non saranno soddisfatti. Peggio ancora se immagine e suono non sono sincronizzati.

Questo esempio mostra che alcune applicazioni in tempo reale possono essere implementate su sistemi operativi attuali generici.

Ma c'è una distinzione tra hard real-time e soft real-time rispetto alle conseguenze di una deadline miss: in sistemi soft real-time, questo è solo un fastidio o un servizio degradato (pensate alle immagini freezed durante alcuni secondi nell'esempio del video player), mentre si tratta di un fallimento (potenzialmente catastrofico) in un sistema in tempo reale, come in una centrale nucleare.

    
risposta data 05.01.2017 - 11:47
fonte
15

Poiché @mouviciel è già stato detto, in tempo reale e veloce sono in realtà due proprietà indipendenti, anche se molte in tempo reale le scadenze implicano che è necessaria una risposta relativamente veloce.

Quando si scrive software in tempo reale, la proprietà più importante accanto a una risposta corretta è che è possibile prevedere con precisione la velocità con cui verrà data la risposta. Per le funzionalità hardware in tempo reale, devi essere in grado di garantire che la scadenza sarà soddisfatta in tutte le condizioni possibili a causa di un'interruzione completa dell'alimentazione.

Tipiche fonti di imprevedibilità possono essere trovate in

  • Assegnazione dinamica della memoria e raccolta dati inutili
  • (priorità più alta) interrompe
  • Lo scheduler nel sistema operativo
  • Creazione dinamica e distruzione di oggetti
  • Grandi quantità di codice eseguito in modo condizionale

Non sto dicendo che devi evitare quelle aree (come probabilmente non puoi), ma devi essere consapevole di come possano influenzare la facilità con cui puoi prevedere che rispetteresti le scadenze in tempo reale per caratteristiche rilevanti.

    
risposta data 05.01.2017 - 12:44
fonte
8

Suppongo che la spiegazione in due frasi del tempo reale sia che un sistema in tempo reale è progettato per comprendere e controllare il peggiore tempo di risposta dagli ingressi che cambiano alle uscite che cambiano.

Ciò richiede un'analisi che copra l'intero sistema. Supponiamo che tu abbia un sistema banale costituito da una tastiera USB e un servofreno. Quale reattività puoi ottenere con questo sistema? Potrebbe essere necessario prendere in considerazione:

  • input della frequenza di polling e quanto tempo richiede
  • input interrupt latency
  • il tempo di commutazione del contesto del sistema operativo quando si verifica un evento di input
  • prioritizzazione dei compiti del sistema operativo
  • evitare l'uso dell'allocazione dinamica o della memoria virtuale nel programma, per evitare ritardi di risposta imprevedibili o eventi OOM
  • evitando l'uso della garbage collection
  • evitando l'uso di algoritmi O (n) o peggiori con N elevata o imprevedibile (il caricamento di una playlist molto grande nel sistema di intrattenimento della tua auto rallenta la sua risposta di frenatura?)
  • considera la latenza del disco o della rete (ad esempio l'uso del bus CAN nelle automobili)
  • latenza del controllo di output

In questo tipo di ambiente di solito c'è anche una considerazione speciale per l'affidabilità, come gli standard MISRA C.

    
risposta data 05.01.2017 - 16:04
fonte

Leggi altre domande sui tag