ฉันกำลังเขียน 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 เหล่านี้ทั้งหมดเพื่อให้ได้อาร์กิวเมนต์สุดท้าย โดยเฉพาะอย่างยิ่งเมื่อฉันเห็นภาพข้อผิดพลาดคอมไพเลอร์จะผลิตในกรณีที่ผู้ใช้ทำอะไรผิดพลาด ...