Académique Documents
Professionnel Documents
Culture Documents
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.
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:
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:
Se bem que na realidade seja um meio de executar uma rotina em assembler para recorrer s instrues:
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
2 + 2.5
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:
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; }
herana: permite que um objecto ou classe de objectos seja derivado de outro j existente herdando todo o funcionamento do ancestral.
Mdia ( )
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.
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.
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.
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-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
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
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:
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-10
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:
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
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:
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
Sub-rotina
DR
(...) RET
(...) RTI
ADR21
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.
Fig. 4-4: Processo de gerao automtica de uma aplicao de tempo-real com o real-time workshop 4-14
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
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