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 .
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 .
Câu trả lời:
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):
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
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 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ả.
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;)