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):
- pi@raspberry ~$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/clrkwllms/rt-tests.git
- pi@raspberry ~$ cd rt-tests/
- pi@raspberry ~/rt-test$ make all
- pi@raspberry ~/rt-test$ sudo ./cyclictest -m -t1 -p 80 -n -i 500 -l 100000
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):- Na Raspberry, abrir um terminal para baixar e descompactar o kernel do Linux RT já pré-compilado:
- pi@raspberry ~$ cd /tmp
- pi@raspberry ~$ wget http://download.frank-durr.de/kernel-4.4.9-rt17.tgz
- pi@raspberry ~$ tar xzf kernel-4.4.9-rt17.tgz
- Instalar o novo kernel:
- pi@raspberry ~$ sudo rm -r /boot/overlays/
- pi@raspberry ~$ sudo rm -r /lib/firmware/
- pi@raspberry ~$ cd boot
- pi@raspberry ~$ sudo cp -rd * /boot/
- pi@raspberry ~$ cd ../lib
- pi@raspberry ~$ sudo cp -rd * /lib/
- Reiniciar o sistema e pronto!
- 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).