दे रहा है मैं एम्बेडेड सिस्टम पर उपयोग करने के लिए एक कॉम्पैक्ट डीबग आउटपुट/यूनिट परीक्षण उपयोगिता पर काम कर रहा हूं।सी (एंबेडेड): स्रोत फ़ाइल अद्वितीय आईडी
मैंने एक सिस्टम बनाया है जहां मैं एक सीरियल पोर्ट पर कॉम्पैक्ट तरीके से संदेशों को आउटपुट कर सकता हूं। मेमोरी स्पेस/सीरियल पोर्ट बैंडविड्थ को सहेजने के लिए मैंने उन्हें अद्वितीय 16-बिट आईडी देकर एम्बेडेड सिस्टम से संदेश स्ट्रिंग को तोड़ दिया है।
यह बहुत सीधे आगे था क्योंकि मैंने सभी संदेशों को 1 सूची में रखा था।
projectdefs.h:
#define MESSAGE_TABLE(MSG) \
MSG(HELLO, "Hello World!") \
MSG(TEST, "Second message #ID 1") \
MSG(TEST2, "Third message #ID 2")
messages.h:
#define MACRO_STR_CONCAT(a,b) a##b
#define MESSAGE_ENUM(codeName, str) MACRO_STR_CONCAT(MSG_, codeName)
typedef enum messageNumbers_e {
MESSAGE_TABLE(MESSAGE_ENUM),
MESSAGE_COUNT
};
#define MESSAGE(codeName) messageSend(MACRO_STR_CONCAT(MSG_, codeName), __LINE__, file_number);
केवल डेटा सीरियल पोर्ट पर प्रसारित संदेश आईडी है, लाइन कुछ मैक्रो का एक गणन में डाल होगा संख्या और फ़ाइल संख्या (नोट; स्ट्रिंग नहीं!)।
मेरी समस्या यह है कि मैं सी प्रीप्रोसेसर/कंपाइलर का उपयोग करके प्रत्येक फ़ाइल में एक अद्वितीय आईडी कैसे निर्दिष्ट कर सकता हूं। मैं एम्बेडेड प्रोग्राम के अंदर प्रत्येक फ़ाइल नाम स्ट्रिंग को स्टोर नहीं करना चाहता हूं। यह सीरियल पोर्ट पर (बहुत अधिक) मेमोरी या बैंडविड्थ का उपयोग करता है।
मेरा विचार मैक्रो के साथ प्रत्येक फ़ाइल में निरंतर file_number को परिभाषित करना है। मैं एक स्रोत फ़ाइल के शीर्ष पर इस परिभाषा का प्रयोग करेंगे:
#define ASSIGN_FILENUMBER() enum { file_number = __COUNTER__ };
हालांकि के रूप में प्रत्येक फ़ाइल को अलग से संकलित किया गया है इसका मतलब है जब कहा जाता __COUNTER__
बयान हमेशा 0 पर शुरू होता है और अन्य फाइलों की उपस्थिति पता नहीं है या यह है अपनी आईडी
एक और विचार मेकफ़ाइल (स्क्रिप्ट) को संपादित करना और वहां फ़ाइल आईडी नंबर जोड़ना था। हालांकि, यह मेरे आईडीई कॉन्फ़िगरेशन के लिए प्रोजेक्ट बिल्ड/कार्यक्षमता को कसकर बांध देगा, जो वांछनीय नहीं है। इसके अलावा, मैं अपने वर्तमान आईडीई (एक्सप्लैश एक्स आईडीई या आईएआर एम्बेडेड वर्कबेंच पर एक्ससी 16/एक्ससी 32 कंपाइलर) के साथ संभावना के बारे में अनिश्चित हूं।
मुझे आश्चर्य है कि मानक सी प्रीप्रोसेसर कार्य करने के लिए कोई अन्य रचनात्मक तरीके हैं?
क्या आपका कंपाइलर प्रीकंपिल्ड हेडर का समर्थन करता है? प्रीकंपील्ड हेडर '__COUNTER__' मान जारी रख सकता है, कम से कम यह एमएसवीसी दस्तावेज में लिखा गया है। –
क्या यह ठीक होगा यदि आपने ओ (1) एल्गोरिदम के साथ गतिशील रूप से एक अद्वितीय आईडी उत्पन्न की है? या मुझे प्रश्न नहीं मिल रहा है: o –
मैंने 'ASSIGN_FILENUMBER' मैक्रो के साथ हेडरफ़ाइल मैन्युअल रूप से प्रीकंपाइल करने का प्रयास किया है। मेरा कंपाइलर जीसीसी आधारित है, लेकिन इसका दावा नहीं है। मैं देख सकता हूं कि प्रीकंपील्ड हेडर फ़ाइल को उठाया गया है (-एच आउटपुट), हालांकि, प्रोसेसर-विशिष्ट परिभाषा संकलित करने में असफल होती है: 'अवैध विशेषता स्थान, __sfr__, __unsafe__, आदि अनदेखा'। सी में लिखे गए एम्बेडेड सॉफ़्टवेयर के रूप में पूर्ण स्थिर प्रोग्राम हैं, यह डिवाइस के अंदर आईडी के गतिशील रूप से आवंटित/गणना करने के लिए समझ में नहीं आता है। इसके अलावा, मेजबान के लिए ट्रैक करना मुश्किल होगा। – Hans