जब मैं अपने क्रॉस टूलचैन के साथ सी कोड संकलित करता हूं, तो लिंकर चेतावनी के पन्नों को यह कहते हुए प्रिंट करता है कि मेरा निष्पादन योग्य हार्ड फ्लोट का उपयोग करता है लेकिन मेरा लीवर सॉफ्ट फ्लोट का उपयोग करता है। क्या फर्क पड़ता है?
जब मैं अपने क्रॉस टूलचैन के साथ सी कोड संकलित करता हूं, तो लिंकर चेतावनी के पन्नों को यह कहते हुए प्रिंट करता है कि मेरा निष्पादन योग्य हार्ड फ्लोट का उपयोग करता है लेकिन मेरा लीवर सॉफ्ट फ्लोट का उपयोग करता है। क्या फर्क पड़ता है?
जवाबों:
हार्ड फ्लोट्स ऑन-चिप फ्लोटिंग पॉइंट यूनिट का उपयोग करते हैं। सॉफ्ट फ्लोट्स सॉफ्टवेयर में एक का अनुकरण करते हैं। अंतर गति है। यह देखने के लिए अजीब है कि दोनों एक ही लक्ष्य वास्तुकला पर उपयोग किए जाते हैं, क्योंकि चिप में या तो एफपीयू है या नहीं। आप GCC में सॉफ्ट फ्लोटिंग पॉइंट को -msoft-float के साथ सक्षम कर सकते हैं। यदि आप इसका उपयोग करते हैं तो आप हार्डवेयर फ़्लोटिंग पॉइंट का उपयोग करने के लिए अपने libc को फिर से जोड़ना चाहते हैं।
फ्लोटिंग पॉइंट अंकगणित को करने के तीन तरीके हैं:
कड़े शब्दों में, ये सभी जवाब मुझे गलत लगते हैं।
जब मैं अपने क्रॉस टूलचैन के साथ सी कोड संकलित करता हूं, तो लिंकर चेतावनी के पन्नों को यह कहते हुए प्रिंट करता है कि मेरा निष्पादन योग्य हार्ड फ्लोट का उपयोग करता है लेकिन मेरा लीवर सॉफ्ट फ्लोट का उपयोग करता है। क्या फर्क पड़ता है?
डेबियन VFP विकी के लिए तीन विकल्पों पर जानकारी है -mfloat-abi
,
soft
- यह शुद्ध सॉफ्टवेयर हैsoftfp
- यह एक हार्डवेयर FPU का समर्थन करता है, लेकिन ABI नरम संगत है।hard
- ABI फ्लोट या VFP रजिस्टरों का उपयोग करता है ।लिंकर (लोडर) त्रुटि है, क्योंकि आपके पास एक साझा पुस्तकालय है जो पूर्णांक मानों में फ्लोटिंग पॉइंट वैल्यू पास करेगा। आप अभी भी एक -mfpu=vfp
आदि के साथ अपने कोड को संकलित कर सकते हैं , लेकिन आपको इसका उपयोग करना चाहिए -mfloat-abi=softfp
ताकि यदि libc को एक फ्लोट की आवश्यकता हो तो इसे लाइब्रेरी को समझने के तरीके से पारित किया जाए।
लिनक्स कर्नेल VFP निर्देशों के अनुकरण का समर्थन कर सकता है। जाहिर है, आप -mfpu=none
इस मामले के लिए संकलित करने के लिए बेहतर हैं और किसी भी लिनक्स कर्नेल अनुकरण पर भरोसा करने के बजाय सीधे कोड उत्पन्न करते हैं। हालाँकि, मुझे नहीं लगता कि ओपी की त्रुटि वास्तव में इस मुद्दे से संबंधित है। यह अलग है और इसके साथ भी निपटा जाना चाहिए -mfloat-abi
।
आरएमवी 7 सीपीयू के साथ आर्मव 5 साझा पुस्तकालय इस एक के विपरीत है; libc कठिन नाव था, लेकिन आवेदन केवल था नरम । इस मुद्दे के आसपास काम करने के कुछ तरीके हैं, लेकिन सही विकल्पों के साथ फिर से जुड़ना हमेशा सबसे आसान होता है।
एक अन्य मुद्दा यह है कि एक संदर्भ स्विच पर रजिस्टरों को बचाने / पुनर्स्थापित करने के लिए लिनक्स कर्नेल को वीएफपी कार्यों (या जो भी एआरएम फ़्लोटिंग पॉइंट मौजूद है) का समर्थन करना चाहिए।
ऐसा लगता है कि आपका libc सॉफ़्टवेयर फ़्लोटिंग पॉइंट ऑपरेशंस के लिए बनाया गया था, जबकि आपके exe को फ़्लोटिंग पॉइंट के लिए हार्डवेयर समर्थन मानकर संकलित किया गया था। अल्पावधि में, आप संकलक ध्वज के रूप में नरम फ़्लोट को बाध्य कर सकते थे। (यदि आप gcc का उपयोग कर रहे हैं तो मुझे लगता है कि यह -msoft-float है)
लंबे समय तक, यदि आपके लक्ष्य के प्रोसेसर में फ्लोटिंग पॉइंट ऑपरेशंस के लिए हार्डवेयर सपोर्ट है, तो आप आम तौर पर गति के लिए सक्षम हार्डवेयर फ्लोट के साथ एक क्रॉस टूलचैन बनाना या ढूंढना चाहेंगे। कुछ प्रोसेसर परिवारों के पास कुछ मॉडल हैं और कुछ हार्डवेयर समर्थन के बिना हैं। इसलिए, उदाहरण के लिए, बस यह कहना कि आपका प्रोसेसर एआरएम है यह जानने के लिए अपर्याप्त है कि क्या आपके पास हार्डवेयर फ्लोटिंग पॉइंट सपोर्ट है।
गणना फ्लोटिंग-पॉइंट हार्डवेयर द्वारा या पूर्णांक अंकगणित के आधार पर सॉफ्टवेयर में की जा सकती है।
हार्डवेयर में इसे करना बहुत तेज है, लेकिन कई माइक्रोकंट्रोलर में फ्लोटिंग-पॉइंट हार्डवेयर नहीं होता है। उस स्थिति में आप या तो फ़्लोटिंग पॉइंट (आमतौर पर सबसे अच्छा विकल्प) का उपयोग करने से बच सकते हैं या सॉफ़्टवेयर में कार्यान्वयन पर भरोसा कर सकते हैं, जो सी लाइब्रेरी का हिस्सा होगा।
नियंत्रकों के कुछ परिवारों में, उदाहरण के लिए, एआरएम, फ़्लोटिंग-पॉइंट हार्डवेयर परिवार के कुछ मॉडलों में मौजूद है, लेकिन दूसरों में नहीं, इसलिए इन परिवारों के लिए जीसीसी दोनों का समर्थन करता है। आपकी समस्या यह प्रतीत होती है कि आपने दो विकल्पों को मिला दिया है।