2013-04-28 9 views
8

दे रहा है मैं एम्बेडेड सिस्टम पर उपयोग करने के लिए एक कॉम्पैक्ट डीबग आउटपुट/यूनिट परीक्षण उपयोगिता पर काम कर रहा हूं।सी (एंबेडेड): स्रोत फ़ाइल अद्वितीय आईडी

मैंने एक सिस्टम बनाया है जहां मैं एक सीरियल पोर्ट पर कॉम्पैक्ट तरीके से संदेशों को आउटपुट कर सकता हूं। मेमोरी स्पेस/सीरियल पोर्ट बैंडविड्थ को सहेजने के लिए मैंने उन्हें अद्वितीय 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 कंपाइलर) के साथ संभावना के बारे में अनिश्चित हूं।

मुझे आश्चर्य है कि मानक सी प्रीप्रोसेसर कार्य करने के लिए कोई अन्य रचनात्मक तरीके हैं?

+1

क्या आपका कंपाइलर प्रीकंपिल्ड हेडर का समर्थन करता है? प्रीकंपील्ड हेडर '__COUNTER__' मान जारी रख सकता है, कम से कम यह एमएसवीसी दस्तावेज में लिखा गया है। –

+0

क्या यह ठीक होगा यदि आपने ओ (1) एल्गोरिदम के साथ गतिशील रूप से एक अद्वितीय आईडी उत्पन्न की है? या मुझे प्रश्न नहीं मिल रहा है: o –

+0

मैंने 'ASSIGN_FILENUMBER' मैक्रो के साथ हेडरफ़ाइल मैन्युअल रूप से प्रीकंपाइल करने का प्रयास किया है। मेरा कंपाइलर जीसीसी आधारित है, लेकिन इसका दावा नहीं है। मैं देख सकता हूं कि प्रीकंपील्ड हेडर फ़ाइल को उठाया गया है (-एच आउटपुट), हालांकि, प्रोसेसर-विशिष्ट परिभाषा संकलित करने में असफल होती है: 'अवैध विशेषता स्थान, __sfr__, __unsafe__, आदि अनदेखा'। सी में लिखे गए एम्बेडेड सॉफ़्टवेयर के रूप में पूर्ण स्थिर प्रोग्राम हैं, यह डिवाइस के अंदर आईडी के गतिशील रूप से आवंटित/गणना करने के लिए समझ में नहीं आता है। इसके अलावा, मेजबान के लिए ट्रैक करना मुश्किल होगा। – Hans

उत्तर

6

मुझे यकीन नहीं है कि कार्यक्रम में स्रोत कोड फ़ाइल नाम संग्रहीत करना स्मृति के लिए इतना बड़ा सौदा है। यदि आप उन्हें प्राप्त कर सकते हैं, तो एक चीज जो आप कर सकते हैं वह const char *fname = __FILE__; जैसे चर को घोषित करता है और उसके बाद किसी प्रकार का चेकसम, हैश या सीआरसी की गणना करता है और फ़ाइल नाम के बजाय इस मान को प्रेषित करता है। प्राप्त करने वाले पक्ष पर आप हैश मान को फ़ाइल नामों में से किसी एक से मेल कर सकते हैं। आपको यह सुनिश्चित करने की आवश्यकता होगी कि फ़ाइल नाम हैश टकरा नहीं है, हालांकि।

एक और तरीका आपके मेकफ़ाइल या पर्ल या कुछ का उपयोग फाइल काउंटर को बनाए रखने और जीसीसी में मैक्रो के रूप में फ़ीड करने के लिए करना होगा, उदाहरण के लिए gcc [someparams1] -DFILENUMBER=%FILECOUNTER% somefile.c [someparams2], जहां %FILECOUNTER% वह अभिव्यक्ति है जो फ़ाइल काउंटर वैरिएबल के मान को टेक्स्ट के रूप में विस्तारित करेगी। आपको यहां स्रोत फ़ाइल संकलन का एक निश्चित क्रम पेश करने की आवश्यकता हो सकती है।

आप दो विधियों को जोड़ सकते हैं और काउंटर के बजाय हैश के साथ जीसीसी फ़ीड कर सकते हैं, उदा। -DFILENAMEHASH=%HASH%, जहां %HASH% एक संख्यात्मक स्थिरता तक विस्तारित होगा जो आपकी संकलन स्क्रिप्ट फ़ाइल नाम के आधार पर उत्पन्न होगी।

+2

से इंकार कर दिया जाता है, यह डेस्कटॉप पर तारों को स्टोर करने का एक बड़ा सौदा नहीं होगा, लेकिन यह सवाल एक एम्बेडेड एप्लिकेशन के बारे में पूछता है जहां चीजें बहुत तंग रखने के लिए अक्सर वांछनीय/आवश्यक होती है –

+0

मैंने जो किया है और क्रिस ने सुझाव दिया है। मैंने एक प्री-बिल्ड प्रोग्राम (थोड़ा सी # कंसोल प्रोग्राम जोड़ा है, लेकिन कुछ भी हो सकता है ..) जो मेकफ़ाइल पढ़ता है, सभी बिल्ड कमांड पाता है और एक -DFILENUMBER पैरामीटर जोड़ता है। मेरे डीबग आउटपुट प्रोग्राम में मेकफ़ाइल को पार्स करें ताकि मैं जान सकूं कि कौन सी फाइल नंबर कौन सी फाइल है। दुर्भाग्यवश इसके लिए कोई ठोस (ठोस) सी समाधान नहीं है, लेकिन यह काम करता है और बहुत परेशानी नहीं है। – Hans

1

क्या आपने FILE से जो कुछ भी प्राप्त किया है, उसके आधार पर 16-बिट हैश संख्या बनाने पर विचार किया है? यह सही नहीं हो सकता है (टकराव पढ़ें), लेकिन यदि आपकी आवश्यकताओं के लिए पर्याप्त हो सकता है। यदि स्वीकार्य है, तो आपको बाहरी लुकअप टेबल की आवश्यकता होगी ताकि आप अपने हैश नंबर आईडी को फ़ाइल में प्रश्न में मैप कर सकें।

आशा है कि यह विचार मदद करता है।

+0

यह रनटाइम की तरह लगता है समाधान, जो संकलित कोड से स्ट्रिंग को रखने के लक्ष्य के साथ संगत नहीं होगा। –

+0

यह एक विकल्प होगा यदि यह कूप कुछ प्रकार के मैक्रो के माध्यम से संकलन समय पर एलडी किया जाना चाहिए। लेकिन मुझे नहीं लगता कि मैक्रो के साथ गणित संभव है? मैं जो चाहता हूं वह निर्माण/संकलन समय पर उत्पन्न एक स्थिर फ़ाइल आईडी है। – Hans

संबंधित मुद्दे