2013-07-31 2 views
5

avr-gcc का उपयोग करना राम को बचाने के लिए प्रोग्राम मेमोरी पर डेटा स्टोर करना संभव है। यह PROGMEM attribute का उपयोग करके लागू किया गया है। एवीआर-लिबैक भी एक मैक्रो, PSTR() प्रदान करता है, जिसका उपयोग शाब्दिक तारों के साथ किया जा सकता है।PSTR() __FUNCTION__

अब मैं __func__, __FUNCTION__ or __PRETTY_FUNCTION__.

निम्न कोड की उम्मीद काम करता है के रूप में साथ PSTR() उपयोग करने के लिए, है, जबकि इन लाइनों में से किसी का संकलन विफल रहता है, कोशिश कर रहा हूँ

display.message(__func__, 2); 
display.message(__FUNCTION__, 2); 
display.message(__PRETTY_FUNCTION__, 2); 

display.messageP(PSTR(__func__), 2); 
display.messageP(PSTR(__FUNCTION__), 2); 
display.messageP(PSTR(__PRETTY_FUNCTION__), 2); 

, निम्न त्रुटि के साथ:

संकलन के रूप में,

# define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];})) 

यह कुछ मैक्रो के लिए सामान्य नहीं है और ठीक से काम:

PSTR की परिभाषा, WINAVR से/AVR/शामिल/AVR, चर त्रुटि संदेश पर संदर्भित बताते

display.messageP(PSTR(__FILE__), 2); 

इस त्रुटि के कारण क्या कोई विचार है, और यदि प्रोग्राम मेमोरी पर फ़ंक्शन नाम डालने के लिए PSTR() का उपयोग करना संभव है?

+0

ऐसा लगता है कि उन स्ट्रिंग अक्षर को उस स्थान पर नहीं रखा जा सकता है क्योंकि उन्हें विशेष कार्यों की आवश्यकता होती है? उन्हें एक्सेस करने के लिए। सच में, इन नामों को बहुत छोटा होना चाहिए, इसलिए मुझे आश्चर्य है कि वैसे भी उन्हें वहां ले जाने का वास्तविक लाभ है। मैं यह कहता हूं कि आपके पास मौजूद रैम की वास्तविक मात्रा के बारे में कोई जानकारी नहीं है। –

+0

@MichaelDorgan avr-libc प्रोग्राम मेमोरी में चर का उपयोग करने के लिए फ़ंक्शंस प्रदान करता है; इस सवाल पर कोड की आखिरी पंक्ति द्वारा पुष्टि की जाती है, जो ठीक काम करता है। मैं मानता हूं कि ये तार छोटे हैं, लेकिन वे एम्बेडेड सिस्टम (रैम के केवल कुछ केबीट्स के साथ) में महत्वपूर्ण हैं। – mMontu

उत्तर

8

__func__, __FUNCTION__ और __PRETTY_FUNCTION__, स्ट्रिंग शाब्दिक नहीं हैं __FILE__ की तरह है, लेकिन समारोह आप से उन्हें प्रयोग कर रहे हैं करने के लिए स्थिर स्थानीय चार सरणी चर की तरह बनाया जाता है। तो, PSTR() मैक्रो विफल हो जाएगा क्योंकि आप किसी अन्य सरणी चर को प्रारंभ करने के लिए सरणी चर का उपयोग नहीं कर सकते हैं।

__func__ सी 11 में वर्णित है, § 6.4.2.2 ¶ 1:

The identifier __func__ shall be implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declaration

static const char __func__[] = "function-name";
appeared, where function-name is the name of the lexically-enclosing function.

According to the GCC manual, __FUNCTION__ और __PRETTY_FUNCTION__ बस सी में __func__ के लिए समानार्थी शब्द (__PRETTY_FUNCTION__ सी के लिए और अधिक वर्बोज़ है ++) कर रहे हैं।

+0

क्या प्रोग्राम मेमोरी में __func__ प्राप्त करने का कोई तरीका है? डिफ़ॉल्ट रूप से परिभाषा इसे रैम में रखती है। स्पष्ट रूप से लोग स्थिर डीबगिंग डेटा पर रैम बर्बाद नहीं करना चाहते हैं। –

+0

सवाल एवीआर-जीसीसी के बारे में था, जो एवीआर मंच का अर्थ है। यह दो स्मृति रिक्त स्थान के साथ एक हार्वर्ड वास्तुकला है। प्रोग्राम मेमोरी डिवाइस की फ्लैश मेमोरी है, आमतौर पर केवल पढ़ने के लिए। चूंकि उपकरणों में केवल सीमित रैम है (16k सीमा के बारे में है, आमतौर पर 2-4k) आप इसे डीबग तारों से भरना नहीं चाहते हैं। –

+0

@MoJo: धन्यवाद, स्पष्टीकरण के लिए। ऐसा लगता है कि यदि आपको यह आवश्यकता है तो आपको मामले के आधार पर आपको अपने चर के रूप में घोषित करने की आवश्यकता होगी, या आपको इसे बढ़ाने के लिए कंपाइलर को संशोधित करना होगा ताकि आप '__func__' चर के लिए मेमोरी लक्ष्य निर्दिष्ट कर सकें। – jxh

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