Calculando tempos de funções em C

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Calculando tempos de funções em C

Mensagempor gabriel_paz » 17 Mar 2007 13:13

Oi pessoal.

Estou muito acostumado com o assembly, onde temos um controle relativamente maior do tempo em ciclos de máquina gasto em cada instrução e rotina criada, mas quando programamos em C, existe alguma forma de se calcular mesmo que não seja muito exato o tempo gasto por cada comando ou função? Ou só mesmo analisando o Assembly gerado pelo compilador?

A outra perguntinha aí pra vocês que são especialistas, como podemos criar em C rotinas de leitura de teclas (teclado simples) que evitem o boucing? Em assembly eu gerava um pequeno delay, e ás veze se fosse preciso verificava se a tecla havia sido solta ou não.

Obrigado e um abraço a todos.

Gabriel
Avatar do usuário
gabriel_paz
Bit
 
Mensagens: 38
Registrado em: 11 Out 2006 21:48
Localização: São Paulo - Brasil

Mensagempor Maurício » 17 Mar 2007 13:22

Fala, Gabriel! Tudo em riba??

ow!! Me liga, zé!! :shock:

Difícil de calcular. Basta mudar um parâmetro ou uma vírgula que o compilador muda o código todo.
Uma solução meio tosca é disparar um timer na entrada da função ou procedimento, e recolher o valor no final. Faz a conta da diferença... Taí!!!

No Keil, vc tb pode fazer a conta dos ciclos de máquina. Anota o valor na entrada do procedimento, pega o valor na saída e faz os cálculos.

Pra teclas, cria uma rotina temporizada. Ao invés de ficar lendo a cada ciclo de máquina, programa um timer pra gerar uma interrupção a cada 60ms, por exemplo, e só faz a leitura do teclado quando este flag tiver sido ativado, belê?? :wink:
Vc aumenta ou diminui esse tempo em função da resposta do seu hardware.

[]'s

RETI.
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor andre_luis » 19 Mar 2007 10:24

Existem compiladores que fazem isso no modo 'simulação'.
O IAR por exemplo, faz isso; É um recurso muito útil em determinadas situações, como por exemplo quando criei minha função de dívisão long Div(long Dividendo, long divisor), 3 vezes mais rápida que a divisao float "/" intrínseca do C.

+++
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Fábio Pereira » 19 Mar 2007 11:09

Pô André,

Mas é sacanagem comparar um divisão inteira com uma divisão float né ?

Claro que a divisão float será sempre mais lenta.

Agora tem uma coisa: o operador / não é operador de divisão float não hein ... Só vai ser se um dos parâmetros for um float, caso contrário a divisão é inteira.

Sobre o cálculo que Gabriel perguntou, realmente é como já foi comentado. Eu particularmente utilizo os contadores de ciclos disponíveis em quase todos os simuladores para medir estes tempos.

Uma outra alternativa é utilizar um osciloscópio: você seta um pino na entrada de uma função e o apaga na saída da mesma. Assim é possível medir o tempo de execução da mesma.

Aliás este tipo de procedimento é muito útil na depuração de aplicações com muitas fontes de interrupção, pois você pode medir o tempo de execução das ISRs e também a utilização da CPU.

Até +
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON

Mensagempor gabriel_paz » 20 Mar 2007 00:56

Obrigado pessoal, valeu pela ajuda!

Abraços.

Gabriel
Avatar do usuário
gabriel_paz
Bit
 
Mensagens: 38
Registrado em: 11 Out 2006 21:48
Localização: São Paulo - Brasil

Mensagempor andre_luis » 20 Mar 2007 09:08

Olá Fábio,

Eu tinha esquecido de mencionar uma coisa: Na verdade, eu fiz a simulação utilizando em ambos os casos, operadores long, porém o detalhe da função que eu fiz, é que a precisao dela era de 1%, um erro alto, mas que atendia à minha necessidade.

Fábio Pereira escreveu:Agora tem uma coisa: o operador / não é operador de divisão float não hein ... Só vai ser se um dos parâmetros for um float, caso contrário a divisão é inteira.


Interessante isso. Eu achava que essa propriedade de seleção automática da rotina em tempo de execução - em função do tipo de variável - fosse recurso exclusivo do C++.

+++
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Fábio Pereira » 20 Mar 2007 13:30

Chama-se promoção de tipo e é feito em tempo de compilação.

O compilador vai analisar os tipos de dados envolvidos na operação e promover os operandos para o tipo de maior capacidade envolvido na operação.

Até +
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON


Voltar para 8051

Quem está online

Usuários navegando neste fórum: Bing [Bot] e 1 visitante

x