Vous êtes sur la page 1sur 16

Sistemas de tempo real (resumos)

4 Linguagens de programao
Determinadas caractersticas da linguagem podem ser suficientemente importantes para aplicaes de tempo real, de modo a influenciar a escolha de uma linguagem para um dado projecto. Neste captulo vo ser discutidas as principais caractersticas que podem interessar neste contexto. So tambm revistas algumas linguagens utilizadas para tempo real. Ser ainda brevemente abordada a gerao de cdigo.

4.1 Caractersticas das linguagens de programao para sistemas de tempo real


Um meio de partida para determinar as caractersticas necessrias de uma linguagem so os requisitos do utilizador segundo (Barnes, 1976; Young, 1982):

Segurana a capacidade da linguagem detectar erros automaticamente durante a compilao ou durante a execuo (run-time errors). A deteco de erros durante a execuo implica a linkagem de um sistema de deteco de erros com a aplicao, incrementando o tamanho desta. Pode no entanto numa fase de testes utilizar-se esta facilidade, e depois retir-la da verso final. Um exemplo comum de deteco de erros de run-time a verificao dos limites de um array, quando dos acessos a esse.

No entanto os erros de lgica do programa so da responsabilidade do programador e no podem ser detectados automaticamente.

Clareza uma medida da facilidade com que a operao de um programa pode ser entendida, sem recurso a documentao tal como fluxogramas ou descries em linguagem natural. Por exemplo, a programao de uma operao com as matrizes A, B e C em C++, recorrendo a sobrecarga de operadores poderia ser feita:

D = A * (B + C);

4-1

Sistemas de tempo real (resumos) Ao paso que em ANSI C, visto no existir a possibilidade de sobrecarga de operadores:

D = mmult (A, madd (B, C));

Quanto mais claro for um programa mais fcil detectar erros de lgica ou de concepo, bem como efectuar alteraes. Claro que esta clareza necessita da cooperao do programador. possvel escrever cdigo intragvel em qualquer linguagem. No entanto pode-se assumir que linguagens de alto nvel so mais claras que as de baixo nvel.

Flexibilidade mede a capacidade de uma linguagem poder ser utilizada para programar os mais variados tipos de aplicao sem recurso a cdigo em assembler.

Em sistema de tempo real particularmente importante controlar perifricos. Por exemplo em C/C++, se bem que a linguagem no o permita, comum a existncia de funes para aceder a portos de entrada -sada:

inp, outp, ...

Se bem que na realidade seja um meio de executar uma rotina em assembler para recorrer s instrues:

IN, OUT, ...

Simplicidade Normalmente, quanto mais simples for a linguagem maior tambm a segurana. Alm disso normalmente leva tambm gerao de cdigo mais eficiente.

4-2

Sistemas de tempo real (resumos) SmallTalk C Complexidade Assembler CISC Assembler RISC Micro-cdigo

Portabilidade A portabilidade de uma aplicao normalmente mais difcil em sistemas de tempo real, pois normal o cdigo utilizar caractersticas de hardware, que podem no existir, ou pelo menos requerer um tratamento diferente, noutro. Uma forma de aumentar a portabilidade desenhar a aplicao para uma mquina virtual, que dever ter suporte para os vrios sistemas onde se pretender executar a aplicao. (Ex.: PVM, Java VM, SmallTalk VM). No entanto esta abordagem implica uma perda no desempenho da aplicao, que pode no ser aceitvel para um sistema de tempo real.

Eficincia

Eficincia pode ser interpretada de duas formas: reduo no tamanho da aplicao e velocidade de desempenho desta. Normalmente quanto mais rpido for o cdigo maior o seu tamanho (e vice-versa). Os compiladores de hoje em dia permitem alguns nveis de optimizao de cdigo para velocidade ou espao.

Para cumprir os requisitos acima descritos as linguagens devem ter as seguintes caractersticas:

4.1.1 Tipagem
Linguagens tipadas requerem que cada varivel ou constante seja de um tipo especfico e que seja declarada antes de usada. Linguagens com tipagem forte no permitem a mistura de tipos em operaes. Se se pretender implementar aritmtica mista, variveis de diferentes tipos de dados devem ser explicitamente convertidas. Desta forma a segurana das operaes aumentada J as converses em linguagens com tipagem fraca podem ser implcitas, como o caso do C/C++. Nesta linguagem as variveis so convertidas para o tipo com maior ndice de 4-3

Sistemas de tempo real (resumos) generalidade, i. e. um tipo onde possam ser representadas ambas as quantidades, como mostra a decomposio da operao seguinte:

Cdigo C

Decomposio efectuada automaticamente pelo compilador (no visvel)

2 + 2.5

2 + 2.5 (float) 2 + 2.5 2.0 + 2.5 4.5

Neste caso so geradas instrues que consomem tempo mas no so visveis.

4.1.2 Tipos de dados abstractos


Pode-se definir dados abstractos como entidades que no podem ser representadas por nmeros simples. Tipagem de dados abstracta inclu a representao e manipulao de dados que no so suportados pela linguagem, como por exemplo o tipo de dados complexo em C++. A tipagem de dados abstracta torna uma linguagem mais clara e a programao mais fcil.

As linguagens orientadas por objectos possibilitam um alto grau de abstraco de dados e encapsulamento. O encapsulamento protege a informao, pois o acesso aos dados do objecto pode forado a ser apenas efectuado por mtodos, separando a implementao por um interface:

rea pblica: Variveis pblicas Prottipos dos mtodos

rea privada: Variveis privadas Definio dos mtodos

Estas linguagens suportam tambm: 4-4

Sistemas de tempo real (resumos) polimorfismo: permite que uma s funo possa ter mais que uma lista de parmetros de entrada, e que tenha comportamento diferente para cada uma. Em C++, por exemplo uma funo pode ter comportamentos diferentes dependendo da lista de parmetros de entrada:

void mult (float n, float *A, int l) { for (int i=0; i<l; i++) *A = *A * n; }

void mult (float n, float m) { return n * m; }

herana: permite que um objecto ou classe de objectos seja derivado de outro j existente herdando todo o funcionamento do ancestral.

Pessoa Nome Morada Genero

Estudante Nmero Estabelecimento

Trabalhador Salrio Empresa

Mdia ( )

Fig. 4-1: Herana

4-5

Sistemas de tempo real (resumos) Se bem que estas facilidades aumentem a clareza do cdigo, e por isso sejam utilizadas em sistemas de tempo real, existe uma penalizao em termos de desempenho que pode ser na ordem de 20% ou mesmo mais entre C e C++. Claro que vai depender de cada aplicao. Uma comparao entre C e objective C (outra variante orientada por objectos de C) resultou numa diferena de 43%. J linguagens orientadas por objectos interpretadas, como o SmallTalk costumam ser 5 a 10 vezes mais lentas que o C convencional.

4.1.3 Constantes
Algumas quantidades fsicas ou matemticas tais como a velocidade da luz e Pi, so constantes. Se bem que se possa inicializar uma varivel com um dado valor, no existe nenhuma garantia que um mdulo do programa no altera esse valor. Assim as constantes aumentam a segurana de um programa. Alguns compiladores geram tambm cdigo mais eficiente para algumas operaes, se lidarem com constantes em vez de variveis.

4.1.4 Passagem de parmetros


Normalmente existem trs tipos de passagem de parmetros para sub-programas:

passagem por valor: O argumento copiado atravs da pilha para uma varivel local do sub-programa, de modo que alteraes nesta no se reflectem no argumento.

func (int a, float b)

passagem por referncia: passado para o sub-programa o endereo do argumento. Normalmente tambm via pilha. Neste caso as alteraes efectuadas pelo subprograma so efectuadas no prprio argumento. Este um modo de passar valores para fora de um sub-programa.

func (int *a, float *b)

variveis globais: variveis que esto no alcance (scope) de todos os modos de um programa, podem tambm ser usadas para partilhar informao entre mdulos ou sub-programas.

4-6

Sistemas de tempo real (resumos) A passagem de parmetros por valor no deve ser usada com variveis de grande dimenso, para no ocupar espao desnecessrio na pilha. Normalmente o acesso a valores atravs de variveis globais, mais rpido que aos parmetros, pois pode ser utilizado o modo de endereamento directo, em vez do indirecto. Mas como qualquer mdulo pode aceder a essa varivel o seu valor pode ser indevidamente alterado, tornando mais difcil a deteco de erros no cdigo. Por outro lado, normalmente as interrupes so desligadas durante a passagem de parmetros para evitar que uma rotina de tratamento de interrupo que seja executa quando s parte dos parmetros foram passados, no altere os que ainda no foram.

Assim, sempre que os requisitos temporais sejam cumpridos, devem-se usar listas de parmetros em detrimento de variveis globais, pois aumenta a segurana da informao e a clareza do cdigo.

4.1.5 Recursividade
Se bem que o uso de funes recursivas pode clarificar o cdigo, existe sempre uma penalizao em termos de desempenho quando comparada com a verso iterativa. Isto tem a ver com o facto da funo se chamar a si prpria ter um custo adicional na passagem de parmetros e colocao do endereo de retorno na pilha, quando comparado com o incremento e comparao de uma varivel na verso iterativa. Alm disso impossvel saber partida os requisitos de memria. A quantidade de pilha necessria depende do nmero de vezes que a funo se chama a si prpria, e este normalmente depende de um ou mais argumentos que so calculados durante a execuo. Isto gera alguma imprevisibilidade. Uma forma de manter a clareza para o programador e no perder em eficincia e previsibilidade seria o compilador aceitar o cdigo fonte recursivo e traduzi-lo para a sua verso iterativa quando da compilao.

4.1.6 Alocao dinmica de memria


Aplicaes para tempo real podem fazer eficiente uso da memria para armazenar estruturas como pilhas, listas rvores usando alocao dinmica de memria. Se esta facilidade no existir a dimenso mxima dessas estruturas ter de ser conhecida em tempo de compilao, o que gera um aproveitamento ineficiente de memria.

4-7

Sistemas de tempo real (resumos) A alocao dinmica de memria implica no entanto um custo na velocidade de execuo, que pode variar dependendo da fragmentao do Heap. Esta fragmentao sucede medida que memria previamente alocada vai sendo disponibilizada, tornando o tempo de busca de um espao disponvel imprevisvel:

Memria disponvel

Fig. 4-2: Heap Fragmentado

4.1.7 Tratamento de excepes


As excepes no devem ser confundidas com interrupes. Uma interrupo externa depende apenas de um dado perifrico (uma interna depende de quando qualquer tarefa efectuar uma chamada interrupo usando uma instruo INT) e pode suceder em qualquer altura durante a execuo do programa, no podendo pois ser prevista por este. J uma excepo ocorre quando algum erro ou condio anormal encontrada num programa. Um exemplo comum a diviso por zero. Esta condio no entanto tratada normalmente em micro cdigo. prefervel que a linguagem suporte algum mecanismo de tratamento de excepes de alto nvel, o caso do C++, de modo aumentar a segurana. Em linguagens que no suportam nativamente o tratamento de excepes, como por exemplo Pascal, Modula-2 e C, este pode no entanto ser implementadas pelo utilizador numa biblioteca.

4.1.8 Modularidade
De um ponto de vista de engenharia de software, a modularizao de uma aplicao tem a vantagem do encapsulamento de dados (como j foi visto para linguagens orientadas por objectos). assim possvel esconder a informao, pois o mdulo funciona como uma caixa preta, com um interface visvel para que outros mdulos possam comunicar com ela, sem que seja possvel saber como realmente esto implementadas as suas funcionalidades, aumentando assim a segurana. A modularizao permite tambm que o cdigo seja re-aproveitado, pois um mdulo que possa ser compilado separadamente, pode ser usado em vrias aplicaes. 4-8

Sistemas de tempo real (resumos) Deve no entanto ser tomando em conta que a modularizao tem um custo em desempenho, que normalmente negligencivel (como j foi referido a chamada de uma funo ou procedimento implica que sejam passados valores e endereos atravs da pilha).

Em Modula-2 o conceito de mdulo como foi atrs referido implcito. Em muitas verses do Pascal existe algo semelhante chamado Unit. Estas unidades tem um rea de cdigo visvel chamada interface, onde so colocados os prottipos das funes e procedimentos, bem como de variveis visveis para o exterior. Noutra rea privada, denominada implementation esto ocultas as definies dos sub -programas. Em Ada existe um conceito semelhante denominado package.

4.1.9 Multitarefa
Num sistema de tempo real poder ser conveniente dividir a gesto em tarefas. O suporte para multitarefa pode ser efectuado ao nvel do sistema operativo, que deve disponibilizar meios de sincronizao e comunicao entre processos concorrentes, como ser visto mais adiante. Por outro lado a prpria linguagem poder ter suporte para multitarefa permitindo a criao de processos dinamicamente, a sua sincronizao com semforos por exemplo, e a comunicao entre estes quer atravs de segmentos de memria partilhada ou de can ais.

4.1.10

Acesso directo ao hardware

Na programao de sistemas de tempo real frequente o acesso directo ao hardware, sem utilizar um controlador de dispositivo ou driver. Para isso a linguagem deve ser suficientemente flexvel, disponibilizando meios de escrever ou ler dados de portos de entrada-sada. Como j foi referido, na linguagem C/C++ comum existirem bibliotecas com funes especializadas para este efeito. tambm conveniente que a linguagem possa definir variveis em endereos da memria fsica, especificados pelo programador. Em Modula-2:

VAR ch [D000000H] : CHAR;

Alguns compiladores de PASCAL suportam a declarao:

VAR n : INTEGER; absolute $D000:0000; 4-9

Sistemas de tempo real (resumos)

Em compiladores de C/C++ sempre possvel usar um ponteiro:

char *cp = 0xD0000000;

Tambm se pode revelar muito til alguma forma de lidar com interrupes

Mascar-las Suspende-las Aguardar por uma interrupo Desviar os ponteiro (elementos do vector de interrupes) para rotinas definidas pelo programador

Claro que se a linguagem permitir tambm codificao de mdulos em baixo nvel, como o caso da maior parte das linguagens hoje em dia, que permitem escrever cdigo assembler inline com o cdigo de alto nvel, o acesso directo ao hardware pode sempre ser efectuado

4.2 Linguagens normalmente utilizadas


A escolha de uma linguagem deve ser feita de acordo com aplicao que se pretende desenvolver. Muitas vezes depende tambm da preferncia do programador ou da disponibilidade de programadores treinados numa dada linguagem. Outras vezes dependem do suporte, i.e., as ferramentas que acompanham a distribuio (IDE, profiler, debbuger, ...) Pode-se afirmar que desde que uma linguagem permita codificar mdulos ou rotinas em cdigo de mquina ser sempre possvel codificar qualquer aplicao mas a custo da portabilidade. No deve ser esquecido que em sistemas de tempo real pretendem-se aplicaes previsveis seguras e tambm eficientes. A seguir apresenta-se algumas das linguagens utilizadas em sistemas de tempo real.

4-10

Sistemas de tempo real (resumos)

4.2.1 FORTRAN
a mais antiga linguagem de alto nvel ainda utilizada em sistemas de tempo real. Surgiu em 1957, se bem que posteriormente fosse revista (FORTRAN IV, FORTRAN 77, FORTRAN 90) continuam a faltar-lhe caractersticas tais como:

Alocao de memria dinmica Tratamento de interrupes e tratamento de I/O com perifricos (DMA, memory mapped, isolated) Tratamento de excepes Tipos de dados abstractos

O que significa que parte do cdigo tem de ser programado em assembler, tornando menos claro e a portabilidade mais difcil. Um argumento para a sua popularidade continuada costuma ser que existem muitas bibliotecas programadas em FORTRAN disponveis, as quais j foram ao longo do tempo mais que ensaiadas, aumentando portanto a garantia de estabilidade e assim a segurana.

4.2.2 Modula-2
Modula-2 foi definida como uma extenso do Pascal. Ao contrrio deste permite desenvolver aplicaes multitarefa ao suportar:

Criao Dinmica de processos ou threads

bem como facilidades de baixo nvel:

alocao dinmica de memria Procedimento com tipo Interrupt, podem ser usados para tratamento de interrupes. (se bem que as verses actuais do Pascal tambm o suportem)

A necessidade do tipo interrupo tem a ver como em baixo nvel o fluxo do programa desviado. Por exemplo em assembler Intel (80x86), para chamar uma sub-rotina utilizada uma instruo:

4-11

Sistemas de tempo real (resumos)

Call <endereo>

De modo que o PC carregado com esse endereo. No fim da sub-rotina utilizada a instruo RET, que vai buscar pilha o endereo de retorno. J no caso de interrupes, se bem que estas sejam tambm sub-rotinas o modo de cham-las diferente. usada a instruo:

INT <nmero da interrupo>

Que vai consultar no vector de interrupes, posio dada por <nmero da interrupo> o endereo da rotina de tratamento da interrupo. O retorno da interrupo efectuado com a instruo RTI.

Memria RAM

Programa principal

CALL ADR () INT 21 ()

Sub-rotina

DR

(...) RET

Tratamento da interrupo 21 (DOS services) 1023 Vector de interrupo 45 DR21

(...) RTI

ADR21

0 Fig. 4-3: Exemplo de chamadas a interrupes e a sub -rotinas em assembler 80x86

4-12

Sistemas de tempo real (resumos) Alm destas, a modularizao est implcita nesta linguagem. Todas estas caractersticas tornam-na indicada para implementao de aplicaes de tempo real.

4.2.3 C/C++
Costuma ser definida como uma linguagem de alto nvel mas tambm prxima da mquina, o que facilita o tratamento directo do hardware. Se bem que a linguagem tenha um conjunto limitado de instrues, mantendo-se simples existem bibliotecas padro que permitem:

Criao dinmica de threads ou processos. Alocao de memria dinmica Tratamento de interrupes e tratamento de I/O com perifricos (DMA, memory mapped, isolated) Tipos de dados abstractos (em C++ o suporte claramente superior) Tratamento de excepes (muito melhorado em C++)

A linguagem C permite o desenvolvimento de cdigo estruturado, com muita flexibilidade e mantendo-se bastante simples. A linguagem C++ aumenta a facilidade de manuteno, mas para isso existe um custo em eficincia, pois o cdigo pode ser mais de 20% mais lento.

4.2.4 ADA
Foi desenvolvida nos anos 80 como um esforo para uma linguagem Universal (all-porpose), que simplificasse a manuteno e a segurana da aplicao e simultaneamente gerasse cdigo eficiente. O padro corrente ADA 95 suporta:

Fortemente tipada ( feita uma extensiva verificao de tipos na compilao) Tipos de dados abstractos alocao dinmica de memria Suporte para multitarefa Tratamento de excepes Permite o tratamento de interrupes (suporta o tipo interrupt) Tem facilidades de baixo nvel

4-13

Sistemas de tempo real (resumos) Recursividade Orientada por objectos (ADA 95) Modularidade

Todas esta caractersticas fazem com que esta linguagem seja ideal para sistemas de tempo real, no entanto as primeiras verses geravam cdigo ineficiente e pior ainda imprevisvel. Se a ADA 95, e os novos compiladores resolveram todos estes problemas fica fora do mbito da disciplina.

4.2.5 Simulink real-time workshop


Com o real-time workshop possvel gerar cdigo fonte C ou Ada a partir de um modelo em simulink. Esse cdigo deve depois ser compilado com um compilador apropriado de modo a gerar uma aplicao.

Fig. 4-4: Processo de gerao automtica de uma aplicao de tempo-real com o real-time workshop 4-14

Sistemas de tempo real (resumos)

Essa aplicao tem de ser carregada e executada por um ncleo de tempo real. O simulink encarrega-se disso e pode ser utilizado tambm para monitorizar a aplicao pois comunica com o ncleo de tempo real. O Matlab 6.0 disponibiliza num pacote um tal ambiente para windows, com excepo do compilador. No Cd de distribuio existe extensa informao sobre a instalao e utilizao.

4.2.6 Assembler
As linguagens assembler se bem que sejam difceis de aprender e lhes falte a maior parte das caractersticas das linguagens de alto nvel acima referidas, permitem um controlo do hardware mais directo. Uma regra diz que no mximo 10% do cdigo de uma aplicao deve ser escrita em assembler. Isto no deve ser definitivo. Em termos de clareza se for possvel evitar o assembler melhor. Esta linguagem s deve ser usada em casos que a linguagem de alto nvel no suporte (normalmente no controlo de algum hardware) ou em segmentos de cdigo onde se pretende gerar cdigo eficiente e o compilador no consiga automaticamente optimizar. Nestes casos til um profiler, i. e., uma ferramenta que indica, no cdigo fonte, o tempo requerido pelo programa linha a linha (ou segmento a segmento de cdigo).

4.2.7 Outras
Poder-se-iam ainda indicar outras linguagens tais como Coral66 uma extenso do Algol60 com algum suporte para baixo nvel. O RTL/2 uma primeira tentativa de desenvolver uma linguagem para sistemas de tempo real, que suporta multitarefa e tem suporte para baixo nvel e modular

4.3 Gerao de cdigo


O cdigo de mquina gerado pelo compilador pode ser diferente, para o mesmo cdigo fonte de alto nvel, na mesma mquina, dependendo da optimizao para velocidade ou espao, uso de memria e registos, etc.. Isto pode levar a cdigo ineficiente ou imprevisvel. Deste modo o programador de sistemas de tempo real, em qualquer situao deve saber como o cdigo de alto nvel traduzido pelo compilador. Uma forma de fazer isto escrever construes de alto nvel e verificar como que o compilador as traduz para assembler, dependendo das condies de compilao e optimizao de cdigo. 4-15

Sistemas de tempo real (resumos)

Outras referncias para alm da bibliografia indicada no programa: Barnes, J. G. P. 1976. RTL/2 Design and Philosophy, Heyden

Young, S.J. 1982. Real-time Languages: Design and Development, Ellis Horwood

4-16

Vous aimerez peut-être aussi