20 fevereiro 2018

Testando o Jason em um Sistema Operacional de Tempo Real

Para este teste foi utilizada uma Raspberry Pi3, primeiramente instalado o Raspian de forma padrão que pode ser obtido em https://www.raspberrypi.org/downloads/raspbian/. O SO será adaptado para operar em tempo real utilizando o Linux RT disponível em https://rt.wiki.kernel.org/.

Antes de habilitar o pacote de tempo real foram realizados testes usando cyclictest e uma aplicação multiagentes em JaCaMo.

Testes com sistema Raspbian original

Primeiramente o sistema operacional original era:
pi@raspberry ~$ uname -v#1023 SMP Tue Aug 8 16:00:15 BST 2017

Foi obtido e executado o cyclictest conforme comandos e respostas a seguir (*1):
  1. pi@raspberry ~$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/clrkwllms/rt-tests.git
  2. pi@raspberry ~$ cd rt-tests/
  3. pi@raspberry ~/rt-test$ make all
  4. pi@raspberry ~/rt-test$ sudo ./cyclictest -m -t1 -p 80 -n -i 500 -l 100000

Rodando 3 vezes, obtive-se as respostas:
T: 0 (  981) P:80 I:500 C: 100000 Min:      4 Act:   16 Avg:   14 Max:     149
T: 0 ( 1004) P:80 I:500 C: 100000 Min:      9 Act:   13 Avg:   13 Max:      43
T: 0 ( 1015) P:80 I:500 C: 100000 Min:      4 Act:   14 Avg:   14 Max:     114

A aplicação multiagentes utilizada nestes testes é baseada no desafio Goldminers onde na Raspberry é instanciado um agente que se junta a um sistema remoto e controla um robô minerador. Quando este robô encontra ouro é acionado um pino da placa que está em curto com uma entrada para leitura. O tempo entre o acionamento e a percepção através do pino é calculado através de temporizadores. A biblioteca utilizada para uso de pinos é a PI4J. Neste teste a placa estava com sistema original, inclusive com interface gráfica habilitada. Neste teste foram tomadas 70 leituras de pino. Em média o tempo entre o acionamento e a percepção foi de 754 us. O tempo mínimo foi de 147 us e o máximo de 5104 us, com desvio padrão de 1095 us.

Instalação do pacote Linux RT 

Para facilitar, o pacote RT utilizado aqui já vem pré-compilado para o Raspbian. Portanto, para realizar a adaptação foram seguidos os seguintes passos (*1):

  1. Na Raspberry, abrir um terminal para baixar e descompactar o kernel do Linux RT já pré-compilado:
    1. pi@raspberry ~$ cd /tmp
    2. pi@raspberry ~$ wget http://download.frank-durr.de/kernel-4.4.9-rt17.tgz
    3. pi@raspberry ~$ tar xzf kernel-4.4.9-rt17.tgz
  2. Instalar o novo kernel:
    1. pi@raspberry ~$ sudo rm -r /boot/overlays/
    2. pi@raspberry ~$ sudo rm -r /lib/firmware/
    3. pi@raspberry ~$ cd boot
    4. pi@raspberry ~$ sudo cp -rd * /boot/
    5. pi@raspberry ~$ cd ../lib
    6. pi@raspberry ~$ sudo cp -rd * /lib/
  3. Reiniciar o sistema e pronto!
    1. pi@raspberry ~$ sudo shutdown -r now

Testes com sistema Raspbian modificado para RT

O sistema passa a ser identificado como PREEMPT RT:
pi@raspberrypi:~ $ uname -v
#1 SMP PREEMPT RT Wed May 11 22:46:14 CEST 2016

Rodando pi@raspberry ~/rt-test$ sudo ./cyclictest -m -t1 -p 80 -n -i 500 -l 100000 obteve-se as seguintes respostas:
T: 0 ( 1184) P:80 I:500 C: 100000 Min:      6 Act:   14 Avg:   13 Max:      59
T: 0 ( 1212) P:80 I:500 C: 100000 Min:      6 Act:   13 Avg:   13 Max:      63
T: 0 ( 1235) P:80 I:500 C: 100000 Min:      6 Act:   14 Avg:   13 Max:      55

A mesma aplicação multiagentes baseada no desafio Goldminers foi utilizada aqui. Novamente foram tomadas 70 leituras de pino. Em média o tempo entre o acionamento e a percepção foi de 772 us. O tempo mínimo foi de 154 us e o máximo de 9729 us, com desvio padrão de 1471 us.

Conclusão

Desconsiderando que os testes realizados podem conter viés uma vez que havia muitos serviços habilitados, inclusive interface gráfica, pode-se dizer que rodando via cyclictest houve menor variação nos ciclos, mas precisaria-se estudar mais a ferramenta para concluir melhor sobre. Já nos testes com o MAS, não houve ganho de tempo de resposta com o pacote Linux RT nem tampouco maior acuracidade. Uma hipótese para esta ocorrência está no fato de que o framework JaCaMo se baseia em Java que possui processos internos, como o garbage collector, que podem anular tentativas de estabelecer precisão nos ciclos de processamento. Conforme sugerido por Bogdan, a biblioteca original pigpio escrita em C pode ser uma alternativa para melhorar estas respostas, neste caso a leitura de pinos poderia rodar em uma aplicação em C que teria característica de tempo real e uma segunda aplicação em Java, em nosso caso o Sistema Multiagente, rodar sem este compromisso.


(*1) Estes comandos se baseiam no tutorial de Frank Duerr mantendo a licença Attribution-ShareAlike 4.0 International License (CC BY-SA 4.0).