segunda-feira, 11 de maio de 2009

Compilando o RTAI no Ubuntu

Para os meus colegas que já estavam cobrando a um tempo, aqui vai o resumo dos procedimentos de compilação do RTAI no Ubuntu. Basicamente são os mesmos passos que o Debian. Lembrar que a compilação do RTAI NÃO funciona no gcc 4.3, então você DEVE usar a versão 3.4.

Aqui descreve-se os procedimentos básicos para a compilação de um kernel vanilla no ambiente Ubuntu. A versão utilizada no Ubuntu é a versão 7.10. Povavelmente o procedimento funcione com outras versões do Ubuntu, bem como outras distribuições baseadas no Debian. Utilizou-se o jeito Debian de se compilar e instalar o kernel do Linux.

Procedimento de Compilação do Kernel de Tempo Real

Os procedimentos a seguir devem ser realizados como superusuário (root), inclusive os testes no RTAI.

Preparativos
  1. Criar diretorio dos fontes:

    $ mkdir /usr /usr/src

  2. Ir para o diretorio de fontes:

    $ cd /usr/src

  3. Baixar o linux e o rtai:

    $ wget www.rtai.org/RTAI/rtai-3.6.bz2
    $ ftp ftp.kernel.org
    login> anonymous
    pass>
    ftp> pass
    ftp> bin
    ftp> cd /pub/linux/kernel/v2.6/
    ftp> get linux-2.6.23


  4. Descompactar os fontes:

    $ tar xjf rtai-3.6.tar.bz2
    $ tar xjf linux-2.6.23.tar.bz2


  5. Criar os links simbólicos:

    $ ln -s linux-2.6.23/ linux
    $ ln -s rtai-3.6/ rtai


Provavelmente o leitor que replicar estes procedimentos o fará somente uma vez enquanto que os demais procedimentos serão executados inúmeras vezes.
Compilando o Kernel
  • Linux mais recente suportado: linux-2.6.23
  • Rtai mais recente: rtai-3.6
  1. Ir ao diretorio do linux:

    $ cd linux

  2. Aplicar o patch do RTAI no Linux:

    $ patch -p1 < ../rtai/base/arch/i386/patches/hal-linux-2.6.23-i386-1.12-00.patch

  3. Copiar a configuração atual:

    $ cp /boot/config-`uname -r` .config

  4. Editar a configuração:

    $ make menuconfig

  5. Opções a serem editadas:
    1. General Setup
      1. Prompt for development and/or incomplete code/drivers: Y
      2. Local version - append to kernel release: -rtai

    2. Enable loadable module support: Y
      1. Module versioning support: N

    3. Processor Type and Features
      1. Interrupt Pipeline: Y
      2. Timer frequence: 1000 Hz
      3. Preemption model: Low Latency Desktop

    4. Kernel hacking
      1. Compile the kernel with debug info: N
      2. Compile kernel with frame poiters: N

    5. Obs.: Pode ser necessário e é extremamente recomendável, segundo o manual do RTAI, desabilitar as opções relacionadas ao Gerenciamento de Energia: ACPI, APM e Graduação da Freqüência da CPU.

  6. Opções a serem editadas para o meu caso:
    1. Processor Type and Features
      --> Processor Family: Core 2/newer Xeon
      --> Hyperthreading: N

    2. Device Drivers -> Sound -> Advanced Linux Sound Architecture -> PCI Devices
      --> Intel HD Audio: N

    3. Obs. 1: Desabilitar todas as opções que não são relativas ao hardware diminui o tempo de compilação

    4. Obs. 2: Necessitei deixar as opções de Gerenciamento de Energia habilitada para a compilação, mas no boot do kernel utilizo as opções noacpi e noapm

  7. Compilando:

    $ make-kpkg --initrd kernel_image kernel_headers

  8. Aguardar o término da compilação. Pode levar horas.

  9. Ir para a pasta src:

    $ cd ..

  10. Criar a pasta de firmware para esta instalação [Um bug no pacote criado gera uma mensagem de erro durante a posterior instalação do pacote, por isso a necessidade deste passo]:

    mkdir /lib/firmware/2.6.23-rtai

  11. Instalar os pacotes Debian criados:

    $ sudo dpkg -i *.deb

  12. Reiniciar com o kernel novo.

Compilando o RTAI
  1. Apagar qualquer versão anterior

    $ rm -rf /usr/realtime

  2. Ir ao diretorio do RTAI:

    $ cd /usr/src/rtai

  3. Configurar RTAI

    $ make menuconfig

  4. Compilar RTAI

    $ make
    $ make installs

  5. Reboot

    $ reboot

  6. Ir ao diretorio do testsuit:

    $ cd /usr/realtime/testsuit/user

  7. Testar a instalação

    $ cd latency
    $ ./run
    $ cd ../preempt
    $ ./run
    $ cd ../switch
    $ ./run
Testando o RTAI

Para se saber se o sistema está aceitável ou não, a implementação do RTAI contém um conjunto de programas de teste e calibração: o testsuit para os testes. O objetivo é que a latência seja baixa, sem overruns e valores de tempo de troca de contexto o menor e menos variante possível.

O resultado dos testes realizados em minha máquina após todo o procedimento de instalação está mostrado abaixo, as quais mostram respectivamente o resultado do teste de latência, preempção e troca. Note que o número de overruns é zero. Os testes foram executados com carga, isto é, no momento do teste, a interface gráfica estava ativa e rodando várias aplicações de usuário, em especial, em um terminal estava sendo rodado o programa flops.






Um comentário:

  1. obrigado pelo tutorial! enxuto e preciso, me ajudou bastante.

    Alguns problemas que eu tive:
    - ao instalar o gcc-3.4 o comando no terminal muda de "gcc" para "gcc-3.4". daí, tive que fazer

    CC=gcc-3.4
    export CC
    (solução encontrada pela comunidade do UBUNTU no orkut)

    - Durante a compilação tive alguns erros relativos a "getnstimeofday", e foi resolvido adicionando "asm("" : "+r"(ns));" depois de "while (unlikely(ns>=NSEC_PER_SEC)){" no arquivo /usr/src/linux/include/linux/time.h".

    Nathan.

    ResponderExcluir