Arduino: ทางเลือกที่เร็วกว่าสำหรับ digitalread () และ digitalwrite ()?


13

อะไรคือทางเลือกที่เร็วที่สุดในการเรียกใช้ฟังก์ชั่น Arduino digitalread()และdigitalwrite()? AVR หรือโซลูชั่นเฉพาะชิปนั้นเป็นที่ยอมรับ


3
อ่านคำถามนี้และคำถามสุดท้ายของคุณดูเหมือนว่าคุณต้องการทำบางสิ่งบางอย่างได้อย่างรวดเร็ว ฉันคิดว่าการให้รายละเอียดเกี่ยวกับสิ่งที่มันเป็นและความรวดเร็วในการเป็นประโยชน์
Oli Glaser

@Oli ความคิดที่ดีขอบคุณ โครงการปัจจุบันเป็นระบบปรับแต่งสำหรับเครื่องส่งสัญญาณ RC ใช้งานได้ดี แต่ฉันต้องการทำให้การถอดรหัสสัญญาณ RC PWM มีประสิทธิภาพเพื่อให้ฉันสามารถใช้เฟรมเวิร์กเดียวกันสำหรับโครงการอื่น ๆ นี่คือบทความเกี่ยวกับสิ่งที่ฉันมี: eastbay-rc.blogspot.com/2011/11/…
มาร์คแฮร์ริสัน

คำตอบ:


18

เข้าถึงพอร์ตดิจิตอลโดยตรง!

3 วิธีที่ฉันทดสอบคือ

  • digitalWrite (พินต่ำ); digitalWrite (พินสูง);
  • CLR (PORTB, 0); ชุด (PORTB, 0);
  • PORTB | = _BV (0); PORTB & = ~ (_BV (0));

[ ... ]

ป้อนคำอธิบายรูปภาพที่นี่

อย่างที่คุณเห็น digitalWrite ใช้เวลาประมาณ 56 รอบในการดำเนินการในขณะที่การกำหนดพอร์ตโดยตรงจะใช้เวลา 2 รอบ นั่นเป็นความแตกต่างครั้งใหญ่สำหรับโปรแกรมที่มีการดำเนินงาน IO มากมาย



2

ตามที่แนะนำข้างต้นเข้าถึงพอร์ตดิจิตอลโดยตรง แต่มีสไตล์!

ด้วยการเขียนค่าฮาร์ดโค้ดลงในรีจิสเตอร์ฮาร์ดแวร์โดยตรงคุณจะสูญเสียความสามารถในการอ่านและพกพาได้

ฉันเผยแพร่ใน Github เครื่องมือที่ฉันเรียกว่า HWA ที่ให้คุณใช้ส่วนต่อประสานเชิงวัตถุกับฮาร์ดแวร์ที่ไม่ต้องการคอมไพเลอร์ C ++ และสร้างไบนารี่ประสิทธิภาพสูง

มี HWA: https://github.com/duparq/hwa


1
"รหัสไบนารี่ที่มีประสิทธิภาพสูง" จะให้ประโยชน์มากกว่าการวัดจริง
Dmitry Grigoryev

2

คนที่ Arduino.SE ได้พูดคุยและทดสอบแล้ว ในฐานะที่เป็นมันจะเปิดออกไม่มากของการปรับปรุงกว่าปกติdigitalWriteFast() digitalWrite()การเข้าถึงพอร์ตโดยตรง แต่เป็นเรื่องเกี่ยวกับ 35-40 digitalWrite()ครั้งเร็วกว่า


0

ใช้ChipKit Uno32 มันเร็วกว่า Arduinos ที่ใช้ AVR เป็นอย่างมาก นอกจากนี้ยังจะจัดการกับปัญหาเวลาของคุณ


1
ฉันไม่คิดว่าการซื้อฮาร์ดแวร์ที่เร็วกว่านั้นเป็นคำตอบที่ดีที่สุดที่นี่อย่างน้อยก็จนกว่าคุณจะถึงขีด จำกัด ของฮาร์ดแวร์ปัจจุบันของคุณและตัดสินใจว่าคุณต้องการสิ่งที่เร็วกว่า
Jon L

1
ทำไมต้องลงคะแนน? เขาต้องการทางออกที่เร็วที่สุดไม่ใช่แค่โซลูชันที่เร็วกว่าซึ่งฉันได้ให้ไว้ ใครสามารถแนะนำวิธีแก้ปัญหาบน Arduino ได้เร็วขึ้น?
Leon Heller

12
เพราะ ChipKit ไม่ใช่ arduino แต่เป็นแพลตฟอร์มที่รองรับ arduino ซึ่งหมายความว่าแม้ว่าการเปลี่ยนพอร์ตจะเร็วกว่า แต่ก็มีความเป็นไปได้สูงที่จะมีการเขียนไลบรารีใหม่ อีเธอร์เน็ต, XBee, การ์ด SD ในห้องสมุดอาจไม่ทำงานนอกกรอบ นอกจากนี้ Mark ยังขอให้มีการเรียกใช้ฟังก์ชั่นทางเลือกอื่น ๆ ของ digitalRead / Write ไม่ใช่สำหรับแพลตฟอร์มใหม่ (doh)
ฮันส์

2
การเปลี่ยนฮาร์ดแวร์ไม่ใช่วิธีที่ดี อย่างน้อยที่สุดคุณก็พลาดการเรียนรู้ที่ดีและจะไม่มีทางเรียนรู้ว่าอะไรจะเป็นการใช้ฮาร์ดแวร์อย่างมีประสิทธิภาพ
Rick_2047

1
@ Rick_2047 ฉันจะไม่พูดว่า "ไม่เคย" - ถ้าความต้องการนั้นเป็นของใหม่หรือขยายตัวหรือปริมาณเพิ่มขึ้น แต่ฉันยอมรับว่าการขว้างฮาร์ดแวร์อย่างไร้ประสิทธิภาพด้วยซอฟต์แวร์ขั้นต้นนั้นไม่มีความซับซ้อน - บางครั้งมันก็ไม่ทำงานเนื่องจากระบบประสิทธิภาพสูงสามารถเพิ่มค่าใช้จ่ายของตัวเองและบางครั้งก็ช้ากว่างานที่ง่ายกว่าสำหรับงานบางอย่าง ไม่มีสิ่งใดมาแทนที่การเรียนรู้เกี่ยวกับแพลตฟอร์มที่คุณใช้หรือพิจารณาการใช้งาน
Chris Stratton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.