• Nenhum resultado encontrado

Características de uma linguagem para aplicações de tempo real

5. A IMPLEMENTAÇÃO DE UM AMBIENTE PARA CONSTRUÇÃO DE

5.2 Características de uma linguagem para aplicações de tempo real

Uma linguagem de programação de alto nível orientada para aplicações de tempo real deve apresentar algumas características e propriedades as quais são apresentadas a seguir /YOU 78/:

a) Portabilidade: idealmente a linguagem deve ser independente da máquina. Na prática, isto não é facilmente obtido devido as diferenças no tamanho das palavras e nos mecanismos de E/S.

b) Segurança: as construções da linguagem devem ser concebidas de forma que permitam a detecção do maior número possível de erros em tempo de compilação e durante a execução.

c) Estrutura: deve prover estruturas de dados adequadas para construções de sistemas de tempo real. Em particular deve prover tipos de dados tais como bits, bytes, matrizes, registros e apontadores.

A estrutura dos comandos deve ser tal a permitir que e a codificação em si seja auto documentada e explanatória de modo a estimular o uso dos princípios de programação estruturada.

e) Simplicidade: as construções da linguagem devem ser simples e consistentes de modo a permitir um fácil aprendizado pelos usuários além de facilitar a construção de compiladores.

f) Flexibilidade: a linguagem deve ser adequada para todos os aspectos do desenvolvimento de software de tempo real tanto a nível do sistema quanto a nível de usuário.

g) Concorrência: a linguagem deve suportar programação concorrente com a definição de módulos independentes.

h) Reentrância e recursividade: os procedimentos devem se reentráveis para permitir o compartilhamento de rotina por tarefas concorrentes e o uso de técnicas recursivas.

Muitas das características apresentadas acima são conflitantes. Por exemplo, a previsão de segurança em tempo de execução (b) inevitavelmente implica em uma redução substancial na eficiência contrariando (d). Na prática, o projeto de linguagem de tempo real é um compromisso entre essas necessidades conflitantes.

5.3 Linguagens de alto nível com extensões de tempo real

Linguagens de alto nível tais como BASIC, PASCAL, C e FORTRAN podem ser usadas para aplicações de tempo real, desde que sejam estendidas através de rotinas apropriadas. Normalmente é necessário utilizar rotinas assembly na programação de certas funções.

Esta abordagem tem como principal vantagem o fato de tais linguagens serem bem difundidas, fáceis de usar, além de possuírem diversas implementações (compiladores) para os mais variados tipos de sistemas.

É interessante fazer uma rápida análise das vantagens e desvantagens no uso de cada uma das quatro linguagens mencionadas.

O BASIC por ser uma linguagem interpretada, usualmente é lenta para aplicações críticas com relação ao tempo. Por outro lado em casos onde não existem restrições quanto ao tempo de execução uma linguagem interpretada pode ser interessante devido principalmente as facilidades de depuração e teste.

FORTRAN por sua vez pode ser usado em aplicações críticas de tempo com a vantagem de possuir uma grande quantidade de software de suporte na forma de biblioteca de sub-rotinas, otimizadores e depuradores. Entretanto o mecanismo de alocação estática de memória do FORTRAN, que impede a chamada reentrante de procedimentos, sua inabilidade na manipulação de endereços, característica importante para manipulação de listas, e seus tipos de dados fixos vão de encontro aos aspectos de programação de sistemas para aplicações de tempo real.

Atualmente Pascal e C são duas linguagens que estão sendo cada vez mais usadas para aplicações de tempo real. Uma comparação entre estas duas linguagens deve ser feita separadamente da avaliação de compiladores em particular. Entretanto o conceito de que o C por suas características deva permitir uma geração de códigos mais eficiente deve ser questionado. O estilo de programação possível em C, permitindo construções dependentes da máquina e o uso de efeitos colaterais, podem causar problemas para os algoritmos de otimização de código /HOD 84/.

Para construções de programas autodocumentados o Pascal é preferível ao C por possuir um conjunto mais rico em tipos de dados e construções de controle mais elegantes. A combinação da clareza da estrutura da programação do Pascal com os tipos de dados definidos pelo usuário resultam num estilo de programação que em muitas ocasiões é usado como linguagem de descrição para especificações. Um exemplo é o documento de definição da Ethernet publicado pela Xerox, Intel e DEC /XER 80/.

A popularidade do C é devida em parte a sua relação como sistema Unix e por duas razões que podem ser questionados, as quais são: permissividade e portabilidade.

A permissividade do C com suas convenções implicadas dos tipos de dados básicos e operações com bits dificultam a detecção de erros em tempo de compilação. Por sua vez o Pascal com a sua verificação de tipos (typing cheking) e sua lógica severa permite uma maior verificação de erro.

A portabilidade do C é questionável. A possibilidade de rodar um programa de um sistema em outro sem realizar alterações só é possível se tal programa for escrito seguindo um padrão bem definido. Geralmente são necessários alterações dependentes de características do compilador, da máquina ou do ambiente. Pelo fato de não possuir um padrão, como o Pascal, fica difícil determinar as

dependências de um programa escrito em C com relação aos compiladores. A dependência com relação ao hardware ocorre também mais extensivamente no C devido a sua maior permissividade. Finalmente tem-se as dependências do ambiente que ocorrem nas áreas de interface, tais como manipulação de E/S e de arquivos. Em C as rotinas de E/S não integram o escopo da linguagem sendo uma área que necessita de consenso com relação a portabilidade.

A clareza de Pascal aliada a programação modular e uso isolado de extensões da linguagem permitem a obtenção de programas altamente portáveis.

Uma comparação mais completa entre PASCAL e C é apresentada por Feuer e Gehani /FEU 82/ e Hemingway /HEM 84/. Por estas razões o PASCAL parece ser a linguagem, dentre as mencionadas, mais indicada para aplicações de tempo real.

6. NÚCLEO

O núcleo, ou kernel como as vezes é chamado, é o único componente de software do sistema executado de modo não interrompível.

O acesso ao núcleo ocorre devido a um TRAP ou a uma interrupção, sendo que o mecanismo de acesso garante que ao executá-lo o processador esteja com seu sistema de interrupções desabilitado. Por ser o único componente do sistema que toma conhecimento da ocorrência de interrupções o núcleo deve conter, obrigatoriamente, as rotinas de atendimento destas.

Externamente ao núcleo de todas as interrupções são transparentes não afetando o desenvolvimento lógico das tarefas. Uma tarefa em execução pode ser interrompida, perdendo temporariamente o processador. Este porém é o único efeito que uma interrupção causa em uma tarefa.

O núcleo cria a impressão de que cada tarefa possui seu próprio processador. Cada um destes processadores virtuais comporta-se exatamente como um processador real, exceto por ter uma taxa de execução variável, a qual é determinada pelo núcleo.

Por serem executadas de forma não interrompível as rotinas componentes do núcleo devem ser tão pequenas e simples quanto possível. A escolha destas rotinas depende do tipo de aplicação a que o sistema se destina. Uma boa política é incluir no núcleo todas as rotinas relacionadas com a segurança do sistema deixando as funções restantes serem suportadas por tarefas do sistema.

No sistema que está sendo aqui descrito as funções suportadas pelo núcleo são: funções para criação e gerência de tarefas; funções para comunicação e sincronização de tarefas; funções para controle de tempo e funções para manipulação de interrupções.

Documentos relacionados