sábado, 17 de julho de 2010

Como criar aplicações de tempo real

No meu projeto final de Engenharia Eletrônica nós fazemos processamento de tempo real de um sinal de áudio. Inicialmente líamos o sinal da porta de entrada em um loop infinito, e isso fez com que o processamento fosse mais lento que o fluxo do sinal. Com o tempo aprendemos que é necessário:

1. Processar blocos enviados por eventos (interrupções)
2. Configurar a prioridade do processo para tempo real

Existem também outros items que podem se provar úteis

3. Armazenar os dados em um buffer.
4. Configurar a afinidade do processo para apenas um core em uma máquina de múltiplos processadores.

As razões para cada um dos items é explicada a seguir:

1. Interrupções: O processamento deve ser feita em uma thread paralela ao recebimento para que o primeiro não interrompa o segundo. O método de melhor perfomance com este fim é o desenvolvimento orientado a eventos.

2. O Windows escalona os processos de acordo com sua prioridade, se nosso processo de tempo real não estiverem configurados com a prioridade máxima haverão outros processos escalonados antes deles e haverão demoras no processamento. Mas atenção, antes de habilitar este modo tenha certeza de que sua aplicação não possui loops infinitos, ou seja, que ela seja orientada a eventos conforme o passo 1, senão ela tomará conta do processador e não liberará pra nenhuma aplicação de prioridade inferior. Em C# é possível mudar a prioridade do processo atual da seguinte forma
var process = Process.GetCurrentProcess();
process.PriorityClass = ProcessPriorityClass.RealTime;
3. O buffer pode ser uma opção viável quando a necessidade de um fluxo contínuo é superior a necessidade de que este fluxo seja processado o mais cedo possível.

4. A afinidade de processador pode trazer um maior controle sobre a ordenação dos pacotes de saída caso haja um jitter no processamento. Em C# isso é feito assim:
var process = Process.GetCurrentProcess();
process.ProcessorAffinity = (IntPtr)1;
Onde 1 é o primeiro core, 2 seria o segundo core, 3 ambos (sem afinidade), num computador de 2 cores.

Nenhum comentário: