Arduino: digitalread () ve digitalwrite () alternatifleri daha hızlı mı?


13

Arduino işlevlerini çağıran en hızlı alternatifleri nelerdir digitalread()ve digitalwrite()? AVR'ye veya çipe özgü çözümler kabul edilebilir.


3
Bunu ve son sorunuzu okurken, oldukça hızlı bir şey yapmak istediğiniz görülüyor. Bunun ne olduğu ve ne kadar hızlı olabileceği hakkında ayrıntılı bilgi vermeyi düşünüyorum.
Oli Glaser

@Oli, iyi fikir, teşekkürler. Mevcut proje, RC vericileri için bir ayarlama sistemidir. İyi çalışıyor, ancak RC PWM sinyal kod çözme işlemini verimli hale getirmek istiyorum, böylece aynı çerçeveyi diğer projeler için kullanabiliyorum. Şimdiye kadar sahip olduğum şey hakkında bir yazı
Mark Harrison

Yanıtlar:


18

Dijital bağlantı noktalarına doğrudan erişin!

Test ettiğim 3 yöntem

  • digitalWrite (pin, DÜŞÜK); digitalWrite (pin, YÜKSEK);
  • CLR (PORTB, 0); SET (PORTB, 0);
  • PORTB | = _BV (0); PORTB & = ~ (_BV (0));

[...]

resim açıklamasını buraya girin

Gördüğünüz gibi, digitalWrite'ın tamamlanması yaklaşık 56 döngü sürerken, doğrudan Bağlantı Noktası adreslemesi 2 döngü sürer. Çok fazla IO işlemi olan programlar için bu büyük bir zaman farkı!



2

Yukarıda önerildiği gibi, dijital bağlantı noktalarına doğrudan erişin. Ama stil ile!

Sabit kodlanmış değerleri doğrudan donanım kayıtlarına yazarak okunabilirliği ve taşınabilirliği kaybedersiniz.

Github'da, C ++ derleyicisi gerektirmeyen ve yüksek verimli ikili kod üreten donanıma nesne tabanlı bir arabirim kullanmanızı sağlayan HWA adlı bir araç yayınladım.

HWA orada: https://github.com/duparq/hwa


1
"yüksek verimli ikili kod" kulağa gerçek ölçümlerle birlikte çok daha güvenilir gelebilir.
Dmitry Grigoryev

2

Arduino.SE halkı bunu zaten tartıştı ve test etti. Anlaşıldığı üzere, digitalWriteFast()normalden daha fazla gelişme değil digitalWrite(). Bununla birlikte, doğrudan port erişimi yaklaşık 35-40 kat daha hızlıdır digitalWrite().


0

ChipKit Uno32'yi kullanın . AVR tabanlı Arduinos'dan çok daha hızlı. Ayrıca zamanlama sorunlarınızla ilgilenecektir.


1
Daha hızlı donanım satın almanın en iyi cevap olduğunu düşünmüyorum, en azından mevcut donanımınızın sınırlarına ulaşıp daha hızlı bir şeye ihtiyacınız olduğuna karar verene kadar.
Jon L

1
Neden inişler? Sağladığım en hızlı çözümü istiyordu, sadece daha hızlı olanı değil. Arduino tabanlı daha hızlı bir çözüm öneren var mı?
Leon Heller

12
Çünkü ChipKit bir arduino değil, arduino uyumlu bir platformdur. Bu, bağlantı noktası geçişinin daha hızlı olmasına rağmen, bazı kütüphanelerin yeniden yazılma olasılığının büyük olduğu anlamına gelir. Ethernet, XBee, SD kart kütüphaneleri kutunun dışında çalışmayabilir. Ayrıca Mark, yeni bir platform (doh) için değil, digitalRead / Write'ın alternatif işlev çağrılarını özellikle ister.
Hans

2
Donanımı değiştirmek asla iyi bir çözüm değildir. En azından iyi bir öğrenmeyi kaçırırsınız ve donanımın neyin verimli kullanılacağını asla öğrenemezsiniz.
Rick_2047

1
@ Rick_2047 "Asla" demezdim - gereklilik yeni veya genişletilmişse veya miktar artarsa ​​alternatiflere bakmak mantıklı olabilir. Ancak, brüt yazılım verimsizliklerine körü körüne atılan donanımın karmaşık olmadığını kabul ediyorum - bazen daha yüksek performanslı sistemler kendi başlarına ek yük ekleyebildikleri ve bazen bazı işler için daha basit olanlardan daha yavaş olacağı için bile işe yaramıyor. Kullandığınız veya kullanmayı düşündüğünüz platform hakkında öğrenmenin yerini tutamaz.
Chris Stratton
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.