Chức năng gọi không đồng bộ trong bản phác thảo Arduino


14

Trong một bản phác thảo Arduino, có cách nào để thực hiện các cuộc gọi hàm không đồng bộ trong vòng lặp không? Thích nghe yêu cầu thông qua máy chủ http và xử lý chúng theo cách không chặn .


1
Nếu bạn không phải là người mới bắt đầu C ++, thì bạn có thể xem thư viện Cosa ( github.com/mikaelpatel/Cosa ). Nó là một bản viết lại hoàn chỉnh của thư viện Arduino để làm cho nó tốt hơn: OOP và thường được điều khiển ngắt. Tôi nghĩ rằng họ hỗ trợ HTTP, nhưng tôi chưa kiểm tra phần đó.
jfpoilpret

Câu trả lời:


11

Có và không. Bạn đang mơ hồ về những gì bạn muốn làm. Tôi đã thực hiện điều này thành một vài phần khác nhau (chủ yếu tập trung vào việc đọc dữ liệu cảm biến ... nó áp dụng cho mọi thứ nhưng đó là bối cảnh tôi đang sử dụng):

Chủ đề

AFAIK tất cả Arduinos chỉ có một lõi (họ có thể làm một việc một lúc). Đối với hầu hết các bo mạch Arduino, đa luồng phần cứng không được hỗ trợ. Tuy nhiên, có nhiều cách để thực hiện đa luồng phần mềm . Cách tiếp cận của AsheeshR sẽ không hoạt động tốt đối với các chức năng mất nhiều thời gian để hoàn thành (nghĩa là một cái gì đó trong thư viện mất một thời gian hoặc chậm trễ) bởi vì nó sẽ bị kẹt bởi các hướng dẫn đó, nhưng nó sẽ hoạt động tốt chức năng như thế nào pinMode(). Thư viện Protothreads được liệt kê ở đó có thể tốt hơn về điều này, nhưng tôi không thực sự biết.

Thật khó để phối hợp điều này với HTTP, đặc biệt là khi bạn phải thực hiện

Sự chậm trễ

Một cách phổ biến để một bản phác thảo bị đình trệ là việc sử dụng độ trễ. Điều này có thể được giải quyết bằng cách sử dụng, trong vòng lặp chính, một câu lệnh if và millis()hàm trả về thời gian (không phải là thời gian đồng hồ, mà là thời gian kể từ khi Arduino bắt đầu). Bạn cũng có thể thực hiện một vòng lặp trong vòng lặp để thăm dò dữ liệu cảm biến.

Cách millis()tiếp cận sẽ không hoạt động tốt với những thứ khiến toàn bộ chương trình bị đình trệ (nghĩa là nhiều sự chậm trễ hoặc vòng lặp kéo dài trong một khoảng thời gian đáng chú ý). Lưu ý rằng 100ms IIRC là thời gian tối đa chung để làm cho giao diện người dùng không bị lag.

Ngắt

Ngắt là một cách tuyệt vời để giữ cho mọi thứ gần như không đồng bộ. Họ chạy một đoạn mã ngắn (mà bạn chỉ định) mỗi khi trạng thái pin thay đổi. Nó phá vỡ từ loop()và quay trở lại nơi nó rời đi sau khi " ISR " được chạy. Tôi không có nhiều thời gian để giải thích cách thực hiện việc này, nhưng tìm kiếm nhanh trên Google sẽ mang lại rất nhiều kết quả.


Theo như bạn ví dụ, phần luồng sẽ được áp dụng nhiều nhất. Chủ đề này khá mơ hồ, vì vậy bạn sẽ phải thử nghiệm một vài điều và tìm ra thứ gì đó hiệu quả.


3

Tôi vừa đăng một số mã cho một trình lập lịch tác vụ trên sân chơi vào ngày khác, bạn có thể muốn xem qua, có thể bạn có thể điều chỉnh nó theo nhu cầu của bạn.

Bộ xử lý của Arduino vốn chỉ đơn luồng và không thể đa tác vụ. Tuy nhiên, như đã đề cập, có nhiều cách để tạo ra ảo ảnh về đa tác vụ. Annonomus Penguin đánh vào những người khá tốt.

Ngoài ra hãy xem TimerOne (Có lẽ tốt hơn;)


TimerOne là một ý tưởng tồi vì nó chỉ hoạt động với các arduinos dựa trên avr. Ví dụ, Wemos D1 R1 của tôi không hoạt động
Vyachaslav Gerchicov 23/2/2016
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.