อะไรคือทางเลือกที่เร็วที่สุดในการเรียกใช้ฟังก์ชั่น Arduino digitalread()
และdigitalwrite()
? AVR หรือโซลูชั่นเฉพาะชิปนั้นเป็นที่ยอมรับ
อะไรคือทางเลือกที่เร็วที่สุดในการเรียกใช้ฟังก์ชั่น Arduino digitalread()
และdigitalwrite()
? AVR หรือโซลูชั่นเฉพาะชิปนั้นเป็นที่ยอมรับ
คำตอบ:
เข้าถึงพอร์ตดิจิตอลโดยตรง!
3 วิธีที่ฉันทดสอบคือ
- digitalWrite (พินต่ำ); digitalWrite (พินสูง);
- CLR (PORTB, 0); ชุด (PORTB, 0);
- PORTB | = _BV (0); PORTB & = ~ (_BV (0));
[ ... ]
อย่างที่คุณเห็น digitalWrite ใช้เวลาประมาณ 56 รอบในการดำเนินการในขณะที่การกำหนดพอร์ตโดยตรงจะใช้เวลา 2 รอบ นั่นเป็นความแตกต่างครั้งใหญ่สำหรับโปรแกรมที่มีการดำเนินงาน IO มากมาย
ห้องสมุดนี้เป็นทางเลือกที่ดี: http://code.google.com/p/digitalwritefast/
ตามที่แนะนำข้างต้นเข้าถึงพอร์ตดิจิตอลโดยตรง แต่มีสไตล์!
ด้วยการเขียนค่าฮาร์ดโค้ดลงในรีจิสเตอร์ฮาร์ดแวร์โดยตรงคุณจะสูญเสียความสามารถในการอ่านและพกพาได้
ฉันเผยแพร่ใน Github เครื่องมือที่ฉันเรียกว่า HWA ที่ให้คุณใช้ส่วนต่อประสานเชิงวัตถุกับฮาร์ดแวร์ที่ไม่ต้องการคอมไพเลอร์ C ++ และสร้างไบนารี่ประสิทธิภาพสูง
มี HWA: https://github.com/duparq/hwa
คนที่ Arduino.SE ได้พูดคุยและทดสอบแล้ว ในฐานะที่เป็นมันจะเปิดออกไม่มากของการปรับปรุงกว่าปกติdigitalWriteFast()
digitalWrite()
การเข้าถึงพอร์ตโดยตรง แต่เป็นเรื่องเกี่ยวกับ 35-40 digitalWrite()
ครั้งเร็วกว่า
ใช้ChipKit Uno32 มันเร็วกว่า Arduinos ที่ใช้ AVR เป็นอย่างมาก นอกจากนี้ยังจะจัดการกับปัญหาเวลาของคุณ