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.