Arduino: alternative più veloci a digitalread () e digitalwrite ()?


13

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.


3
Leggendo questa e la tua ultima domanda, sembra che tu voglia fare qualcosa abbastanza rapidamente. Penso che dare dettagli su cosa sia e quanto velocemente potrebbe essere utile.
Oli Glaser,

@Oli, buona idea, grazie. Il progetto attuale è un sistema di sintonizzazione per trasmettitori RC. Funziona bene, ma vorrei rendere efficiente la decodifica del segnale RC PWM in modo da poter utilizzare lo stesso framework per altri progetti. Ecco un commento su ciò che ho finora: eastbay-rc.blogspot.com/2011/11/…
Mark Harrison,

Risposte:


18

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));

[...]

inserisci qui la descrizione dell'immagine

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!



2

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


1
"codice binario ad alta efficienza" sembrerebbe molto più autorevole insieme alle misurazioni effettive.
Dmitry Grigoryev,

2

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().


0

Usa il ChipKit Uno32. È molto più veloce degli Arduinos basati su AVR. Tratterà anche dei tuoi problemi di tempistica.


1
Non penso che acquistare hardware più veloce sia la risposta migliore qui, almeno non fino a quando non hai raggiunto i limiti del tuo hardware attuale e hai deciso che hai bisogno di qualcosa di più veloce.
Jon L

1
Perché i downvotes? Voleva la soluzione più veloce , non solo una più veloce, che ho fornito. Qualcuno può suggerire una soluzione basata su Arduino più veloce?
Leon Heller,

12
Perché ChipKit non è un arduino, ma una piattaforma compatibile con arduino. Ciò significa che sebbene la commutazione delle porte sia più veloce, esiste una grande probabilità di una riscrittura di alcune librerie. Le librerie di schede Ethernet, XBee e SD potrebbero non funzionare affatto. Inoltre, Mark richiede specificamente chiamate di funzione alternative di digitalRead / Write, non una nuova piattaforma (doh).
Hans,

2
Cambiare hardware non è mai una buona soluzione. Per lo meno ti perdi un buon apprendimento e non imparerai mai quale sarebbe un uso efficiente dell'hardware.
Rick_2047,

1
@ Rick_2047 Non direi "mai" - se il requisito è nuovo o ampliato o la quantità aumenta, può avere senso guardare le alternative. Ma sono d'accordo sul fatto che gettare alla cieca l'hardware alle gravi inefficienze del software non è sofisticato - a volte non funziona nemmeno poiché i sistemi con prestazioni più elevate possono aggiungere costi generali propri e talvolta finire più lenti di quelli più semplici per alcune attività. Non c'è davvero alcun sostituto per conoscere la piattaforma che usi o intendi utilizzare.
Chris Stratton,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.