Arduino: alternatif yang lebih cepat untuk digitalread () dan digitalwrite ()?

13

Apa alternatif tercepat untuk memanggil fungsi Arduino digitalread()dan digitalwrite()? Solusi khusus AVR atau chip spesifik dapat diterima.

Mark Harrison
sumber
3
Membaca ini dan pertanyaan terakhir Anda, sepertinya Anda ingin melakukan sesuatu dengan sangat cepat. Saya pikir memberikan rincian tentang apa itu dan seberapa cepat mungkin bermanfaat.
Oli Glaser
@ Oli, ide bagus, terima kasih. Proyek saat ini adalah sistem tuning untuk pemancar RC. Ini bekerja dengan baik, tetapi saya ingin membuat decoding sinyal RC PWM efisien sehingga saya dapat menggunakan kerangka kerja yang sama untuk proyek lain. Berikut adalah artikel tentang apa yang saya miliki sejauh ini: eastbay-rc.blogspot.com/2011/11/...
Mark Harrison

Jawaban:

18

Akses port digital secara langsung!

3 metode yang saya uji adalah

  • digitalWrite (pin, LOW); digitalWrite (pin, HIGH);
  • CLR (PORTB, 0); SET (PORTB, 0);
  • PORTB | = _BV (0); PORTB & = ~ (_BV (0));

[...]

masukkan deskripsi gambar di sini

Seperti yang Anda lihat, digitalWrite membutuhkan sekitar 56 siklus untuk menyelesaikan, sementara pengalamatan Port langsung membutuhkan 2 siklus. Itu perbedaan besar dalam waktu untuk program yang memiliki banyak operasi IO!

Marty
sumber
2

Seperti yang disarankan di atas, akses port digital secara langsung. Tapi dengan gaya!

Dengan menulis nilai-nilai hard-coded langsung ke register perangkat keras, Anda kehilangan keterbacaan dan portabilitas.

Saya telah menerbitkan di Github alat yang saya sebut HWA yang memungkinkan Anda menggunakan antarmuka berorientasi objek ke perangkat keras yang tidak memerlukan kompiler C ++ dan menghasilkan kode biner efisiensi tinggi.

HWA ada di sana: https://github.com/duparq/hwa

duparq
sumber
1
"kode biner efisiensi tinggi" akan terdengar jauh lebih otoritatif bersama dengan pengukuran aktual.
Dmitry Grigoryev
2

Orang-orang di Arduino.SE telah membahas dan menguji ini. Ternyata, digitalWriteFast()tidak banyak perbaikan dari yang biasa digitalWrite(). Akses port langsung, bagaimanapun, sekitar 35-40 kali lebih cepat daripada digitalWrite().

Dmitry Grigoryev
sumber
0

Gunakan ChipKit Uno32. Ini jauh lebih cepat daripada Arduino berbasis AVR. Ini juga akan menangani masalah waktu Anda.

Leon Heller
sumber
1
Saya tidak berpikir membeli perangkat keras yang lebih cepat adalah jawaban terbaik di sini, setidaknya tidak sampai Anda telah mencapai batas perangkat keras Anda saat ini dan memutuskan bahwa Anda membutuhkan sesuatu yang lebih cepat.
Jon L
1
Mengapa downvotes? Dia menginginkan solusi tercepat , bukan hanya yang lebih cepat, yang saya berikan. Adakah yang bisa menyarankan solusi berbasis Arduino yang lebih cepat?
Leon Heller
12
Karena ChipKit bukan arduino, tetapi platform arduino yang kompatibel. Ini berarti bahwa meskipun port switching lebih cepat, ada kemungkinan besar penulisan ulang beberapa perpustakaan. Pustaka kartu Ethernet, XBee, SD mungkin tidak berfungsi sama sekali di luar kotak. Selain itu, Mark secara khusus meminta panggilan fungsi alternatif dari digitalRead / Write, bukan untuk platform baru (doh).
Hans
2
Mengubah perangkat keras tidak pernah merupakan solusi yang baik. Paling tidak Anda kehilangan beberapa pembelajaran yang baik dan tidak akan pernah belajar apa yang akan efisien menggunakan perangkat keras.
Rick_2047
1
@ Rick_2047 Saya tidak akan mengatakan "tidak pernah" - jika persyaratannya baru atau diperluas atau jumlahnya meningkat, masuk akal untuk melihat alternatif. Tapi saya setuju bahwa membanting perangkat keras secara membabi buta pada ketidakefisienan perangkat lunak tidak canggih - kadang-kadang bahkan tidak berfungsi karena sistem kinerja yang lebih tinggi dapat menambah overhead sendiri dan kadang-kadang berakhir lebih lambat daripada yang lebih sederhana untuk beberapa tugas. Benar-benar tidak ada pengganti untuk belajar tentang platform yang Anda gunakan atau renungkan.
Chris Stratton