2009-10-26 7 views
10

का उपयोग करता है मैं HiTech PICC32 का उपयोग कर एक PIC32MX के लिए फ़र्मवेयर लिख रहा हूं। उन समस्याओं में से एक जो मैं टालना चाहता हूं वह यह है कि चूंकि अधिकांश पिनों में एकाधिक नाम होते हैं (उदाहरण के लिए AN0 = RB0 ​​= CN2 = PGED1), मैं या कोई अन्य गलती से आरबी 0 का उपयोग कर यह महसूस किए बिना कि AN0 पहले से ही उपयोग किया जा रहा है। (यह वास्तव में विनाशकारी हो सकता है, क्योंकि एनालॉग/डिजिटल पिन को गलत तरीके से कॉन्फ़िगर करने से अत्यधिक मौजूदा ड्रॉ और आवश्यक धूम्रपान की रिहाई हो सकती है।)मैक्रो संकेत I/O पिन

साथ ही साथ प्रत्येक पिन का व्यापक रूप से दस्तावेज करने के साथ-साथ, मैं सोच रहा था कि कोई त्वरित तरीका है या नहीं कोडिंग के स्तर पर इस मुद्दे को दूर करने के लिए। मुझे एक मैक्रो चाहिए कि लोग (मुख्य रूप से स्वयं) CLAIM_PIN(58) कह सकते हैं, जो दो बार चलाने पर चेतावनी या त्रुटि जारी करेगा।

(मुझे यह बिल्कुल नहीं चाहिए, अगर एकमात्र संभावित समाधान बहुत डरावना या अनजान है तो मैं इसके बारे में भूल जाऊंगा और केवल आँसू में फटने या खुद को आग या कुछ पर स्थापित करने के लिए प्रतिष्ठा विकसित करूंगा। इस प्रश्न को macro producing macros के बारे में भी देखा, जो कि नियम बनाता है।)

मुझे स्पष्ट करना चाहिए: कोड कई संकलन इकाइयों में लिखा गया है (कम से कम, मुझे लगता है कि यह वाक्यांश का अर्थ है)। मेरे पास ए 2 डी कोड के लिए एक .h/.c फ़ाइल है, इसी प्रकार एसपीआई के लिए, और इसी तरह विभिन्न परिधीय के लिए जो केवल कुछ I/O बंदरगाहों का उपयोग करते हैं। अंतरिक्ष वास्तव में एक समस्या नहीं है, मेरा कोड PIC32MX पर बहुत सारे कमरे को छोड़ देता है; मैं अंतिम उपयोग के लिए पिन जांच कोड को हटाने के लिए एक और __DEBUG ध्वज का उपयोग भी कर सकता हूं।

+0

कोई जवाब नहीं, लेकिन अच्छा सवाल है। (मुझे लगता है कि माइक्रोचिप लोगों ने अपने बटों को बंद कर दिया है और सी ++ का समर्थन किया है।) –

+0

वैसे, उनके पास लिनक्स कंपाइलर नहीं है, इसलिए यह मेरे लिए हायटेक है (मैं वैसे भी उनके मैक्रोज़ को पसंद करता हूं)। – detly

उत्तर

6

ठीक है, यहां। कोई रनटाइम लागत नहीं

#define CLAIM(n) struct busy##n {} 

CLAIM(58); 
CLAIM(58); 

तो दो बार चलाने के लिए इसे बाहर त्रुटि देगा:

z.c:4: error: redefinition of ‘struct busy58’ 

कई संकलन इकाइयों को जांच का विस्तार करने के लिए आप #if DEBUG में मैक्रो रैप करने के लिए है क्योंकि हम टकराव का पता लगाने के संयोजक का उपयोग करेंगे चाहते हैं और इसलिए एक रनटाइम पदचिह्न होगा।

#define CLAIM(n) char busy##n = 1; 
#define CLAIM(n) void busy##n() {} // bdonlan 
+4

हालांकि यह एकमात्र त्रुटियां हैं यदि वे एक ही अनुवाद इकाई में हैं। – bdonlan

8
#define CLAIM_PIN(n) char claimed_pin_##n; 

अब जब कोड के दो टुकड़े एक पिन का दावा करने का प्रयास करें, प्रतीक दोगुना परिभाषित किया जाएगा और या तो संकलक या लिंकर एक त्रुटि उत्पन्न होगा।

संपादित करें: टिप्पणियों के आधार पर, इस जाएंगे जो शायद बेहतर:

#define CLAIM_PIN(n) void claimed_pin_#nn(void) {} 
+2

यह प्रति पिन एक बाइट का उपयोग करता है। यदि यह कोई समस्या है, तो ओपी इन परिभाषाओं को अपने स्वयं के अनुभाग में रखने के लिए लिंकर विकल्पों को देखना चाह सकता है, और उन्हें अंतिम छवि से छोड़ सकता है। – bdonlan

+0

यह बहुत लंबा रहा है क्योंकि मैंने एक आर्किटेक्चर का उपयोग किया था जहां एक बाइट मैटर्ड था, मैंने इसके बारे में भी सोचा नहीं था। –

+2

लेकिन यह त्रुटि नहीं है। ऐसा करने के लिए यह पूरी तरह से कानूनी सी है, यहां तक ​​कि कई संकलन इकाइयों में भी। – DigitalRoss

2

आप क्रम भूमि के ऊपर खर्च कर सकते हैं या अगर यह सिर्फ डिबगिंग के लिए है, मैं सिर्फ एक IOPinOpen() समारोह की तरह कुछ बनाते हैं, तो जो मैक्रो ट्रिकरी से निपटने के बजाय उपयोग में पिन का ट्रैक रखता था।

दूसरी ओर, Mark Ransom's updated answer +1 के लायक था।