Ismael Ripoll Sobre o Autor: Doutorado pela Universidade Polit�cnica de Valencia em 1.996. Professor de Sistemas Operacionais no Departamento DISCA. �reas de investiga��o de interese incluem tarefas em tempo-real e sistema operacionais. Usu�rio do Linux desde 1.994. Hobbies: Treking nos pirineus, esquiar e eletronica caseira. Escreva ao autor Indice: KU Real Time Linux (KURT) Para que serve oTempo Real? Modulos carreg�veis O programa de Tempo Real Comunica��es entre tarefas Conclus�es Bibliografia |
KU Real Time LinuxResumen: Neste segundo artigo dedicado ao RT-Linux, tratarei de oferecer uma vis�o mais pr�tica do RT-Linux. Antes de entrar em detalhes, gostaria de dar uma r�pida vis�o geral de um novo sistema operacional de tempo real sobre Linux KURT. KU Real Time Linux (KURT)No in�cio deste ano (1998) nos foi apresentado um novo sistema operacional de tempo real baseado no LINUX. KURT � um sistema de tempo real brando (soft, ou firm), isto �, se tentar cumprir os prazos de execu��o, mas no caso de alguma tarefa ser finalizado um pouco atrasado, n�o acontece nenhum desastre. As tarefas do tempo real do KURT, podem fazer uso de todas as facilidades do Linux, ao contr�rio das tarefas do RT-Linux. As melhorias --modifica��es-- foram realizadas sobre o n�cleo. s�o elas: Melhorar os picos do rel�gio do sistema. No Linux-i386, a frequencia de interrup��o do rel�gio � de 10ms (cem vezes por segundo), e � com esta resolu��o de tempo, que se mede um controle de a��es e mede-se o tempo. KURT utiliza o mesmo mecanismo de gerenciamento do tempo do RT-Linux. Programa o chip do rel�gio (8254) para que gere interrup��es sob baixa demanda, no lugar de faz�-lo de forma per�odica. Com isto, conseguimos uma resolu��o no rel�gio superior a um microsegundo. Foi modificado o planificador para incluir uma nova pol itica de planifica��o SCHE_KURT, al�m das que o Linux j� tinham implementadas, que s�o as que POSIX define: SCHED_FIFO, SCHED_RR y SCHED_OTHER. Fora acrescentadas novas chamadas ao sistema para poder fazer uso das novas funcionalidades do tempo real. As tarefas de tempo real s�o m�dulos de carga dinamica. Um dos aspectos mais caracter�sticos do KURT � a pol�tica de planiifica��o que utiliza. Foi implementado um planificador c�clico. Este tipo de planificadores se basea no uso de uma tabela (chamada plan) na qual estejam anotadas todas as a��es de planifica��o: instante de ativa��o, tarefa a executar, dura��o de ests, etc. A tabela � construida durante a fase de desenho do sistema e logo durante a execu��o, o trabalho do planificador consiste em ler sequencialmente a tabela e seguir suas indica��es. Quando chega ao final da tabela, volta a repetir a execu��o desde o princ�pio da tabela, da� o nome de pol�tica de planifica��o. Este m�todo de planifica��o tem muitas vantagens:
Para que serve o Tempo Real?Talv�z muitos achem que as t�cnicas de tempo real s� s�o utilizados na NASA, ou em m�sseis ou coisas do estilo. Bem que isto poderia estar certo alguns anos atr�s, hoje em dia, a situa��o mudou muito -- e h� de mudar muito mais--, devido a progressiva incorpora��o da inform�tica e a eletronica na vida cotidiana. O �mbito da vida cotidiana em que o tempo real mais est� presente, � no campo das telecomunica��es e nas aplica��es multim�dia. Por exemplo, se queremos que nosso computador seje campaz de reproduzir um arquivo de som gravado no disco, o programa ter� que continuamente (melhor dizendo, periodicamente) ler, descomprimir e enviar a placa de som os sons. Se no momento que estamos escutando a grava��o, estamos trabalhando com um editor de textos ou simplesmente estamos compilando o n�cleo do Linux, � facil percebermos os silencios devido a que o processador estar ocupado realizando outras tarefas. Se no lugar do som, o que estamos reproduzindo � v�deo, ent�o produziremos paradas ou cortes na imagem. Este tipo de sistemas s�o denominados sistema de tempo brando (o n�o cumprimento de um prazo de execu��o n�o produz um desastre grava, mas sim, uma degrada��o das presta��es). As aplica��es no RT-Linux v�o mais al�m das aplica��es estritamente de tempo real. Com RT-Linux podemos tomar o controle total do PC (digo PC e n�o o computador porque agora, n�o h� nenhuma implementa��o do RT-Linux para outra arquitetura) tal como podemos fazer no MSDOS. Em uma tarefa de tempo real, podemos acessar a todas as portas do PC, instalar manejadores de interrup��es, desabilitar temporariamente as interrup��es, ou seja, que podemos deixar a m�quina em suspenso, como se tratasse de um Windows. Esta possibilidade � muito atrativa para todos aqueles que gostam de conectar pequenos "gadgets" eletr�nicos ao computador. M�dulos carreg�veisPara entender e poder utilizar RT-Linux � necess�rio conhecer os m�dulos de carga din�micos do Linux. Matt welsh escrever um artigo completo em que explica com profundidade todos os aspectos dos m�dulos. O que s�o?Na maioria das implementa��es UNIX, a �nica forma de acessar o hardware (portas, mem�ria, interrup��es, etc.) � mediante os arquivos especiais, tendo previamente instalado o manejador de dispositivos (device driver). Apesar de que existem bons livros que explicam como construir manejadores de dispositivos, parece-nos ser um trabalho aborrecido e comprido, pois temos que implementar muitas fun��es para poder junt�-lo com o sistema operacional. Os m�dulos s�o "tro�os do sistema operacional" que podemos inserir e extratir em tempo de execu��o. Quando compilamos um programa composto por v�rios arquivos fonte, primeiro compilamos em separado cada arquivo para produzir o o arquivo objeto ".o" e logo depois unimos todos eles, resolvendo todas as referencias, para criar um �nico execut�vel. Suponhamos que o arquivo objeto que cont�m a fun��o main, pudessemos p�-lo em ejecu��o, e que o sistema operacional fosse capaz de carregar na mem�ria e juntar todo o restante dos arquivos s� quando fosse necess�rios. Bem, pois o n�cleo do Linux � capaz de fazer isto com o pr�prio n�cleo. Quando Linux inicia, s� carrega na mem�ria o execut�vel vmlinuz, que cont�m as partes indispens�veis, e logo em tempo de execu��o, pode carregar e descarregar seletivamente os m�dulos que esteje necessitando em cada momento. Os m�dulos s�o uma caracter�stica opcional do Linux, escolhidas quando compilamos o n�cleo. Os n�cleos de todas distribui��es que conhe�o, foram compilados com a op��o de m�dulos ativada. Podemos inclusive criar novos m�dulos e carreg�-los sem necessidade de recompilar nem reinicializar o computador. Uma vez carregado um m�dulo, passa a formar parte do pr�prio sistema operacional, pelo que:
Como podemos ver, um m�dulo de carga din�mico em s� mesmo, j� possui algumas caracter�sticas de tempo real; evita os atrasos por falha de p�gina e tem acesso a todos os recursos do hardware. Como criamos e utilizamos?Um m�dulo � criado a partir de uma fonte em "C". Continuando temos um m�dulo m�nimo (para poder fazer a maioria das seguintes ordens � necess�rio ser super-usu�rio, root) : ================ exemplo1 ================
Para compil�-lo utilizaremos os seguintes par�metros:
A op��o "-c" indica ao gcc que deve parar quando tiver criado o arquivo objeto, eliminando a fase liga��o (link). O resultado � o arquivo objeto exemplo1.o. O n�cleo n�o disp�e de "sa�da standard", pelo que n�o poderemos utilizar a fun��o printf()... em troca, o n�cleo oferece uma vers�o desta chamada printk(), que funciona quase igual, s� que o resultado � impresso no buffer circular de mensagens (kernel ring buffer). Neste buffer � onde escrevemos todas as mensagens do n�cleo, s�o as mensagens que vemos quando iniciamos o Linux. Em qualquer momento podemos ver o conte�do digitando o comando dmesg ou diretamente consultando o arquivo /proc/kmsg.Como podemos ver, a fun��o main() n�o existe e em seu lugar chamamos a fun��o init_module() sem nenhum par�metro. Antes de descarregar o m�dulo, chamamos cleanup_module(). Para carregar o m�dulo, fazemos com o seguinte comando: "insmod: .
Acabamos de instalar exemplo1 e executar sua fun��o init_module(). Se quisermos ver os resultados chamamos:
O comando lsmod nos permite listar todos os m�dulos que est�o em execu��o ou carregados no momento:
E finalmente com rmmod descarregamos um m�dulo:
a sa�da do dmesg nos mostra que executamos a fun��o cleanup_module(). S� nos falta saber como podemos passar par�metros a um m�dulo. N�o h� nada mais f�cil e surpreendente. Podemos atribuir valores �s vari�veis globais, como s�mente escrever a atribui��o como par�metro de insmod. Por exemplo :
agora j� sabemos todo o necess�rio sobre m�todos, voltemos ao RT-Linux. O programa de Tempo RealLembre,o-nos que para poder utilizar RT-Linux, primeiro tivemos que preparar o n�cleo do Linux para suportar os m�dulos de tempo real, opera��o que explicamos no primeiro n�mero da s�rie [refer�ncia a ele]. Podemos utilizar RT-Linux de duas formas distintas :
Neste artigo s� explicarei como utilizar RT-Linux como um sistema com prioridades fixas. O exemplo que vamos ver n�o faz nada "�til", t�o s�mente p�e em marcha (inicia) uma tarefa de tempo real, que � um simples caracol : ================== exemplo2 ==================
Para compil�-lo, utilizaremos o seguinte comando :
J� que este programa � um m�dulo, o ponto de entrada � a fun��o init_module(). O que ele faz primeiro � ler o instante de tempo atual e o guarda em uma vari�vel local; a fun��o rt_get_time() devolve o n�mero de RT_TICKS_PER_SEC transcorridos desde o momento que se inicializou o computador (que na atual implementa��o RT_TICKS_PER_SEC vale 1.193.180, o que d� uma resolu��o de 0.838 micro-segundos). com rt_task_init() inicializamos a estrutura task sem por em marcha a tarefa. O programa principal da tarefa rec�m criada � � fun(), o segundo par�metro � o valor do dado que se passou a nova tarefa quando come�ar sua execu��o, observe que fun() espera um par�metro do tipo int. O par�metro seguinte � o tamanho da pilha da tarefa, j� que cada tarefa tem uma fila de execu��o pr�pria, necessita uma fila pr�pria. O �ltimo par�metro � a prioridade neste caso, como uma s� tarefa no sistema, e podemos por qualquer valor de prioridade. rt_task_make_periodic() converte a tarefa task em uma tarefa peri�dica. O primeiro tempo � o instante de tempo absoluto em que se ativar� pela primeira vez e o seguinte par�metro indica o per�odo entre ativa��es sucessivas a partir da primeira. A tarefa de tempo real (fun��o fun()), � um loop infinito, dentro do qual existem duas a��es: um loop que s� serve para gastar o tempo, e logo chama rt_task_wait(). rt_task_wait(), � uma fun��o que suspende a execu��o da tarefa que a chama at� a pr�xima ativa��o, momento e que ele continuar� a execu��o com a seguinte instru��o, depois de rt_task_wait(). Observe que uma tarefa peri�dica n�o � executada desde o princ�pio de cada ativa��o, sim que a pr�pria tarefa tem que paralizar-se (quando finalizou seu trabalho) e esperar a pr�xima ativa��o. Desta forma podemos programar uma tarefa para que s�mente na primeira ativa��o realize certos trabalhos de inicializa��o. Para poder por o exemplo2 em execu��o, temos que instalar primeiro o m�dulo rt_prio_sched, pois necessitamos das fun��es rt_task_make_periodic(), rt_task_delete() e rt_task_init(). A fun��o rt_get_time() n�o est� dentro do n�cleo, e portanto n�o temos que instalar nada para poder utiliz�-lo.
J� que rt_prio_sched � um m�dulo do sistema, o criamos quando compilamos o n�cleo do Linux, e foi copiado para o diret�rio /var/modules/2.0.33/, podemos utilizar o comando modprobe, que � simplesmente uma forma mais f�cil de carregar m�dulos (� capaz de procurar o m�dulo pedido em v�rios diret�rios. Ver modprobe(1). Se tudo foi bem, com o comando lsmod podemos ver que os dois m�dulos foram carregados corretamente. Bem, pois j� temos uma tarefa de tempo real em andamento; Notas algo? Se o processador est� um pouco lento, possivelmente notar� que Linux est� um pouco diferente do normal. Podes aumentar o n�mero de intera��es do loop de fun(), variando o terceiro par�metro de rt_task_init(). Uma forma de apreciar que Linux utiliza menos tempo de processador com o programa ico, pois o tempo empregado para as tarefas de rempo real �, sobre todos os efeitos, como se o processador funcionasse mais limpo. Linux imagina que todos os seus processos precisam de mais tempo para fazer o mesmo. Se o tempo de computa��o (tempo necess�rio para executar todas as intera��es do loop) da tarefa � superior a 100 microsegundos, ent�o Linux suspender� suas atividades, pois a tarefa em background, e a tarefa de tempo real comsomem 100% do tempo. Realmente, Linux N�O suspendeu suas atividades, simplesmente n�o tem tempo de processador. Comunica��es entre tarefasNo RT-Linux, s� h� uma forma de comunica��es: Real-Time FIFO. O funcionamento � muito similar ao que acontece em PIPE's do Unix, a comunica��o � por fluxo de dados sem estrutura. Uma FIFO � um buffer de bytes de tamanho fixo, que podemos fazer opera��es de leitura e escrita. Com os FIFOS, podemos comunicar tanto tarefas em tempo real entre s�, como tarefas em tempo real com processos Linux normais.
Desde o ponto de vista de um processo Linux normal uma FIFO � um arquivo especial de caracteres. Normalmente estar� no diret�rio /dev/rtf0, dev/rtf1, etc. Estes arquivos n�o existem no Linux, portanto temos que cri�-los. Podemos fazer da seguinte forma: Se precisamos de mais FIFOs, s� temos que cri�-los rtf4, rtf5 etc. Os arquivos especiais s�o a interface de acesso a um manobrador do sistema operacional, mas se o manipulador n�o existe, ent�o de nada serve o arquivo especial, isto feito, tentar abrir um arquivo especial do qual o sistema operacional n�o tem o manipulador associado, falhar�.
Os FIFOs s�o utilizados como fossem arquivos normais (open read/write close). Para poder utiliz�-los, tem que existir, isto �, uma tarefa de tempo real tem que ter criado o FIFO antes que um processo normal do Linux possa fazer um open sobre ele.
A partir do ponto de vista de uma tarefa em tempo real, os FIFOs s�o utilizados mediante fun��es espec�ficas:
Vejamos agora um exemplo de sistema que faz uso desta fun��es. Este exemplo � uma pequena modifica��o de um dos exemplos que existe na distribui��o do RT-Linux (sound): ================== exemplo3 ==================
Exatamente como no exemplo2, necessitamos dos servi�os do m�dulo rt_prio_sched, mas agora tamb�m precisamos dos sevicos do m�dulo rt_fifo_new para poder utilizar os FIFOs. Se criarmos uma tarefa de tempo real peri�dica, com uma frequencia de 8192Hz. Esta tarefa l� bytes da FIFO zero e se encontra alguma coisa o envia a porta do altofalante do PC. Se copiamos um arquivo de som no formato ".au" no diret�rio /dev/rtf0, poderemos ouvi=lo. N�o � necess�rio dizer que a qualidade de som � p�ssima, pois o hardware do PC s;o permite utilizar um bit para modular sinal. No diret�rio testing/sound da distribui��o, podemos encontrar o arquivo Linux.au para fazer provas. Para compil�-lo e xecut�lo:
Observe como o programa cat pode utilizar para escrever sobre qualquer arquivo, incluidos os arquivos especiais. Tamb�m poder�amos utilizar o comando cp. Para poder ver como afeta o tempo real a qualidade de reprodu��o, s� temos que escrever um programa que fa�a o mesmo, mas desde um processo de usu�rio: ================== exemplo4 ==================
Este programa � compilado como um programa normal:
e para execut�-lo:
Para poder acessar as portas hardware do computador a partir de um programa normal de Linux, temos que pedir permiss�o ao sistema operacional. Isto � uma medida de prote��o b�sica e necess�ria para evitar que um programa possa acessar por exemplo so disco r�gido diretamente. a chamada ioperm(0 serve para indicar ao sistema operacional que queremos acessar a um determinado n�vel de endere�os de entrada/sa�da. S� ser� concedido o acesso aos programas sendo executados com permiss�o de super-usu�rio. Outro detalhe a destacar � como se gera a frequencia de 8192Hz, para se emitir o som. Se bem que existe a chamada nanodelay(), esta s� tem uma resolu��o do milisegundo, pelo que temos que fazer uso da temporiza��o por loop de espera. O loop est� ajustado para que mais ou menos funcione sobre um Pentium 100Mhz. Agora prova e executa o exemplo4 junto com o programa ico. O que se ouve? Te parece agora que o tempo real serve para alguma coisa? Conclus�oEste segundo artigo teve como ponto central os detalhes de programa��o de tarefas de tempo real. Os exemplos apresentados s�o bastante simples e necessitam de utilidades, no segundo n�mero, apresentarei uma aplica��o mais �til. Poderemos controlar a televis�o a partir do Linux, ou mais surpreendente, controlar teu Linux � distancia (controle remoto)!!
Bibliografía:
|
Esta website � mantida por by Miguel Angel Sepulveda © Ismael Ripoll 1998 LinuxFocus 1998 |