Quais são as alternativas mais rápidas para chamar as funções do Arduino digitalread()e digitalwrite()? Soluções específicas para AVR ou chip são aceitáveis.
Quais são as alternativas mais rápidas para chamar as funções do Arduino digitalread()e digitalwrite()? Soluções específicas para AVR ou chip são aceitáveis.
Respostas:
Acesse as portas digitais diretamente!
Os três métodos que testei foram
- digitalWrite (pino, BAIXO); digitalWrite (pino, ALTO);
- CLR (PORTB, 0); SET (PORTB, 0);
- PORTB | = _BV (0); PORTB & = ~ (_BV (0));
[...]
Como você pode ver, o digitalWrite leva cerca de 56 ciclos para ser concluído, enquanto o endereçamento de porta direto leva 2 ciclos. Essa é uma grande diferença no tempo para programas que possuem muitas operações de E / S!
Esta biblioteca é uma boa alternativa: http://code.google.com/p/digitalwritefast/
Como sugerido acima, acesse as portas digitais diretamente. Mas com estilo!
Ao escrever valores codificados diretamente nos registros de hardware, você perde a legibilidade e a portabilidade.
Publiquei no Github uma ferramenta chamada HWA que permite usar uma interface orientada a objetos para o hardware que não requer um compilador C ++ e produz código binário de alta eficiência.
HWA está lá: https://github.com/duparq/hwa
O pessoal do Arduino.SE já discutiu e testou isso. Como se vê, digitalWriteFast()não há muita melhoria em relação ao normal digitalWrite(). O acesso direto à porta, no entanto, é cerca de 35 a 40 vezes mais rápido que digitalWrite().
Use o ChipKit Uno32. É muito mais rápido que os Arduinos baseados em AVR. Ele também irá lidar com seus problemas de tempo.