rodrigoevaldo escreveu:Alguém consegue informar-me se no PC é possível fazer micro temporizações na faixa de microsegundos?
Olha, uma vez no linux precisei fazer uma rotina que tinha um sleep de no mínimo 200 ns pra comunicar com um dispositivo via porta paralela. Como era um mínimo, eu tentei fazer com usleep(1). O problema é que o linux só dava aos processos fatias de tempo de 10 milisegundos, então o usleep(1) ficou uma carroçona e levava uma era pra completar a operação.
O que eu fiz foi o seguinte: rodei o processo com prioridade de tempo real, e lendo o /proc/cpuinfo obtia a informação relativa aos bogomips (eu tentei calibrar isto dentro do programa, e deu certo, mas ler a informação do kernel me pareceu mais interessante a epoca), que é uma referência sobre o quanto tempo instruções básicas levam para executar (abstraindo o fato que isto é estatístico num PC).
Então eu usei a instrução rdtsc para ler o time stamp counter, que é um registrador da cpu acessivel aos programas (no linux, no windows eu não sei) e que incrementa a cada ciclo de clock. Com a informação dos bogomips eu conseguia calcular o tempo de cada incremento do rdtsc e calcular o número de passagens do contador que eu precisava acompanhar, algo mais ou menos assim:
amount = ns_to_sleep / (bogomips * 1000);
x = rdtsc();
i = x + amount;
for (; x <= i; x = rdtsc());
Como o processo rodava em tempo real (tinha prioridade sobre os outros processos), eu consegui uma resolução de algumas dezenas de nanosegundos (com o clock daquele processador em particular) e uma precisão com média estatística similar a precisão. Estatística pq o processo não tinha prioridade sobre as atividades do kernel, e volta e meia os delays beiravam as centenas de micro-segundos (ou talvez beirasse 1ms, não lembro, mas era bem melhor que 10ms), mas como o que me interessava era, na média, comunicar com um delay mínimo de 200ns, funcionou maravilhosamente. Eu experimentei desabilitar interrupções mas não gostei muito do resultado.
No windows talvez dê pra fazer alguma mutreta semelhante mas o que eu recomendo é um deltree c: /y (olha lá hein, tou brincando!), se é que isto ainda funciona, pq windows ninguém merece hehehe.
Boa sorte!