Quali sono le alternative più veloci per chiamare le funzioni di Arduino digitalread()
e digitalwrite()
? Sono accettabili soluzioni specifiche per AVR o specifiche per chip.
Quali sono le alternative più veloci per chiamare le funzioni di Arduino digitalread()
e digitalwrite()
? Sono accettabili soluzioni specifiche per AVR o specifiche per chip.
Risposte:
Accedi direttamente alle porte digitali!
I 3 metodi che ho testato erano
- digitalWrite (pin, LOW); digitalWrite (pin, HIGH);
- CLR (PORTB, 0); SET (PORTB, 0);
- PORTB | = _BV (0); PORTB & = ~ (_BV (0));
[...]
Come puoi vedere, digitalWrite impiega circa 56 cicli per essere completato, mentre l'indirizzamento diretto delle porte richiede 2 cicli. Questa è una grande differenza nel tempo per i programmi che hanno molte operazioni IO!
Questa libreria è una buona alternativa: http://code.google.com/p/digitalwritefast/
Come suggerito sopra, accedi direttamente alle porte digitali. Ma con stile!
Scrivendo i valori codificati direttamente nei registri hardware, perdi in leggibilità e portabilità.
Ho pubblicato su Github uno strumento che ho chiamato HWA che ti consente di utilizzare un'interfaccia orientata agli oggetti per l'hardware che non richiede un compilatore C ++ e produce codice binario ad alta efficienza.
HWA è lì: https://github.com/duparq/hwa
Le persone di Arduino.SE hanno già discusso e testato questo. A quanto pare, digitalWriteFast()
non è molto di miglioramento rispetto al normale digitalWrite()
. L'accesso diretto alla porta, tuttavia, è circa 35-40 volte più veloce di digitalWrite()
.
Usa il ChipKit Uno32. È molto più veloce degli Arduinos basati su AVR. Tratterà anche dei tuoi problemi di tempistica.