Apa alternatif tercepat untuk memanggil fungsi Arduino digitalread()
dan digitalwrite()
? Solusi khusus AVR atau chip spesifik dapat diterima.
Apa alternatif tercepat untuk memanggil fungsi Arduino digitalread()
dan digitalwrite()
? Solusi khusus AVR atau chip spesifik dapat diterima.
Jawaban:
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));
[...]
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!
Perpustakaan ini adalah alternatif yang baik: http://code.google.com/p/digitalwritefast/
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
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()
.
Gunakan ChipKit Uno32. Ini jauh lebih cepat daripada Arduino berbasis AVR. Ini juga akan menangani masalah waktu Anda.