मैं फ्रीआरटीओएस का उपयोग कर एक नया एम्बेडेड सिस्टम डिज़ाइन शुरू कर रहा हूं। मेरा आखिरी इस्तेमाल ईकोस का उपयोग करता है, जिसमें एक अंतर्निहित HTTP सर्वर है जो वास्तव में हल्का है, खासकर जब से मेरे पास फाइल सिस्टम नहीं था। जिस तरह से यह काम करता है, संक्षेप में, यह था कि प्रत्येक पृष्ठ एक सीजीआई-जैसे सी फ़ंक्शन था जिसे HTTP डिमन द्वारा आवश्यकतानुसार कॉल किया गया था। विशेष रूप से, आप प्रपत्र के एक समारोह लिखते थे:सी या सी ++ HTTP डिमन एक थ्रेड में?
int MyWebPage(FILE* resp, const char* page, const char* params, void* uData);
जहां page
यूआरएल के पेज हिस्सा था, params
किसी भी रूप मानकों थे (केवल GET समर्थित किया गया, पोस्ट नहीं है, जो फ़ाइल अपलोड रोका और इस तरह जल कर दिया फ्लैश एक दर्द), uData
उस फ़ंक्शन को पास किया गया है जब आपने फ़ंक्शन पंजीकृत किया था, ताकि आप एक ही फ़ंक्शन को कई यूआरएल या विभिन्न डेटा के साथ श्रेणियों की सेवा कर सकें, और resp
एक फाइल हैंडल है जिसे आप HTTP प्रतिक्रिया लिखते हैं (हेडर और सभी) बाहर।
तो फिर तुम साथ समारोह पंजीकृत:
CYG_HTTPD_TABLE_ENTRY(www_myPage, "/", MyWebPage, 0);
जहां CYG_HTTPD_TABLE_ENTRY
एक मैक्रो जहां पहले पैरामीटर एक चर नाम था है, दूसरा एक पृष्ठ URL था (*
वाइल्डकार्ड अनुमति दी है, इसलिए page
को पारित कर दिया हो रही है MyWebPage()
), तीसरा फ़ंक्शन पॉइंटर है, और अंतिम uData
मान है।
तो एक साधारण उदाहरण:
int HelloWorldPage(FILE* resp, const char*, const char* params, void*)
{
fprintf("Content-Type: text/html;\n\n");
fprintf("<html><head><title>Hello World!</title></head>\n");
fprintf("<body>\n");
fprintf("<h1>Hello, World!</h1>\n");
fprintf("<p>You passed in: %s</p>\n", params);
fprintf("</body></html>\n");
}
CYG_HTTPD_TABLE_ENTRY(www_hello, "/", HelloWorldPage, 0);
(वास्तव में, params
एक समारोह के माध्यम से एचटीएमएल जादू पात्रों से बचने के लिए पारित किया जाना होता है, और मैं बाहर एक और जोड़ी के कार्यों का उपयोग करेंगे पैरामीटर विभाजित करने के लिए और बनाने के एक <ul>
इसके बारे में, लेकिन मैंने स्पष्टता के लिए इसे छोड़ दिया।)
सर्वर स्वयं ही एक कार्य (यानी धागा) के रूप में चला गया और जब तक महत्वपूर्ण कार्यों की तुलना में इसकी प्राथमिकता कम थी, तब तक इस तरह से नहीं पहुंच पाया।
कहने की जरूरत नहीं है, यह परीक्षण और डिबगिंग के लिए अमूल्य साबित हुआ है। (एम्बेडेड काम के साथ एक समस्या यह है कि आप आमतौर पर लॉग के रूप में उपयोग करने के लिए एक्सटर्म को टॉस नहीं कर सकते हैं।) तो जब सुप्रीम प्रोग्रामर ने मुझे कुछ काम करने के लिए रिफ्लेक्सिव रूप से दोषी ठहराया (कम से कम प्रतिरोध का मार्ग, मुझे लगता है), तो मैं खींच सकता था वेब पेज और दिखाएं कि उसने मुझे खराब पैरामीटर भेजे हैं। एकीकरण में बहुत सारे डीबग समय बचाया।
तो वैसे भी ... मुझे आश्चर्य है, क्या ऐसा कुछ स्वतंत्र पुस्तकालय के रूप में उपलब्ध है? कुछ जो मैं लिंक कर सकता हूं, मेरे कॉलबैक पंजीकृत कर सकता हूं, थ्रेड फेंक सकता हूं, और जादू कर सकता हूं? या क्या मुझे अपना खुद का क्रैंक करने की ज़रूरत है? मैं सी ++ पसंद करूंगा, लेकिन शायद सी पुस्तकालय का भी उपयोग कर सकता हूं।
संपादित करें: चूंकि मैं इस पर एक बक्षीस डाल रहा हूं, मुझे यह स्पष्ट करने की आवश्यकता है कि लाइब्रेरी को ओपन-सोर्स लाइसेंस के तहत होना आवश्यक है।
फ्रीआरटीओएस अपना आईपी स्टैक प्रदान नहीं करता है, लेकिन यह एलडब्ल्यूआईपी और यूआईपी का समर्थन करता है। असल में, मैं एक लाइब्रेरी के साथ ठीक रहूंगा जो एक सॉकेट-जैसी एपीआई का समर्थन करता है या यदि किसी लाइब्रेरी को मुझे कुछ "इन बाइट्स भेजें" और "उन बाइट्स प्राप्त हुए" कार्यों को लिखने की आवश्यकता है। –