Arduino: các lựa chọn thay thế nhanh hơn cho digitalread () và digitalwrite ()?


13

Các lựa chọn thay thế nhanh nhất để gọi các chức năng Arduino là gì digitalread()và là digitalwrite()gì? Các giải pháp dành riêng cho chip hoặc dành riêng cho chip đều được chấp nhận.


3
Đọc điều này và câu hỏi cuối cùng của bạn, có vẻ như bạn muốn làm một cái gì đó khá nhanh chóng. Tôi nghĩ rằng việc cung cấp chi tiết về nó là gì và nhanh như thế nào có thể hữu ích.
Oli Glaser

@Oli, ý kiến ​​hay, cảm ơn. Dự án hiện tại là một hệ thống điều chỉnh cho các máy phát RC. Nó hoạt động tốt, nhưng tôi muốn làm cho việc giải mã tín hiệu RC PWM hiệu quả để tôi có thể sử dụng cùng một khung cho các dự án khác. Đây là một bài viết về những gì tôi có cho đến nay: winterbay-rc.blogspot.com/2011/11/ Khăn
Mark Harrison

Câu trả lời:


18

Truy cập các cổng kỹ thuật số trực tiếp!

3 phương pháp tôi đã thử nghiệm là

  • kỹ thuật sốWrite (pin, THẤP); kỹ thuật sốWrite (pin, CAO);
  • CLR (PORTB, 0); THIẾT LẬP (PORTB, 0);
  • PORTB | = _BV (0); PORTB & = ~ (_BV (0));

[...]

nhập mô tả hình ảnh ở đây

Như bạn có thể thấy, digitalWrite mất khoảng 56 chu kỳ để hoàn thành, trong khi địa chỉ Cổng trực tiếp mất 2 chu kỳ. Đó là một sự khác biệt lớn về thời gian đối với các chương trình có nhiều hoạt động IO!



2

Như đề xuất ở trên, truy cập các cổng kỹ thuật số trực tiếp. Nhưng với phong cách!

Bằng cách viết các giá trị được mã hóa trực tiếp vào các thanh ghi phần cứng, bạn mất khả năng đọc và tính di động.

Tôi đã xuất bản trên Github một công cụ mà tôi gọi là HWA cho phép bạn sử dụng giao diện hướng đối tượng đến phần cứng không yêu cầu trình biên dịch C ++ và tạo mã nhị phân hiệu quả cao.

HWA có ở đó: https://github.com/duparq/hwa


1
"Mã nhị phân hiệu quả cao" nghe có vẻ có thẩm quyền hơn nhiều cùng với các phép đo thực tế.
Dmitry Grigoryev

2

Mọi người tại Arduino.SE đã thảo luận và thử nghiệm điều này. Hóa ra, digitalWriteFast()không có nhiều cải thiện so với thường xuyên digitalWrite(). Truy cập cổng trực tiếp, tuy nhiên, nhanh hơn khoảng 35-40 lần digitalWrite().


0

Sử dụng ChipKit Uno32. Nó nhanh hơn nhiều so với Arduinos dựa trên AVR. Nó cũng sẽ đối phó với các vấn đề thời gian của bạn.


1
Tôi không nghĩ rằng mua phần cứng nhanh hơn là câu trả lời tốt nhất ở đây, ít nhất là cho đến khi bạn đạt đến giới hạn của phần cứng hiện tại và quyết định rằng bạn cần thứ gì đó nhanh hơn.
Jon L

1
Tại sao các downvote? Anh ấy muốn giải pháp nhanh nhất , không chỉ là giải pháp nhanh hơn mà tôi đã cung cấp. Bất cứ ai có thể đề nghị một giải pháp dựa trên Arduino nhanh hơn?
Leon Heller

12
Bởi vì ChipKit không phải là một arduino, mà là một nền tảng tương thích với arduino. Điều này có nghĩa là mặc dù chuyển đổi cổng nhanh hơn, có khả năng lớn là viết lại một số thư viện. Các thư viện thẻ Ethernet, XBee, SD có thể không hoạt động hoàn toàn. Hơn nữa, Mark đặc biệt yêu cầu các cuộc gọi chức năng thay thế của digitalRead / Write, không phải cho một nền tảng mới (doh).
Hans

2
Thay đổi phần cứng không bao giờ là một giải pháp tốt. Ít nhất bạn bỏ lỡ một số học tập tốt và sẽ không bao giờ học được những gì sẽ được sử dụng hiệu quả của phần cứng.
Rick_2047

1
@ Rick_2047 Tôi sẽ không nói "không bao giờ" - nếu yêu cầu là mới hoặc được mở rộng hoặc số lượng tăng lên, có thể có ý nghĩa khi xem xét các lựa chọn thay thế. Nhưng tôi đồng ý rằng việc ném phần cứng một cách mù quáng vào sự thiếu hiệu quả của phần mềm là không tinh vi - đôi khi nó thậm chí không hoạt động vì các hệ thống hiệu suất cao hơn có thể tự bổ sung và đôi khi kết thúc chậm hơn so với các nhiệm vụ đơn giản hơn. Thực sự không có gì thay thế cho việc tìm hiểu về nền tảng bạn sử dụng hoặc dự tính sử dụng.
Chris Stratton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.