2012-02-12 18 views
5

मैं एवीआर मंच के लिए विकास कर रहा हूं और मेरे पास एक प्रश्न है। मैं नहीं चाहता कि फ्लोटिंग पॉइंट लाइब्रेरी को मेरे कोड से जोड़ा जाए, लेकिन मुझे श्रेणी 0.0 के बजाय एनालॉग मान होने की अवधारणा पसंद है ... 0 के बजाय 1.0 ... 255 और 0 ... 1023, यहां तक ​​कि चाहे मैं एक पोर्ट के रूप में इनपुट या आउटपुट के रूप में उपयोग कर रहा हूं।जीसीसी संकलन-समय फ़्लोटिंग पॉइंट अनुकूलन

इसलिए मैंने 1023.0 और 255.0 तक इनपुट/आउटपुट फ़ंक्शन के तर्कों को गुणा करने का निर्णय लिया, respecively। अब, मेरे सवाल यह है:

#define analog_out(port, bit) _analog_out(port, ((uint8_t)((bit) * 255.0))) 

(-O3 ध्वज के साथ चालू किया है) जीसीसी जाएगा चल बिन्दु गुणा, एक अभिन्न करने के लिए संकलन समय पर जाना जाता है और कलाकारों का अनुकूलन संकलन समय: अगर मैं इस तरह के विभाजन को लागू पूर्णांक परिचालन में टाइप करें? (मुझे पता है कि गैर-निरंतर तर्कों के साथ इन मैक्रोज़ का उपयोग करते समय, अनुकूलन संभव नहीं है; मैं सिर्फ यह जानना चाहता हूं कि यह अन्य मामले में किया जाएगा।)

+1

यह एक गुणन, नहीं एक प्रभाग नहीं चाहिए: आप संकलक constness लागू चाहते हैं, आप कुछ इस तरह के साथ भाग मिल सकता है? ('analog_out (7, 0.5)' 1/510 से कटा हुआ 0 के लिखने के बजाय पोर्ट 7 पर '0.5 * 255' का लेखन बन जाता है) ... – Borealid

+0

हाँ, निश्चित :) फिक्स्ड। –

+3

इसे आज़माएं और पता लगाएं! 'जीसीसी-एस' एक असेंबली डंप का उत्पादन करेगा। आप शायद इसके लिए '-O2 -ffast-math' चाहते हैं, '-O3' नहीं' ('-O3' ऑप्टिमाइज़ेशन पर मुड़ता है जो लगभग हमेशा नेट * हार * होते हैं, जैसे अत्यधिक आक्रामक इनलाइनिंग; इसका मतलब यह है कि इसका उपयोग किया जाना चाहिए एक फ़ाइल जिसमें आपका प्रोग्राम 90% समय व्यतीत करता है)। – zwol

उत्तर

3

यदि आप संख्यात्मक शाब्दिक के रूप में बिट की आपूर्ति करते हैं तो जीसीसी हमेशा निरंतर तह करना चाहिए।

#define force_const(x) (__builtin_choose_expr(__builtin_constant_p(x), (x), (void)0)) 
#define analog_out(port, bit) _analog_out(port, force_const((uint8_t)((bit) * 255.0))) 
2

आम तौर पर, मुझे लगता है कि gcc -O2 सभी अंकगणित पर होगा संकलन समय पर स्थिरांक।
यह इसे पूर्णांक अंकगणित में परिवर्तित नहीं करेगा - केवल स्थिर पूर्णांक तक।

भरोसा करना खतरनाक हो सकता है, खासकर यदि अन्य लोग कोड बनाए रखते हैं। ऐसी स्थिति जहां एक त्रुटि में मैक्रो परिणामों के लिए एक गैर-निरंतर पैरामीटर गुजरना अच्छा नहीं है।

+0

इसका कोई परिणाम नहीं होता है, मैं बस इसे अनुकूलित करना चाहता हूं। –

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