Message Queue สำหรับ RTOS สำหรับไมโครคอนโทรลเลอร์


10

ฉันกำลังเขียน RTOS สำหรับไมโครคอนโทรลเลอร์ สิ่งทั้งหมดเขียนใน C ++ 11 - ถ้าใครสนใจและลิงค์ไปยังที่เก็บอยู่ด้านล่าง

ขณะนี้ฉันกำลังเขียนคลาสที่เป็นคิวข้อมูลแบบง่ายสำหรับการส่งวัตถุระหว่างเธรด (หรือระหว่างตัวจัดการอินเตอร์รัปต์และเธรดหรือตัวจัดการอินเตอร์รัปต์และตัวจัดการอินเตอร์รัปต์อื่น) โดยปกติฉันพยายามติดตาม API ทั่วไปที่พบในโครงการอื่น ๆ แต่ฉันไม่พบตัวอย่างของคิวที่เกิดขึ้นพร้อมกันที่มีemplace()ฟังก์ชันและรองรับการหมดเวลา

"ปัญหา" ทั่วไปของฉันคือฉันไม่สามารถตัดสินใจระหว่างสองอินเตอร์เฟส:

( std::chrono::duration<Rep, Period>เป็นเทมเพลตฉันละเว้นเทมเพลตสำเร็จรูปเพื่อความชัดเจน)

รุ่นแรก:

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>);
    ...
}

รุ่นที่สอง:

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&&);
    ...
}

(จะมีชุดที่สองของฟังก์ชั่นเหล่านี้...Untilต่อท้าย - เหล่านี้จะใช้ timepoint แทนระยะเวลา)

เวอร์ชันแรกตามหลัง "สไตล์ทั่วไป" ของการมีการหมดเวลาเป็นพารามิเตอร์สุดท้าย (ตัวอย่างคือ POSIX คิวข้อความstd::condition_variable, คิวแบบง่าย ๆ ใน RTOS ใด ๆ สำหรับไมโครคอนโทรลเลอร์) ปัญหาคือไม่สามารถมีอาร์กิวเมนต์การหมดเวลานี้เป็นครั้งสุดท้ายสำหรับฟังก์ชัน tryEmplaceFor () เพราะในกรณีของเท็มเพลตแบบแปรปรวน "รู้จัก" จะต้องเป็นอันดับแรก (*) ดังนั้นรุ่นที่สองคือ "สอดคล้องกัน" - ฟังก์ชั่นทั้งหมดที่มีการหมดเวลามีการหมดเวลาเป็นอาร์กิวเมนต์แรก ตัวแปรนี้มีปัญหาที่เห็นได้ชัดว่าอาจเป็นตัวอย่างแรกของการหมดเวลาเป็นอาร์กิวเมนต์แรกสำหรับฟังก์ชันดังกล่าว

อินเทอร์เฟซใดที่จะรองรับระบบปฏิบัติการได้ดีกว่า:

  • มาตรฐานที่กำหนดขึ้นของการมีการหมดเวลาเป็นอาร์กิวเมนต์สุดท้าย (ยกเว้นtryEmplaceFor()และtryEmplaceUntil()- ซึ่งต้องเป็นอาร์กิวเมนต์แรก (*)) หรือไม่
  • ความสอดคล้อง - ต้องการหมดเวลาเป็นอาร์กิวเมนต์แรกหรือไม่

(*) - ฉันรู้ว่าในทางเทคนิคแล้วฉันอาจมีการหมดเวลาเป็นอาร์กิวเมนต์สุดท้ายสำหรับtryEmplaceFor()และtryEmplaceUntil()แต่ฉันควรหลีกเลี่ยงการใช้มายากลแม่แบบดังกล่าวสำหรับสถานการณ์ง่าย ๆ - ทำอินสแตนซ์ recursive เหล่านี้ทั้งหมดเพื่อให้ได้อาร์กิวเมนต์สุดท้าย โดยเฉพาะอย่างยิ่งเมื่อฉันเห็นภาพข้อผิดพลาดคอมไพเลอร์จะผลิตในกรณีที่ผู้ใช้ทำอะไรผิดพลาด ...



ความแตกต่างระหว่างรุ่นที่หนึ่งและสองคืออะไร? กรุณาเน้น
JBRWilkinson

1
การสังเกต: ไม่ใช่ทุกคนที่รู้ว่า POSIX ดีพอที่จะต้องใส่ใจกับการวางตำแหน่งของเวลา แต่ทุกคนที่ใช้อินเทอร์เฟซของคุณจะไม่พอใจกับ API ที่ไม่สอดคล้องกัน ฉันลงคะแนน # 2
J Trana

คำตอบ:


0

ตามที่แนะนำโดยคำตอบที่ถูกลบ (น่าเสียดาย) และความคิดเห็นฉันตาม "ความสอดคล้อง" บรรทัด (ตัวแปรที่สองนำเสนอ) - ในทั้งหมด "ลอง ... สำหรับ" และ "ลอง ... จนกว่า" จะทำหน้าที่หมดเวลา (ระยะเวลาหรือ จุดเวลา) เป็นอาร์กิวเมนต์แรก

นี่คือรหัสในขั้นตอนปัจจุบัน - ลิงค์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.