Java Real Time como começar?

7 respostas
N

Alguém já fez um aplicativo real time em java? Estou apanhando feio para este assunto e queria saber se algum de vocês pode me ajudar a encontrar o caminho certo. Estou querendo desenvolver um programa para controlar um motor de passo, ok ele já está feito e funciona, o único problema é que não consigo alcançar uma precisão de microsegundos nos timers de espera entre os pulsos do motor. Então pesquisando descobri que precisaria mudar para um sistema RTOS e outras coisas que já começaram a complicar :slight_smile: . Eu já tentei recompilar um kernel do linux com o path rt para poder fazer aplicações real time, só que não me sai muito bem. Pesquisando mais um pouco descobri que com java é possivel alcançar real time tbm, só nao entendi como isso serial possivel se precisaria de um sistema tbm e se a solução é open-source (free) ou eu teria que pagar pra poder fazer isso.
Obrigado!

7 Respostas

R

O seu problema está em dar um sleep pequeno o suficiente?

Ou o seu problema está em efetuar o cálculo em tempo hábil?

Se for o primeiro caso: Em Java você pode usar o Thread.sleep(ms, ns) que recebe um tempo em milisegundos, mais uma quantidade de nanosegundos. No caso você passaria no ms o valor 0, e no ns a quantidade de microsegundos que voce precisaria (em nanosegundos).
Esse método está sujeito as configurações de timer da máquina, então é bem possível que tenha que fazer atualizações no SO. E bem provavelmente no garbage colector/jvm também.

Se for o segundo caso: Terá que otimizar o algoritmo e/ou usar uma máquina mais potente. Se você evitar criar objetos e usar arrays (de tipos primitivos) para tudo, pode te ajudar com isso. Tente reaproveitar os arrays criados inclusive.

Não sei se consegui dar alguma luz, não sou especialista no assunto.

J

Você precisa usar uma jvm de baixa latência para resolver o seu problema. A oracle possui a jrockit.

JRockit não sofre tanto com congelamentos causados pelo coletor de lixo da máquina virtual mas não é gratuita para projetos que visam lucros.

http://www.oracle.com/technetwork/middleware/jrockit/overview/index.html

O seu problema é que você necessita de precisão de respostas em tempos muito curtos. Pra baixo da casa dos 10 ms e entrando nos us essa jvm já não pode mais te ajudar.

N

Isso mesmo julio, o meu problema é que preciso de um timer que tenha precisão de 10 us, algo impossível de conseguir com o Thread.sleep(). Eu to pensando em usar código em C/C++ com JNI pra conseguir isso em um sistema RTLinux. Eu sei que esse fórum é de java, mas se alguém souber algum exemplo de Real Time Software em um RTLinux seria de grande ajuda :slight_smile: .

V

Por que não usa C++ direto? Ou só C mesmo?

Se você está com restrições tão sérias de tempo, está na linguagem errada.

N

Você tem razão Vini, eu só optei pelo java por ele ser mais “fácil” e por eu ter mais experiência com ele, mas pelo jeito o trabalho que eu teria pra fazer ele funcionar não valeria a pena.

V

Pois é, se for usar JNI, fica mais difícil do que simplesmente usar o C++ direto.

J

Você consegue com a jrockit. Já resolvi um problema semelhante simplesmente trocando a jvm.

Criado 4 de janeiro de 2013
Ultima resposta 7 de jan. de 2013
Respostas 7
Participantes 4