Análise Comparativa dos Ambientes
EmbeddedJava e Real-Time Java
 

UFRGS/PPGC
Disciplina: Programação com Objetos Distribuídos B
Aluno: Leandro Buss Becker
Prof.: Cláudio Fernando Geyer

1 Introdução

Atualmente o mercados dos chamados dispositivos embarcados, ou embedded, abrange uma ampla variedade de consumidores e produtos, incluindo dispositivos tais como telefones móveis, pagers, PDAs, controladores de processo, entre outros. Tipicamente, os dispositivos embedded possuem funcionalidade dedicada, sendo designados estritamente para um conjunto de tarefas específicas. Projetados para longos períodos de vida útil e para terem alta confiabilidade, os dispositivos embedded geralmente são constituídos por microprocessadores de baixa velocidade com quantidade limitada de memória.

Tipicamente, para alcançar os requisitos de performance e tamanho da aplicação, os fabricantes de dispositivos embedded utilizam um sistema operacional de tempo real (RTOS), além de ferramentas proprietárias, otimizadas para as limitações de memória apresentadas por estes dispositivos. Com o aumento da maturidade no desenvolvimento destes sistema, os fabricantes migraram de linguagens de baixo nível, como o Assembler, para linguagens com maior nível de abstração, como o C++. Contudo, os programas produzidos nestas linguagens ainda são altamente dependentes do sistema operacional e da plataforma alvo, o que dificulta a sua reutilização.

A necessidade de otimizar o processo de desenvolvimento dos sistemas embedded, através da construção de programas bem estruturados e com um alto fator de reusabilidade, tem estimulado a utilização da linguagem Java [1; 7]. Dentre os fatores que contribuem para a sua popularidade, alguns merecem um maior destaque:

Com base nas motivações apresentadas, este trabalho tem por objetivo avaliar o estado da arte dos dois principais ambientes Java voltados para a execução em sistemas embedded: o EmbeddedJava [1-4], da Sun Microsystems, e o Real-Time Java [7-9], da Newmonics Inc. A organização do mesmo encontra-se da seguinte forma: na seção 2 são apresentadas e discutidas as principais características do EmbeddedJava; de modo similar, na seção 3 trata-se do Real-Time Java; já na seção 4 é realizada uma comparação entre os dois ambientes e finalmente na seção 5 algumas conclusões são observadas.
 

2 EmbeddedJava

2.1 Visão Geral

O EmbeddedJava Aplication Environment (EJAE) [1] é um ambiente para desenvolvimento de aplicações Java voltadas para dispositivos embedded com restrições severas de memória. Para alcançar os requisitos destes dispositivos, o EJAE faz uso de uma nova implementação do conjunto completo das APIs Java, adaptadas para a execução em pequenos dispositivos com configurações de memória limitada. A tecnologia utilizada pelo EJAE é derivada do PersonalJava Aplication Environment (PJAE) [2], incluindo as novas APIs de suporte. A figura 1 ilustra a família de ambientes de desenvolvimento Java oferecidos pela Sun Microsystems.

Figura 1: Família dos ambientes Java/Sun

Diferentemente das plataformas Java e PersonalJava (que necessitam do conjunto completo de APIs para executar), o EJAE permite configurar as APIs de acordo com os requisitos da aplicação, possibilitando a sua utilização em dispositivos com pequenas quantidade de memória.
 

2.2 Arquitetura do EJAE

O EJAE é um ambiente que pode ser definido sob diferentes pontos de vista. Sob a perspectiva do Java ele oferece um ambiente de execução para programas. Já do ponto de vista da aplicação, o EJAE inclui uma biblioteca de classes e uma máquina virtual Java. Por fim, sob o ponto de vista de um dispositivo consumidor, o EJAE é um ambiente de execução que roda em um RTOS.

Segundo a especificação do EmbeddedJava [3], podem ser utilizadas nas aplicações qualquer campo ou método proveniente das APIs do JDK 1.1.7 (exceto java.applet). Isto permite ao desenvolvedor utilizar toda a robustez das APIs Java, mas também oferece a possibilidade de reduzi-las de acordo com as necessidades da aplicação. Para tanto, a Sun oferece ferramentas de otimização para criação do ambiente e para conversão do código em uma representação mais condensada. Uma vez que as aplicações são escritas na linguagem Java, módulos de programas ou até uma aplicação completa podem ser posteriormente migradas para novas plataformas e facilmente reusadas, independente do RTOS ou processador subjacente. Na figura 2 é exibida a divisão em camadas de uma aplicação EmbeddedJava.


Figura 2: Camadas de uma aplicação EmbeddedJava


2.3 Desenvolvimento de Aplicações no EJAE

O processo de desenvolvimento de uma aplicação no EJAE é baseado na construção de uma imagem executável da máquina virtual e do aplicativo Java para um RTOS alvo. O ambiente EJAE analisa e compila o código fonte Java e constrói uma aplicação executável para emular o EJAE nos ambientes Solaris ou Microsoft Windows NT. A figura 3 ilustra este processo.

Figura 3: Processo de desenvolvimento de uma aplicação EJAE

Analisando a figura 3, verifica-se que o primeiro passo para o desenvolvimento de uma aplicação no EJAE é a construção de um programa que faça referência a alguma das classes da API do EmbeddedJava. Posteriormente, esta aplicação servirá de entrada para a ferramenta JavaFilter. Esta última analisa as dependências estáticas entre os elementos do programa e a JVM. Como saída é produzida uma lista das classes, campos e métodos utilizados, que servirá de entrada para o JavaCodeCompact.

O JavaCodeCompact realiza otimizações exaustivas para reduzir a quantidade de memórias RAM e ROM necessárias no ambiente da aplicação. Esta ferramenta funciona como um pré-carregador, antecipando-se a criação das estruturas internas, eliminando as redundâncias para economizar espaço e resolvendo as referências simbólicas. As estruturas de dados produzidas estão no formato de código fonte C, possibilitando a sua representação de maneira independente de plataforma.

Finalmente, as estruturas de dados produzidas pelas ferramentas são compiladas, juntamente com qualquer outro código nativo, usando o compilador C para o sistema operacional do dispositivo alvo. Os códigos objeto resultantes são linkados para produzir uma imagem executável compacta do EmbeddedJava., que pode ser inserida na ROM do dispositivo.

O processo citado, considerando a eficiência das ferramentas do EmbeddedJava, permite aos fabricantes configurar e construir ambientes de execução Java altamente otimizados para dispositivos embedded de pequena quantidade de memória.

2.4 Passos Futuros do EJAE

A tecnologia EmbeddedJava tende a evoluir com a integração com integração com novas ferramentas como o Jini, apesar de já existir uma ferramenta denominada Java Embedded Server [2] que oferece facilidades para a conexão destes dispositivos via rede. Além disso, já foi lançado uma concorrência com o objetivo de propor uma padronização para a extensão das APIs Java, incluindo requisitos para especificação de requisitos tempo-real. Tais extensões permitirão que aplicações futuras sejam escritas inteiramente na linguagem Java.
 

3 Real-Time Java

3.1 Visão Geral

Da maneira original com que Java foi implementada, a mesma não está apropriada para o desenvolvimento de software tempo-real em sistemas embedded. Porém, combinando certas convenções da programação em Java com técnicas especiais de implementação, é possível suportar aplicações com vários graus de confiança, variando deste total garantia - para execução de restrições hard-real-time - até para a lei do melhor esforço, não garantida, em restrições soft-real-time.

Diferente dos ambientes Java tradicionais, o Real-Time Java permite aos desenvolvedores a escrita de códigos que requisitem o cumprimento seguro das restrições temporais impostas na aplicação. Para tanto são oferecidas um conjunto de APIs especiais [9] provenientes de um ambiente denominado PERC (Portable Executive for Reliable Control). O cumprimento das restrições impostas se dá através da implementação de uma Máquina Virtual Java especial, denominada PERC virtual machine [8].

3.2 PERC Virtual Machine 1.0

A PERC virtual machine 1.0 (ou simplesmente PERC-VM) é uma implementação especial da máquina virtual Java 1.0.2. Isto significa que a mesma pode substituir a máquina virtual projetada pela Sun em ambientes que necessitam de performance
tempo-real. A PERC-VM possui suporte para as bibliotecas java.lang, java.net, java.util e java.io, recomendadas para o desenvolvimentos de aplicações em sistemas embedded.

As principais propriedades da PERC-VM podem ser vistas a seguir:

3.3 PERC Real-Time API 1.0

O Real-Time Java (ou simplesmente Java-RT) consiste de uma combinação de bibliotecas de classes especiais, denominadas PERC API 1.0 [9], juntamente com protocolos de comunicação padronizados fornecidos pelas bibliotecas e também de algumas estruturas adicionadas à sintaxe padrão de Java. A ampliação do Java 1.0.1 é por conta de duas estruturas de controle, que são mostradas a seguir:
Timed(Time.us(30)) {                                    atomic {
     boundedCode();                                           arbitraryCode();
}                                                                   }
            a)                                                                b)


Figura 4: Sintaxe adicional inserida na linguagem Java.

Um programa Java-RT consiste de um número arbitrário de atividades tempo-real, acompanhadas por um número arbitrário de threads executáveis, que não possuem restrições temporais associadas. Neste ambiente existem quatro tipos diferentes de atividades tempo-real, que podem ser individualmente caracterizadas como cíclicas, esporádicas, espontâneas ou ongoing. As definições de cada uma destas atividades são mostradas a seguir:

  1. As tarefas periódicas ou cíclicas são invocadas em períodos regulares fixos durante o decorrer da execução da atividade de tempo real.
  2. As tarefas esporádicas, por outro lado, não têm um período de execução fixo. Estas tarefas ocorrem em resposta a eventos externos. Quando as respostas a estes eventos são processadas dentro de um tempo específico, a tarefa é descrita como sendo uma tarefa de tempo real esporádica.
  3. Tarefas espontâneas são similares às esporádicas pois também atuam em resposta a eventos externos. Porém não há limite máximo na freqüência de execução destas tarefas. O executivo de tempo real permite a execução deste tipo de tarefa somente se existirem recursos suficientes para tal.
  4. As tarefas contínuas ou ongoing, diferentemente dos outros tipos de tarefas, caracterizam-se por serem suspensas e retomadas, em vez de reiniciadas a cada período de execução da atividade.
Uma outra consideração sobre a PERC-VM diz respeito à plataforma de execução. Embora não seja obrigatória a utilização de um RTOS, este é necessário para que sejam aproveitadas todas as propriedades do ambiente no que dizem respeito ao determinismo das tarefas e aos requisitos temporais. Diante disso, é esperado que o RTOS ofereça suporte para as seguintes propriedades: tarefas tempo-real, timers de alta precisão e semáforos.
 

3.4 Desenvolvimento de Aplicações PERC

Há duas técnicas para gerar aplicações utilizando os recursos do ambiente PERC, as quais encontram-se ilustradas na figura 5. A primeira destas técnicas consiste do uso de um pré-processador Java chamado p2jpp. Este processador traduz as primitivas especiais de temporização e de atomicidade para Java tradicional. Depois que o fonte PERC foi traduzido para Java, o mesmo pode compilar em Java byte-code, através do compilador tradicional da linguagem. Esta integração do processador p2jpp com de ambiente de desenvolvimento Java (IDE) é um trabalho que a NewMonics vem desenvolvendo.

A segunda técnica para a tradução do código PERC consiste do uso de um compilador especial Java chamado PercolatorTM, que combina a funcionalidade do p2jpp e do JavaC. A vantagem do Percolator está na análise adicional do código PERC, sendo que do código resultante desta análise é gerado o byte-code em arquivos .class. O propósito desta análise está na assistência da verificação do pior tempo de execução (worst case execution time), sendo eficiente na identificação do segmento de código que executa este tempo e também na identificação dos caminhos da execução do pior caso, correspondente a cada um dos segmentos de código.

Além disso, o código gerado pelo compilador Percolator, sugere que seja habilitado o tradutor JIT da máquina virtual, para a geração de um código mais eficiente. Estas sugestões são representadas como atributos de métodos Java dentro dos arquivos .class, cuja presença destes atributos não impede que o código seja executado através da máquina virtual Java tradicional. Isso só acontece porque a especificação oficial da máquina virtual Java exige que ela ignore qualquer atributo não reconhecido.


Figura 5: Processo de Desenvolvimento de uma aplicação PERC


 

4 Comparação PERC vs EJAE

Após o estudo dos ambientes apresentados é possível realizar uma comparação entre as suas principais características, as quais encontram-se resumidas na tabela 1. 
 
Feature PERC 1.0 EJAE 1.0.2
Dynamic Loading Opcional Necessário
Coletor de lixo tempo-real Sim Não
 Defragmentação do CL Sim Parcial 
Suporte RMI Não Sim 
 Bibliotecas Java lang, util, io, e net
do jdk 1.0.2
Todas jkd 1.1.7, exceto java.applet
Tarefas tempo-real Sim Não
Escalonamento Round-robin de
prioridade fixa
Não é especificada, variando
com a implementação


Tabela 1: Resumo das principais características dos ambientes estudados

Como principal diferença entre os ambientes cita-se a maneira como o PERC implementa o coletor de lixos, o que possibilita um bom desenpenho durante a execução da aplicação. Além disso, a política de escalonamento adotada permite garantir a satisfação dos requisitos temporais impostos no programa. Em relação às bibliotecas utilizadas, considera-se o EJAE mais avançado pois ao contrário do PERC, faz uso de uma biblioteca Java bastante atualizada, além de ser otimizada para dispositivos com restrições de memória. Por fim, cabe salientar que o PERC implementa algumas primitivas extras para a linguagem Java, o que permite a descrição de tarefas tempo-real.
 

5 Conclusões

Ao final deste trabalho verifica-se que o ambiente PERC encotra-se num estágio de desenvolvimento mais avançado, uma vez que foram realizadas novas implementações na máquina virtual Java da Sun a fim de suportar os requisitos temporais e de recursos existentes. Como desvantagem do PERC em relação ao EJAVA cita-se o fato do primeiro fazer uso de uma implementação muito antiga do JVM, o que impede a utilização de novos recursos como o RMI. Desta forma, idealiza-se que o ambiente ideal seja uma unificação dos ambientes pesquisados.
 

6 Bibliografia

[1] Technical Overview of EmbeddedJava Technology. Http ://java.sun.com/products/ embeddedjava/overview.html
[2] Overview of PersonalJava Technology. Http://java.sun.com/marketing/ collateral/pjava_ds.html
[3] EmbeddedJava Application Environment Specification. http://java.sun.com/products/ embeddedjava/spec/ejae-spec.html
[4] EmbeddedJava 1.0.2 Software Documentation.
[5] FOOTE, W. Teory versus Practice in Real-Time Computing with the Java Platform. Panel I of the Second IEEE Symposium on Object-Oriented Real-Time Distributed Systems. Saint-Malo - Fr, 1999. pp. 105-108.
[6] MELLO, R.; MORON, C.. Análise dos Mecanismos de Tempo-Real em Java.
II Workshop Brasileiro de Sistemas de Tempo Real. Salvador - BA.
[7] PERC FAQ. http://www.newmonics.com/about/Faq/faq.html
[8] Issues in the Design and Implementation of real-time Java. http://www.newmonics.com/ pdf/RTJI.ps
[9] PERC Real-Time API. http://www.newmonics.com/pdf/perc_api.pdf