Hàng đợi tin nhắn cho RTOS cho vi điều khiển


10

Tôi hiện đang viết một RTOS cho vi điều khiển. Toàn bộ điều được viết bằng C ++ 11 - nếu có ai quan tâm và liên kết đến kho lưu trữ ở phía dưới.

Hiện tại tôi đang viết một lớp là một hàng đợi dữ liệu đơn giản để truyền các đối tượng giữa các luồng (hoặc giữa các trình xử lý ngắt và các luồng hoặc các trình xử lý ngắt và các trình xử lý ngắt khác). Thông thường tôi cố gắng làm theo một số API phổ biến được tìm thấy trong các dự án khác, nhưng tôi không tìm thấy bất kỳ ví dụ nào về hàng đợi đồng thời có emplace()chức năng hỗ trợ thời gian chờ.

"Vấn đề" chung của tôi là tôi không thể quyết định giữa hai giao diện này:

( std::chrono::duration<Rep, Period>là một kiểu templated, tôi bỏ qua mẫu soạn sẵn cho rõ ràng)

Phiên bản đầu tiên:

template<typename T>
class FifoQueue
{
public:
    ...
    template<typename... Args>
    int tryEmplaceFor(std::chrono::duration<Rep, Period>, Args&&... args);
    int tryPopFor(T&, std::chrono::duration<Rep, Period>);
    int tryPushFor(const T&, std::chrono::duration<Rep, Period>);
    int tryPushFor(T&&, std::chrono::duration<Rep, Period>);
    ...
}

Phiên bản thứ hai:

template<typename T>
class FifoQueue
{
public:
    ...
    template<typename... Args>
    int tryEmplaceFor(std::chrono::duration<Rep, Period>, Args&&... args);
    int tryPopFor(std::chrono::duration<Rep, Period>, T&);
    int tryPushFor(std::chrono::duration<Rep, Period>, const T&);
    int tryPushFor(std::chrono::duration<Rep, Period>, T&&);
    ...
}

(sẽ có một bộ thứ hai của các hàm này có ...Untilhậu tố - chúng sẽ sử dụng dấu thời gian thay vì thời lượng)

Phiên bản đầu tiên tuân theo "phong cách chung" là có thời gian chờ là tham số cuối cùng (ví dụ là hàng đợi tin nhắn POSIX std::condition_variable, hàng đợi đơn giản trong bất kỳ RTOS nào cho vi điều khiển). Vấn đề là không thể có đối số hết thời gian này là đối số cuối cùng cho hàm tryEmplaceFor (), bởi vì trong trường hợp các đối số "đã biết" của các mẫu biến đổi phải là đầu tiên (*). Vì vậy, phiên bản thứ hai là "nhất quán" - tất cả các chức năng có thời gian chờ đều có thời gian chờ là đối số đầu tiên. Biến thể này có một vấn đề rõ ràng là có thể là ví dụ đầu tiên về việc hết thời gian làm đối số đầu tiên cho chức năng đó.

Giao diện nào sẽ phục vụ HĐH tốt hơn:

  • thiết lập tiêu chuẩn có thời gian chờ là đối số cuối cùng (ngoại trừ tryEmplaceFor()tryEmplaceUntil()- trong đó phải là đối số đầu tiên (*))?
  • tính nhất quán - thích thời gian chờ là đối số đầu tiên?

(*) - Tôi biết rằng về mặt kỹ thuật tôi có thể có thời gian chờ như là đối số cuối cùng cho tryEmplaceFor()tryEmplaceUntil(), nhưng tôi thà tránh sử dụng ví dụ mẫu ma thuật cho kịch bản đơn giản như vậy - làm tất cả những instantiations đệ quy chỉ để có được tranh luận cuối cùng dường như một chút quá mức cần thiết, đặc biệt là khi tôi hình dung trình biên dịch lỗi sẽ tạo ra trong trường hợp người dùng làm gì đó sai ...



Sự khác biệt giữa phiên bản thứ nhất và thứ hai là gì? Hãy làm nổi bật.
JBRWilkinson

1
Quan sát: không phải ai cũng biết POSIX đủ để bị làm phiền bởi việc sắp xếp thời gian, nhưng mọi người sử dụng giao diện của bạn sẽ bị thất vọng bởi API không nhất quán. Tôi bỏ phiếu số 2.
J Trana

Câu trả lời:


0

Như được đề xuất bởi một câu trả lời đã bị xóa (không may) và các bình luận, tôi đã theo dòng "nhất quán" (biến thể được trình bày thứ hai) - trong tất cả các chức năng "thử ... Cho" và "thử ... cho đến khi" hết thời gian (thời lượng hoặc điểm thời gian) là đối số đầu tiên.

Đây là mã ở giai đoạn hiện tại - liên kết

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.