Microcontrollers के लिए RTOS के लिए संदेश कतार


10

मैं वर्तमान में microcontrollers के लिए RTOS लिख रहा हूँ। पूरी बात C ++ 11 में लिखी गई है - अगर किसी को दिलचस्पी है, और रिपॉजिटरी का लिंक सबसे नीचे है।

वर्तमान में मैं एक वर्ग लिख रहा हूं जो थ्रेड्स के बीच (या बीच वाले हैंडलर और थ्रेड्स या इंटरप्ट हैंडलर और अन्य इंटरप्ट हैंडलर) के बीच ऑब्जेक्ट्स को पास करने के लिए एक सरल डेटा कतार है। आमतौर पर मैं अन्य परियोजनाओं पर पाए जाने वाले कुछ सामान्य एपीआई का पालन करने की कोशिश करता हूं, फिर भी मुझे समवर्ती कतार का कोई उदाहरण नहीं मिला है जिसमें 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प्रत्यय के साथ इन कार्यों का दूसरा सेट होगा - ये अवधि के बजाय समय-सीमा का उपयोग करेंगे)

पहला संस्करण अंतिम पैरामीटर के रूप में टाइमआउट होने के "सामान्य शैली" का अनुसरण करता है (उदाहरण POSIX संदेश कतारें हैं, std::condition_variableऔर माइक्रोकंट्रोलर के लिए किसी भी आरटीओएस में सरल कतारें)। मुद्दा यह है कि tryEmplaceFor () फ़ंक्शन के लिए अंतिम समय के रूप में यह टाइमआउट तर्क होना संभव नहीं है, क्योंकि वैरिएड टेम्प्लेट के मामले में "ज्ञात" तर्क पहले (*) होना चाहिए। तो दूसरा संस्करण "सुसंगत" है - टाइमआउट वाले सभी कार्यों में पहले तर्क के रूप में टाइमआउट है। इस संस्करण में इस तरह की कार्यक्षमता के लिए पहले तर्क के रूप में टाइमआउट होने का पहला उदाहरण होने की एक स्पष्ट समस्या है।

कौन सा इंटरफ़ेस बेहतर ओएस की सेवा करेगा:

  • पिछले तर्क के रूप में समय समाप्त होने के स्थापित मानक (के अपवाद के साथ tryEmplaceFor()और tryEmplaceUntil()- जहां यह पहला तर्क होना चाहिए (*))?
  • संगति - पहले तर्क होने के लिए टाइमआउट पसंद करते हैं?

(*) - मुझे पता है कि तकनीकी रूप से मैं अंतिम तर्क के रूप में समय समाप्त हो सकता है tryEmplaceFor()और tryEmplaceUntil(), लेकिन मैं इस तरह के सरल परिदृश्य के लिए इस तरह के टेम्पलेट जादू का उपयोग करने से बचूंगा - इन सभी पुनरावर्ती तात्कालिकता को करने के लिए बस अंतिम तर्क थोड़ा अधिक लगता है, विशेष रूप से जब मैं त्रुटियों का अनुमान लगाता हूं कि कंपाइलर उपयोगकर्ता के मामले में कुछ गलत करेगा ...



पहले और दूसरे संस्करण में क्या अंतर है? कृपया हाइलाइट करें।
JBRWilkinson

1
अवलोकन: हर कोई इतना नहीं जानता है कि समय के प्लेसमेंट से परेशान होने के लिए पोसिक्स अच्छी तरह से जानता है, लेकिन आपके इंटरफ़ेस का उपयोग करने वाला हर कोई असंगत एपीआई से निराश होगा। मैं # 2 वोट देता हूं।
जे तृण

जवाबों:


0

जैसा कि एक उत्तर के रूप में सुझाव दिया गया था जिसे हटा दिया गया था (दुर्भाग्य से) और टिप्पणियों में, मैंने "निरंतरता" लाइन (दूसरा प्रस्तुत किया गया संस्करण) का पालन किया - सभी "कोशिश ..." और "कोशिश ... जब तक" समयबाह्य अवधि (अवधि) के लिए समय बिंदु) पहला तर्क है।

यह वर्तमान चरण में लिंक है - लिंक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.