मैं एवीआर मंच के लिए विकास कर रहा हूं और मेरे पास एक प्रश्न है। मैं नहीं चाहता कि फ्लोटिंग पॉइंट लाइब्रेरी को मेरे कोड से जोड़ा जाए, लेकिन मुझे श्रेणी 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 ध्वज के साथ चालू किया है) जीसीसी जाएगा चल बिन्दु गुणा, एक अभिन्न करने के लिए संकलन समय पर जाना जाता है और कलाकारों का अनुकूलन संकलन समय: अगर मैं इस तरह के विभाजन को लागू पूर्णांक परिचालन में टाइप करें? (मुझे पता है कि गैर-निरंतर तर्कों के साथ इन मैक्रोज़ का उपयोग करते समय, अनुकूलन संभव नहीं है; मैं सिर्फ यह जानना चाहता हूं कि यह अन्य मामले में किया जाएगा।)
यह एक गुणन, नहीं एक प्रभाग नहीं चाहिए: आप संकलक constness लागू चाहते हैं, आप कुछ इस तरह के साथ भाग मिल सकता है? ('analog_out (7, 0.5)' 1/510 से कटा हुआ 0 के लिखने के बजाय पोर्ट 7 पर '0.5 * 255' का लेखन बन जाता है) ... – Borealid
हाँ, निश्चित :) फिक्स्ड। –
इसे आज़माएं और पता लगाएं! 'जीसीसी-एस' एक असेंबली डंप का उत्पादन करेगा। आप शायद इसके लिए '-O2 -ffast-math' चाहते हैं, '-O3' नहीं' ('-O3' ऑप्टिमाइज़ेशन पर मुड़ता है जो लगभग हमेशा नेट * हार * होते हैं, जैसे अत्यधिक आक्रामक इनलाइनिंग; इसका मतलब यह है कि इसका उपयोग किया जाना चाहिए एक फ़ाइल जिसमें आपका प्रोग्राम 90% समय व्यतीत करता है)। – zwol