Autor Tópico: CLOCK em microsegundos  (Lida 19201 vezes)

Description:

0 Membros e 1 Visitante estão vendo este tópico.

matrixlan1

  • Visitante
Re: CLOCK em microsegundos
« Resposta #30 Online: 08 de Outubro de 2009, 18:29 »
Citar
minha intenção foi só de ajudar o colega matrixlan. pois pelo q pude intender, ele n estava precisando de nd mto sofisticado.

Realmente amigo, meu programa não tem sofisticação nenhuma, apenas um MÍSERO SINAL DE CLOCK (desculpem se foi rude) oscilando numa frequencia de até 1000hz ou mais, para acionar qualquer eixo da CNC3AX que eu quisesse

ja tenho o codigo em C++ BUILDER que faz isso com o pino 2 da porta paralela so que dá no máximo 40hz, isso é muito pouco para um padrão de atraso de 1ms que estou usando para rampa ALTA e rampa BAIXA em "loop".. deveria da pelo menos 400hz(?)

mas enfim o nosso amigo GIL ja meu deu muitas explicação de o porquê que não consigo isso e cada vez nos convencemos mais que o (R)windows é o maior vilão.

Citar
matrixlan,

assim q eu tiver o código em mãos, eu posto aqui para ver se te ajuda.

Opa amigo, será sempre bem vindo e será sempre uma grande ajuda, como eu disse "não estou me aproveitando dos colegas pra pegar cõdigos prontos" apenas os meu conhecimentos congelaram... ;)

Abraço.
[/quote]

matrixlan1

  • Visitante
Re: CLOCK em microsegundos
« Resposta #31 Online: 08 de Outubro de 2009, 18:44 »
Citar
O prob é - e sempre foi - a latência, causada pelas interrupções do SO, portanto os masoquistas que pretendem se aventurar nesse pântano devem começar por estudar maneiras de evitar a interferência das tarefas de housekeeping, o resto é relativamente trivial e está ao alcance de muitos programadores.


kkkkk...gostei do masoquista foi bem exótico isso, de latencia em conheço um pouco e sei que atrasos de 10ms ou menor ja fazem um terrorismo grande num sistema, por isso amigo que eu uso Threads com base de tempo real no meu programa, sinceramente eu uso dois Threads em "prioridade maxima" ou seja: quase toda força do sistema é dedicada ao programa evitando justamente problemas com latências, se elas acontecem é num espaço de tempo desconhecido pelas linhas do proprio programa, uma traição ao código numa linguagem mais rude....

Agora eu fiquei curioso onde acontece essas interrupções de SO? em que momento isso acontece..quando executo meu programa?

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: CLOCK em microsegundos
« Resposta #32 Online: 08 de Outubro de 2009, 19:22 »
Oldair,

kkkkk...gostei do masoquista foi bem exótico isso, de latencia em conheço um pouco e sei que atrasos de 10ms ou menor ja fazem um terrorismo grande num sistema, por isso amigo que eu uso Threads com base de tempo real no meu programa, sinceramente eu uso dois Threads em "prioridade maxima" ou seja: quase toda força do sistema é dedicada ao programa evitando justamente problemas com latências, se elas acontecem é num espaço de tempo desconhecido pelas linhas do proprio programa, uma traição ao código numa linguagem mais rude....

Agora eu fiquei curioso onde acontece essas interrupções de SO? em que momento isso acontece..quando executo meu programa?

Conselho..., não confie cegamente nas Threads que o Windows disponibiliza.

Já fiz programas multiprocessos e multithreads (são duas coisas diferentes) em VMS, LINUX e SUN-OS, verdadeiros S.O. multitarefa e multiusuário. Não sou profundo conhecedor do Windows, mas sei que na família Windows, excetuando o Windows NT, que era cópia do VMS, geralmente não são verdadeiramente multitarefa. O VMS era um S.O. famoso da finada DEC (Digital Equipment Corporation), ou "Digital" para os íntimos.

Um pouco de história: A DEC era concorrente da IBM em sistemas de processamento científico e de universidades. Os equipamentos da DEC e o VMS junto com os UNIX, foram um dos fundamentos no desenvolvimento da Rede Ethernet e da Internet....
 
A contrução de threads existe em qualquer S.O. decente. Threads são pequenos processos que o sistema operacional permite criar dentro do contexto do seu programa, simulando um sistema multitarefas.

Desse modo, em determinados momentos (deveria ser periodicamente, com desvio de microsegundos ou menos em sistemas de tempo real), o Windows passa o controle da CPU para uma das Threads, permitindo que a mesma seja executada. Como o Windows não é um sistema de tempo real, a temporização de execução dessas threads não é determinística, ou seja, as threads não são executadas dentro de um escalonamento de tempo previsível. Altamente desejável em sistemas de controle, acionamentos de máquinas, motores, etc...

Além disso, o fato de voce poder ajustar uma "prioridade" de uma Thread não é a solução definitiva, pois lembre-se que o Windows ainda está no (des)controle de tudo, conforme critérios obscuros e ocultos à maioria dos "mortais". A prioridade permite ao Windows decidir quando houverem duas ou mais Threads na fila para serem executadas, ou que receberem uma interrupção (teclado, mouse, porta serial, disco, rede...), qual será executada primeiro, segundo, terceiro,.... Mas perceba, que só isso não garante a periodicidade de tempo invariável na execução. Seria necessário um escalonador de tempo real, um sistema reentrante para tratamento de interrupções com baixa latência, ...... Coisas que, até onde eu sei, o Windows não possui...

Offline marc0

  • CNCMASTER
  • ******
  • Posts: 2788
  • Sexo: Masculino
  • Não dirigimos o vento, podemos ajustar as velas.
    • Máquinas & Equipamentos
Re: CLOCK em microsegundos
« Resposta #33 Online: 08 de Outubro de 2009, 20:37 »
Algumas considerações.

Não sei porque tanta aversão ao Windows; eu uso o XP a muitos anos e estou plenamente satisfeito com ele. não me parece legal esse negócio de jogar pedras. Acho o Linux muito bom e que atende os objetivos dos seus usuários, assim com o Win atende a grande maioria que o usa.

Todo SO é programado visando certos objetivos, certamente os objetivos da MS contempla uma estratégia de funcionalidade que visa auferir lucros com a venda, nenhum SO vai ser o melhor em tudo, e certamente a latência do Win pode deixar a desejar para um uso não previsto. 

"Cada sistema utiliza uns milésimos de segundos para gerenciar estes intervalos de tempo. Assim um sistema gasta 1/n segundos por intervalo; algo como 1/33 para o W95, 1/100 para a série o Windows NT, 1/250 para o Linux padrão e 1/1000 para o Linux com Kernel RT"  (fonte : http://flavioschiavoni.blogspot.com/2008/08/o-que-kernel-rt.html )

Nem tudo são flores e certamente existe alguns podres no reino da Dinamarca e como toda empresa a MS tem os seus pecados, nem sempre acerta em tudo, mas o sucesso que alcançou num ramo tão competitivo como esse de "software" deixando muitos concorrentes peso pesado pelo caminho, indica que a maioria dos seus produtos são tudo, menos ruins.

Por razões obvias muitas partes do WIN não são de conhecimento geral, claro se houvesse maiores detalhes facilitaria interações e uma maior compatibilidade; o desconhecimento pode acarretar bugs e travamentos de soft incompatíveis.

Não considero programar algo que funcione à contento em condições adversas seja um truque sujo, mas sim a perspicácia de conhecer as possibilidades e retirar delas os melhores benefícios. Taí o mérito do Mach, Kcam e companhia.

matrixlan1

  • Visitante
Re: CLOCK em microsegundos
« Resposta #34 Online: 08 de Outubro de 2009, 20:42 »
Citar
Além disso, o fato de voce poder ajustar uma "prioridade" de uma Thread não é a solução definitiva, pois lembre-se que o Windows ainda está no (des)controle de tudo, conforme critérios obscuros e ocultos à maioria dos "mortais".


É verdade mesmo professor GIL, se a prioridade resolvesse isso de verdade meu programa estaria funcionando a uns 500hz

mas olha o que eu achei pequisando na internet:

// Wait 0.2ms

procedure PerformanceDelay;
var
hrRes, hrT1, hrT2, dif: Int64;
begin
if QueryPerformanceFre quency(hrRes) then
begin
QueryPerformanceCou nter(hrT1);
repeat
QueryPerformanceCou nter(hrT2);
dif := (hrT2 - hrT1) * 10000000 div hrRes;
until dif > 2;
end;
end;

essas linhas de comando causam um atraso de 0.2ms e me parece ser escrito para DELPHI..você por acaso saberia decifrar alguma coisa?

Observando o codigo acima passo a observar que o nosso amigo Claudio S. tinha alguma razão quando falou de "QueryPerformanceCou nter" e "QueryPerformanceFre quency".
« Última modificação: 08 de Outubro de 2009, 20:47 por matrixlan1 »

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: CLOCK em microsegundos
« Resposta #35 Online: 08 de Outubro de 2009, 23:29 »
Marco,

Não sei porque tanta aversão ao Windows; eu uso o XP a muitos anos e estou plenamente satisfeito com ele. não me parece legal esse negócio de jogar pedras. Acho o Linux muito bom e que atende os objetivos dos seus usuários, assim com o Win atende a grande maioria que o usa.

Todo SO é programado visando certos objetivos, certamente os objetivos da MS contempla uma estratégia de funcionalidade que visa auferir lucros com a venda, nenhum SO vai ser o melhor em tudo, e certamente a latência do Win pode deixar a desejar para um uso não previsto. 

Eu também uso o Windows (até comprei uma licença oficial), mas gosto de falar mal do Bill Gates....  ;D

Brincadeira....

O Windows é aceitável para o nosso feijão com arroz.

Mas para um programador de sistemas de tempo real, existem muitas arestas no Windows.

Mas, se formos avaliar os diversos aspectos, do ponto de vista de um desenvolvedor de sistemas. A escolha de um S.O. é algo complexo, pois depende de diversas questões: mercadológicas (o publico alvo), se cumpre os objetivos a serem alcançados, se atende ao quesito preço e custo do produto final, se é estável, ....

Estamos tratando de algo bem específico. Mas com certeza, há produtos prontos no mercado rodando em Windows (ex.: Mach), ainda há um chance para o Windows...  :)


"Cada sistema utiliza uns milésimos de segundos para gerenciar estes intervalos de tempo. Assim um sistema gasta 1/n segundos por intervalo; algo como 1/33 para o W95, 1/100 para a série o Windows NT, 1/250 para o Linux padrão e 1/1000 para o Linux com Kernel RT"  (fonte : http://flavioschiavoni.blogspot.com/2008/08/o-que-kernel-rt.html )

Não considero programar algo que funcione à contento em condições adversas seja um truque sujo, mas sim a perspicácia de conhecer as possibilidades e retirar delas os melhores benefícios. Taí o mérito do Mach, Kcam e companhia.

O problema não é só obter tempos pequenos no Windows ou outro S.O., é manter o intervalo de tempo constante entre os eventos (ex.: pulsos gerados para um motor), independentemente do "humor do Windows". É por isso que os sistemas CNC com Windows não podem rodar mais nada que não seja o software de CNC, tem que ser "o mais pelados possível". Tente usar um browser, ou fazer um downlod pesado, rodar um antivirus, rodar o Media Player com o Mach operando uma CNC....
 
Com certeza, os autores do Mach, Kcam, ... souberam driblar os obstáculos, do Windows. Mas acho que não deveria ser uma ciência oculta... No DOS esse tipo de aplicativo era muito mais aberto, barato e fácil de fazer...

É sabido que programar em baixo nível num S.O. é um assunto complexo, mas, também tenho a impressão que o pessoal da MS quer ficar sócio em tudo que roda e é produzido para Windows. É a velha história de criar as dificuldades para vender as soluções (ex.: compiladores, cursos, informações, livros, certificações...).
« Última modificação: 08 de Outubro de 2009, 23:31 por minilathe »

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: CLOCK em microsegundos
« Resposta #36 Online: 08 de Outubro de 2009, 23:49 »
Odail,

Citar
Além disso, o fato de voce poder ajustar uma "prioridade" de uma Thread não é a solução definitiva, pois lembre-se que o Windows ainda está no (des)controle de tudo, conforme critérios obscuros e ocultos à maioria dos "mortais".


É verdade mesmo professor GIL, se a prioridade resolvesse isso de verdade meu programa estaria funcionando a uns 500hz

mas olha o que eu achei pequisando na internet:

// Wait 0.2ms

procedure PerformanceDelay;
var
hrRes, hrT1, hrT2, dif: Int64;
begin
if QueryPerformanceFre quency(hrRes) then
begin
QueryPerformanceCou nter(hrT1);
repeat
QueryPerformanceCou nter(hrT2);
dif := (hrT2 - hrT1) * 10000000 div hrRes;
until dif > 2;
end;
end;

essas linhas de comando causam um atraso de 0.2ms e me parece ser escrito para DELPHI..você por acaso saberia decifrar alguma coisa?

Observando o codigo acima passo a observar que o nosso amigo Claudio S. tinha alguma razão quando falou de "QueryPerformanceCou nter" e "QueryPerformanceFre quency".

Não sou muito íntimo do Delphi, mas posso te dizer que, geralmente, olhando um código em linguagem de alto nível é difícil dizer se roda mais rápido que outro código em outras linguagem. Isso depende do compilador, o quão eficiente na geração do código de máquina, a velocidade absoluta mesmo, só com assembly.

O programa que estamos discutindo pode ser temporizado como a seguir:

while(1) {
    outportb(0x378,0xFF);
    a = 10;
    outportb(0x378,0xFD);
    a = 10;


A linha a=10 é apenas para gastar tempo (similar a um sleep, de x milisegundos, onde x=??), voce pode medir a velocidade com um frequencímetro, mas ainda teremos o problema da latência variável do Windows...

Offline marc0

  • CNCMASTER
  • ******
  • Posts: 2788
  • Sexo: Masculino
  • Não dirigimos o vento, podemos ajustar as velas.
    • Máquinas & Equipamentos
Re: CLOCK em microsegundos
« Resposta #37 Online: 08 de Outubro de 2009, 23:53 »
Olá Gil;

Obrigado por entender o ponto.
Gostei muito da sua réplica, inclusive concordo com a sua opinião final (ao menos em parte), isso é inerente à condição de quase monopólio da MS, espero que a comunidade de SO livre consiga uma fatia maior o bolo.

A muito tempo já deixei de usar o MS Office ou o IE, já me aventurei algumas vz no Linux com o finado Kurumin (foi uma pena que acabou), estou com muita vontade de usar o Ubuntu, só não o fiz por total falta de espaço no meu HD lotado, estou para adquirir uma nova máquina e certamente essa é uma das minhas prioridades.

Abraços...

matrixlan1

  • Visitante
Re: CLOCK em microsegundos
« Resposta #38 Online: 09 de Outubro de 2009, 13:01 »
Citar
O programa que estamos discutindo pode ser temporizado como a seguir:

while(1) {
    outportb(0x378,0xFF);
    a = 10;
    outportb(0x378,0xFD);
    a = 10;


A linha a=10 é apenas para gastar tempo (similar a um sleep, de x milisegundos, onde x=??), voce pode medir a velocidade com um frequencímetro, mas ainda teremos o problema da latência variável do Windows...

1- Gil, vou testar essas linhas, voce me falando de latencia agora me veio uma duvida, meu pc é um celeron 2.1ghz que nao tem muito velocidade voce acha que se eu trocar pra um pc mais "parrudo" responderia melhor com maior velocidade?

2-supondo que alinhas que me passou fiquem "na mesma" eu eu radicalmente "migre" para o linux o programa acima entao funcionaria sem os famosos bugs do windows? eu teria um programa real com respostas em ms real?


Offline Cláudio F.

  • Fuso
  • **
  • Posts: 222
  • Sexo: Masculino
  • Cidade - UF: São Paulo/SP
Re: CLOCK em microsegundos
« Resposta #39 Online: 10 de Outubro de 2009, 23:44 »
Boa noite,

fiz os testes hoje com as APIS "QueryPerformanceCou nter" e "QueryPerformanceFre quency", seque em anexo as fotos dos resultados.

assim que eu resolver esse negócio azul que o UserPort esta causando no windows, eu boto o osciloscópio na paralela e coloco os resultados.

abraços

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: CLOCK em microsegundos
« Resposta #40 Online: 11 de Outubro de 2009, 08:48 »
Odail,

Citar
O programa que estamos discutindo pode ser temporizado como a seguir:

while(1) {
    outportb(0x378,0xFF);
    a = 10;
    outportb(0x378,0xFD);
    a = 10;



1- Gil, vou testar essas linhas, voce me falando de latencia agora me veio uma duvida, meu pc é um celeron 2.1ghz que nao tem muito velocidade voce acha que se eu trocar pra um pc mais "parrudo" responderia melhor com maior velocidade?

2-supondo que alinhas que me passou fiquem "na mesma" eu eu radicalmente "migre" para o linux o programa acima entao funcionaria sem os famosos bugs do windows? eu teria um programa real com respostas em ms real?

A diferença básica entre usar o Windows e outras soluções mais abertas (Linux, FreeDOS) nesse tipo de aplicação é a latência imprevisível e incontrolável do Windows. Por outro lado, nos "mundos" DOS (ex.: FreeDOS) e Linux (ex.:RT-Linux) há mais opções de ambientes apropriados para aplicações de tempo real e mais controle sobre a máquina / S.O.

Já fiz programas para controlar motores de passo em linguagem C / Assembly em ambiente DOS.

Mas, como diz o Fábio, é apenas a minha opinião...  :)

Está aí o Mach, que roda em Windows...

O programa que eu sugeri voce testar era para eu ter uma idéia da velocidade do teu sistema, a frequência de dezenas de Hertz que voce falou me pareceu baixíssima, mesmo em Windows. Este programa não usa o sleep e, assim, pode dar um pouco mais de informação sobre a "caixa preta" compilador / Windows.
Aliás, qual o Windows que voce usa?

matrixlan1

  • Visitante
Re: CLOCK em microsegundos
« Resposta #41 Online: 11 de Outubro de 2009, 13:26 »
Citar
fiz os testes hoje com as APIS "QueryPerformanceCou nter" e "QueryPerformanceFre quency", seque em anexo as fotos dos resultados.
assim que eu resolver esse negócio azul que o UserPort esta causando no windows, eu boto o osciloscópio na paralela e coloco os resultados.

Poxa amigo, muito legal essa linhas de programação, o truque pra turbinar frequencia no windows deve ta por ai mesmo, que compilador vc esta usando pra programar, você conseguiu 10 MHZ onde na porta ou em simulação?


Offline Cláudio F.

  • Fuso
  • **
  • Posts: 222
  • Sexo: Masculino
  • Cidade - UF: São Paulo/SP
Re: CLOCK em microsegundos
« Resposta #42 Online: 11 de Outubro de 2009, 14:22 »
tou usando o Microsoft Visual C++ 6.0.

eu fiz essas medições incrementando a variável fCounter a cada ciclo e mostrando o resultado usando um timer de 1seg. Da pra ver essa parte do código nos printscreen.

Citar
você conseguiu 10 MHZ onde na porta ou em simulação?
Na verdade é pouco mais de 1MHz. esse foi o máximo que meu computador chegou. o que até pode ser melhorado.

---------------------------------------------------------------------
Atualizando...



Coloquei o osciloscopio na paralela e tive uma surpresa...

a 10khz o desvio foi menor que 10Hz... fiquei tao surpreso que vou até postar um video pra n duvidarem de mim...rs

a 50kHz a coisa ficou mais complicada, mas acredito que com alguns ajustes (nada de sobrenatural) é possível sim fazer um gerador mais ou menos confiável.

400kHz foi o maximo que consegui no meu pc.

vale lembrar que o gerador não estava sendo executado sozinho, existiam pelo menos duas outras aplicações que estavam exigindo muito do processador.



« Última modificação: 11 de Outubro de 2009, 17:41 por Cláudio S. Freund »

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: CLOCK em microsegundos
« Resposta #43 Online: 11 de Outubro de 2009, 17:51 »
Cláudio,

Me explique o que está sendo mostrado, a onda quadrada é gerada pelo seu programa em C++ e há um osciloscópio (de que tipo digital / analógico?) conectado ao PC?

Qual a versão do seu Windows?

Offline Cláudio F.

  • Fuso
  • **
  • Posts: 222
  • Sexo: Masculino
  • Cidade - UF: São Paulo/SP
Re: CLOCK em microsegundos
« Resposta #44 Online: 11 de Outubro de 2009, 17:58 »
Gil,

Estou utilizando o Windows XP, a onda esta sendo gerada pelo meu programa escrito em C, o osciloscópio é um PicoScope 2202
http://www.picotech.com/picoscope2202-specifications.html e a ponta de prova do osciloscópio esta ligada no pino 2 da porta paralela
(uma placa expansora da comtac. minha placa mãe n possui onboard).


Código: [Selecionar]
DWORD WINAPI Thread_uTimer(LPVOID lpParam){
LARGE_INTEGER freq, start, stop;
SetThreadAffinityMask(GetCurrentThread(), 2);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
QueryPerformanceFrequency(&freq);
while(1){
_outp(0xA800, 2);
QueryPerformanceCounter(&start);
do {
QueryPerformanceCounter(&stop);
} while( (double(stop.QuadPart - start.QuadPart) / freq.QuadPart * 1000000) <= Ton );

_outp(0xA800, 0);
QueryPerformanceCounter(&start);
do {
QueryPerformanceCounter(&stop);
} while( (double(stop.QuadPart - start.QuadPart) / freq.QuadPart * 1000000) <= Toff );

fCounter++;

}
return 0;
}
« Última modificação: 11 de Outubro de 2009, 18:56 por Cláudio S. Freund »

 

/** * */