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() का उपयोग करना संभव है?
ऐसा लगता है कि उन स्ट्रिंग अक्षर को उस स्थान पर नहीं रखा जा सकता है क्योंकि उन्हें विशेष कार्यों की आवश्यकता होती है? उन्हें एक्सेस करने के लिए। सच में, इन नामों को बहुत छोटा होना चाहिए, इसलिए मुझे आश्चर्य है कि वैसे भी उन्हें वहां ले जाने का वास्तविक लाभ है। मैं यह कहता हूं कि आपके पास मौजूद रैम की वास्तविक मात्रा के बारे में कोई जानकारी नहीं है। –
@MichaelDorgan avr-libc प्रोग्राम मेमोरी में चर का उपयोग करने के लिए फ़ंक्शंस प्रदान करता है; इस सवाल पर कोड की आखिरी पंक्ति द्वारा पुष्टि की जाती है, जो ठीक काम करता है। मैं मानता हूं कि ये तार छोटे हैं, लेकिन वे एम्बेडेड सिस्टम (रैम के केवल कुछ केबीट्स के साथ) में महत्वपूर्ण हैं। – mMontu