Como modificar o software para se tornar em tempo real? [fechadas]

9

Pela primeira vez, gostaria de mencionar que sou iniciante em programação de sistemas em tempo real. É por isso que não tenho certeza se minhas perguntas estão corretas. Desculpe por isso, mas preciso de ajuda

Pergunta resumida: Como implementar software rígido em tempo real para garantir que ele atenda a prazos rígidos? É necessário usar alguns recursos do QNX? Ou basta escrever para linux, porta para QNX e, por padrão, será em tempo real?

Pergunta completa: Implementamos algum software multiprocesso multiplataforma complexo com comunicação entre processos para Linux, Windows, Android e QNX. A linguagem de programação é C ++, usamos Boost e planty de outras bibliotecas. Nosso software faz seu trabalho bem e rapidamente, mas ainda é um protótipo. Para fins de produção, precisamos fazer isso em tempo real Alguns de nossos recursos precisam ser em tempo real e muito robustos, porque são muito importantes e a segurança das pessoas que usam nosso software depende delas. Eles trabalham muito rapidamente - até centenas de milissegundos. Mas não tenho certeza de que nosso sistema seja realmente em tempo real devido a esse fato (estou certo?).

Portanto, há uma pergunta principal: como modificar nosso software para ser em tempo real? Pesquisei bastante no Google, mas ainda não faço ideia de como fazê-lo.

Algumas informações adicionais sobre nossas plataformas: Linux e Windows atualmente usamos apenas para fins de teste. Android - ainda não decidimos se precisamos. QNX - é o nosso sistema operacional de destino para produção. Acho que a resposta para minha próxima pergunta é "NÃO" :) Mas é possível implantar software em tempo real de plataforma cruzada (para sistemas operacionais em tempo real (RTOS) e sistemas operacionais para fins gerais (GPOS))?

Possivelmente, precisamos nos esforçar para implementar todos os recursos em tempo real apenas para o QNX? Mas ainda não entendo como fazê-lo. Alguém poderia esclarecer essa questão?

user172825
fonte
55
Se o seu projeto é crítico para a segurança, você realmente precisa de alguém que entenda os sistemas em tempo real na sua folha de pagamento.
Blrfl
18
O sistema em tempo real é o quão preciso é o seu código em termos de tempo de execução, não se é rápido ou lento.
Pagotti
22
Meu sentimento é que você não modifica um software existente para se tornar em tempo real, projeta e escreve do zero um novo software, levando em consideração restrições explícitas em tempo real. E sua pergunta é muito ampla: o que exatamente o seu software está fazendo? Em que tipo preciso de sistema em tempo real, para que tipo concreto de sistema embarcado (que finalidade: infotainment a bordo em aeronaves comerciais não é o mesmo que controle de reator nuclear)? Você precisa editar sua pergunta para ser muito mais concreta, precisa e motivá-la.
Basile Starynkevitch 5/17/17
24
Releia o comentário de @ Blrfl. E, em seguida, releia de novo e de novo e de novo e de novo até contratar uma pessoa com a experiência adequada. Ou garanta que seu seguro de responsabilidade civil seja pago. Porque se você estiver criando um software crítico para a segurança com requisitos em tempo real e não tiver essa experiência, estará sendo negligenciado criminalmente.
precisa saber é o seguinte
4
Você perguntou: " é possível implementar software em tempo real de plataforma cruzada (para sistemas operacionais em tempo real (RTOS), bem como sistemas operacionais para uso geral (GPOS))? " Meu palpite é Não, caso contrário, os RTOS não existir. "Plataforma cruzada" é bem parecida com "Santo Graal".

Respostas:

38

Rápido não significa tempo real e tempo real não significa rápido.

Em tempo real, significa que a data em que o resultado é entregue é tão importante quanto o seu valor. Em outras palavras, se o resultado tiver um valor correto, mas for entregue muito cedo ou muito tarde, o resultado geral estará errado.

Por exemplo, pense em um player de vídeo. Se os quadros de vídeo não forem exibidos na taxa certa, os usuários não ficarão satisfeitos. Pior se a imagem e o som não estiverem sincronizados.

Este exemplo mostra que alguns aplicativos em tempo real podem ser implementados nos sistemas operacionais atuais de uso geral.

Mas há uma distinção entre tempo real difícil e tempo real suave no que diz respeito às consequências de uma falta de prazo: em sistemas em tempo real suave, isso é apenas um aborrecimento ou um serviço degradado (pense em imagens congeladas durante vários segundos em o exemplo do player de vídeo), considerando que é uma falha (potencialmente catastrófica) em sistemas em tempo real, como em uma usina nuclear.

mouviciel
fonte
Sr. Mouviciel, Obrigado por responder à minha pergunta. Precisamos que alguns recursos sejam difíceis em tempo real, outros possam ser flexíveis em tempo real. Não entendo como escrever software para garantir prazos? Você poderia esclarecer essa questão, por favor?
user172825
7
@ user172825 - As respostas a esta pergunta cobrem as prateleiras das bibliotecas. Os pontos de partida podem estar pesquisando "programação em tempo real", artigos relacionados na Wikipedia ou tutoriais de RTOS, como QNX ou RTEMS.
Mouviciel
Foi a pergunta mais complicada para mim. Encontrei muitos livros grandes sobre esse tópico. Mas eu esperava que fosse possível explicá-lo em algumas frases. :)
user172825
5
" Existem apenas duas coisas difíceis na Ciência da Computação: invalidação de cache e nomeação de coisas. " - Phil Karlton OK, e em tempo real. Lá, uma frase explica por que não pode ser explicada em duas frases. Agora, retornamos à sua programação agendada regularmente.
11
Acho que chamar "tempo determinista" de "tempo real difícil" geralmente ajuda a transmitir o ponto para as pessoas.
Whatsisname
15

Como o @mouviciel já disse, em tempo real e rápido são realmente duas propriedades independentes, embora muitos prazos em tempo real impliquem que seja necessária uma resposta relativamente rápida.

Ao escrever software em tempo real, a propriedade mais importante ao lado de uma resposta correta é que você pode prever com precisão a rapidez com que a resposta será dada. Para recursos difíceis em tempo real, você deve mesmo garantir que o prazo seja cumprido em todas as condições possíveis, com exceção de uma falha de energia completa.

Fontes típicas de imprevisibilidade podem ser encontradas em

  • Alocação dinâmica de memória e coleta de lixo
  • (Prioridade mais alta) interrompe
  • O agendador no sistema operacional
  • Criação e destruição dinâmicas de objetos
  • Grandes quantidades de código executado condicionalmente

Não estou dizendo que você deve evitar essas áreas (como provavelmente não pode), mas deve estar ciente de como elas podem afetar a facilidade com a qual você pode prever que cumprirá os prazos em tempo real dos recursos relevantes.

Bart van Ingen Schenau
fonte
4
No código executado condicionalmente, tenha cuidado com os algoritmos amortizados, onde na maioria das vezes a operação é barata, mas ocasionalmente pode se transformar em uma operação muito mais cara, por exemplo, quando um vetor é adicionado quando é necessário realocar.
ratchet freak -
2
Em alguns casos, talvez você precise fazer a análise WCET , prevendo o tempo de execução em milissegundos
Basile Starynkevitch
3
@ user172825: A criação de perfil pode ajudar, mas grande parte se resume a experimentar e conhecer o idioma e as bibliotecas muito bem.
Bart van Ingen Schenau
3
A criação de perfil pode não ser boa o suficiente se você tiver requisitos difíceis em tempo real. Se o tempo de execução não for totalmente determinístico, a criação de um perfil pode dar a impressão de que sempre será concluída dentro do prazo, quando, na verdade, ele só cumpre o prazo de 99 vezes em 100. Se você tem um requisito difícil em tempo real, precisa encontrá-la 100 vezes fora de 100.
James_pic
2
@ user172825 Em tempo real, para software, o que é cirurgia cerebral é medicina - você precisa de muita experiência e habilidade para executá-la corretamente e precisa ter muita certeza do que está fazendo. Esses projetos são melhor realizados sob a supervisão de um profissional qualificado da área. Eles não são algo que você pode lançar para um desenvolvedor regular e dizer "faça isso funcionar como um sistema em tempo real".
T. Sar
8

Suponho que a explicação em tempo real de duas frases é que um sistema em tempo real foi projetado para entender e controlar o pior tempo de resposta, desde as entradas até as saídas.

Isso requer uma análise que cubra todo o sistema. Digamos que você tenha um sistema trivial que consiste em um teclado USB e um servo de freio. Que capacidade de resposta você pode alcançar com este sistema? Você pode ter que considerar:

  • frequência de polling de entrada e quanto tempo isso leva
  • latência de interrupção de entrada
  • hora da troca de contexto do sistema operacional depois de ter um evento de entrada
  • priorização de tarefas do sistema operacional
  • evitando o uso de alocação dinâmica ou memória virtual no programa, para evitar atrasos imprevisíveis na resposta ou eventos OOM
  • evitando o uso de coleta de lixo
  • evitando o uso de O (n) ou algoritmos piores com N alto ou imprevisível (carregar uma lista de reprodução muito grande no sistema de entretenimento do seu carro diminui a resposta de frenagem?)
  • considere a latência do disco ou da rede (por exemplo, uso de barramento CAN em carros)
  • latência de controle de saída

Nesse tipo de ambiente, também costuma haver considerações especiais quanto à confiabilidade, como os padrões MISRA C.

pjc50
fonte
Também é verdade que ser em tempo real inclui considerar se uma operação é determinística, possivelmente recursiva ou mesmo computável em alguns casos?
Sim, todos esses seriam "ilimitados". Algoritmos recursivos podem ser permitidos, desde que o uso da pilha tenha um limite superior imposto a ela.
Pjc50
5
avoiding use of garbage collection- Isso deveria ser avoiding use of non-deterministic memory management. A coleta de lixo pode ser feita em tempo real e o gerenciamento manual de memória não é necessariamente determinístico (consulte a mallocimplementação típica em C).
precisa saber é o seguinte