2012-12-22 53 views
15

Tôi có một vài nhiệm vụ để làm với arduino nhưng một trong số họ mất rất nhiều thời gian, vì vậy tôi đã suy nghĩ để sử dụng các chủ đề để chạy chúng cùng một lúc. Tôi có Arduino MegaArduino có hỗ trợ luồng không?

[Cập nhật] Cuối cùng sau bốn năm tôi có thể cài đặt FreeRTOS trong mega arduino của mình. Dưới đây là một số link

Trả lời

0

Câu trả lời trước đó là chính xác, tuy nhiên, Arduino thường chạy khá nhanh, vì vậy nếu bạn đúng mã thời gian của bạn, nó có thể hoàn thành nhiệm vụ nhiều hơn hoặc ít hơn cùng một lúc.

Cách tốt nhất là để làm cho chức năng của riêng bạn và tránh đặt quá nhiều mã thực trong khoảng trống mặc định vòng lặp

+7

Tôi không thể đồng ý với điều này: "Cách tốt nhất là tạo các chức năng của riêng bạn và tránh đặt quá nhiều mã thực trong vòng trống mặc định" - không quan trọng liệu mã có nằm trong vòng lặp hay trong chức năng của riêng, nếu nó được * gọi * từ vòng lặp, nó khá nhiều điều tương tự thời gian khôn ngoan (cộng với một chức năng nhỏ gọi trên không) –

+2

@MartinThompson Tôi không nghĩ rằng ông đã viết về nó thời gian khôn ngoan. Tôi nghĩ rằng anh ta đang đề cập đến tổ chức chức năng, thực tế là nó thực tế hơn nhiều để sắp xếp lại mã sau này (thêm TimedAction hoặc ArduinoThread sau này vào cùng một mã, ví dụ). – FrancescoMM

+1

@FrancescoMM: cảm ơn - Tôi đã không đọc nó theo cách đó, nhưng bây giờ bạn nhắc đến nó, có lẽ đó là ý nghĩa của OP! Tôi nghĩ rằng đề cập đến "thời gian" trong câu đầu tiên thông qua tôi. –

4

Chưa, nhưng tôi luôn luôn sử dụng thư viện này với các dự án lớn: https://github.com/ivanseidel/ArduinoThread

tôi nơi gọi lại trong một ngắt Timer, và voilá! Bạn đã giả đề chạy trên Arduino ...

3

luồng Không thật nhưng TimedActions là một lựa chọn tốt cho nhiều sử dụng

http://playground.arduino.cc/Code/TimedAction#Example

Tất nhiên, nếu khối một nhiệm vụ, những người khác sẽ quá, trong khi luồng có thể cho phép một tác vụ đóng băng và những người khác sẽ tiếp tục ...

4

Chỉ cần làm cho chuỗi này hoàn chỉnh hơn: còn có protothreads có dấu chân bộ nhớ rất nhỏ (cặp byte nếu tôi nhớ đúng) và bảo toàn biến địa phương vào chủ đề; rất tiện dụng và tiết kiệm thời gian (các máy trạng thái hữu hạn hơn rất nhiều -> mã dễ đọc hơn).

Các ví dụ và mã: arduino-class/ProtoThreads wiki

Chỉ cần để cho bạn biết những gì kết quả mà bạn có thể mong đợi: giao tiếp nối tiếp @ 153K6 baudrate với chủ đề về: điốt tình trạng nhấp nháy, thời gian lưu giữ, chức năng yêu cầu đánh giá, xử lý IO và logic và tất cả trên atmega328.

0

Bạn có thể sử dụng arduinos

Nó được thiết kế cho môi trường Arduino. Các tính năng:

  • Chỉ phân bổ tĩnh (không malloc/mới)
  • Hỗ trợ chuyển đổi ngữ cảnh khi trì hoãn thực hiện
  • Thực hiện semaphores
  • Nhẹ, cả CPU và bộ nhớ

Tôi sử dụng nó khi Tôi cần phải nhận lệnh mới từ bluetooth/mạng/nối tiếp trong khi thực hiện các lệnh cũ và các lệnh cũ có sự chậm trễ trong chúng. Một sợi là sợi sever mà không vòng lặp sau:

while (1) { 
    while ((n = Serial.read()) != -1) { 
     // do something with n, like filling a buffer 
     if (command_was_received) { 
      arduinos_create(command_func, arg); 
     } 
    } 
    arduinos_yield(); // context switch to other threads 
} 

khác là thread lệnh đó thực hiện lệnh:

int command_func(void* arg) { 
    // move some servos 
    arduinos_delay(1000); // wait for them to move 
    // move some more servos 
} 
0

Không bạn có thể không nhưng bạn có thể sử dụng Timer ngắt.