Muita gente ja’ sabe que o Linux esta’ se tornando um kernel com caracteristicas de Tempo Real. Durante muito tempo Linus Torvalds foi contra os patches que adicionam suporte a tempo real no kernel. Ele dizia que os computadores atuais ja’ sao rapidos o suficiente para garantir um bom tempo de resposta (acho que ele nao sabia direito o que e’ um sistema de tempo real ;-), felizmente alguem conseguiu convence-lo da importancia disto.
O patch que da’ suporte a tempo real ao kernel do Linux e’ chamado de PREEMPT-RT, mas este patch depende de outros, que felizmente ja’ foram aplicados ao kernel mainline, e a espectativa e’ que o patch PREEMPT-RT entre no kernel mainline nas proximas versoes.
Entretanto voce nao precisa esperar isto acontecer para poder testar o Linux com suporte a tempo real, basta seguir estes passos abaixo para conseguir fazer isto (simples e indolor):
Baixe o kernel 2.6.26:
$ wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.tar.bz2
Descompacte:
$ tar jxvf linux-2.6.26.tar.bz2
Baixe o patch para subir este kernel para a versao 2.6.26.5:
$ wget -c http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.26.5.bz2
Baixe o patch PREEMPT-RT para ser aplicado a versao 2.6.26.5:
$ wget -c http://www.kernel.org/pub/linux/kernel/projects/rt/patch-2.6.26.5-rt9.gz
Entre dentro do diretorio linux-2.6.26 e aplique os patches acima:
$ cd linux-2.6.26
$ bzcat ../patch-2.6.26.5.bz2 | patch -p1
$ zcat ../patch-2.6.26.5-rt9.gz | patch -p1
Configure o kernel:
$ make menuconfig
Ative o suporte a Tempo Real:
Processor type and features --->
Preemption Mode (XXXXXX) --->
(X) Complete Preemption (Real-Time)
Salve a configuracao do seu kernel, compile e instale de forma usual.
Para verificar se seu kernel funcionou, reinicie o computador e inicie seu Linux com o kernel Realtime que voce acabou de compilar. Entao baixe e compile o rt-tests:
$ wget -c http://kernel.org/pub/linux/kernel/people/tglx/rt-tests/rt-tests-0.27.tar.gz
$ tar zxvf rt-tests-0.27.tar.gz
$ cd rt-tests
$ make
Para verificar a latencia maxima que seu kernel esta’ gerando execute:
# ./cyclictest -p 80 -t5 -n
0.53 0.36 0.14 1/228 4469
T: 0 ( 4465) P:80 I:1000 C: 857 Min: 13 Act: 38 Avg: 59 Max: 175
T: 1 ( 4466) P:79 I:1500 C: 572 Min: 6 Act: 26 Avg: 69 Max: 236
T: 2 ( 4467) P:78 I:2000 C: 429 Min: 9 Act: 43 Avg: 50 Max: 157
T: 3 ( 4468) P:77 I:2500 C: 343 Min: 8 Act: 24 Avg: 87 Max: 230
T: 4 ( 4469) P:76 I:3000 C: 286 Min: 6 Act: 45 Avg: 56 Max: 223
Onde:
-p 80 = prioridade inicial das 5 threads;
-t5 = informa quantas threads serao criadas, note que nao ha espaco entre t e 5;
-n = instrui o programa a usar nanosleep para gerar o tempo de espera.
No meu notebook a latencia maxima esta’ muito alta (~175 us, microsegundos), o normal seria algo em torno de 50 us. Caso voces consigam fazer o teste, postem comentarios informando qual foi a latencia maxima obtida.
Um tutorial mais completo, e desatualizado, pode ser encontrado neste site:
http://rt.wiki.kernel.org/index.php/RT_PREEMPT_HOWTO