नमस्ते!
यह छोटा लेख सैमसंग बाडा मोबाइल प्लेटफॉर्म के लिए अनुप्रयोगों के डेवलपर्स को संबोधित किया गया है जो इस विचार के साथ नहीं रखना चाहते हैं कि सैमसंग "बेहतर जानता है कि क्या जरूरत है", साथ ही ऐसे लोग जो जीआरयू कंपाइलर संग्रह का उपयोग करके एआरएम के लिए कोड का निर्माण करते हैं।
मुझे लगता है कि कई लोगों ने देखा कि टारगेट-रिलीज़ या टारगेट-डीबग में प्रोजेक्ट बनाते समय एक लॉग लिखा जाता है
arm-samsung-nucleuseabi-g++ -DSHP -I"D:/Work/Bada/1.2.1/include" -I"???/inc" -Os -Wall -E -fpic -fshort-wchar -mcpu=cortex-a8 -mfpu=vfpv3 -mfloat-abi=hard -mlittle-endian -mthumb-interwork -o"???/Target-Release/dirent.i" "../src/bada/dirent.cpp"
'Finished building: ../src/bada/dirent.cpp'
हमें विधानसभा के झंडे में दिलचस्पी होगी, अर्थात का हिस्सा
-Os -Wall -E -fpic -fshort-wchar -mcpu=cortex-a8 -mfpu=vfpv3 -mfloat-abi=hard -mlittle-endian -mthumb-interwork
आप परियोजना के गुणों में अपने स्वयं के झंडे जोड़ सकते हैं, लेकिन यह बुरा है: वे सभी बाईं ओर, और एक टुकड़े के लिए जिम्मेदार हैं
-fpic -fshort-wchar -mcpu=cortex-a8 -mfpu=vfpv3 -mfloat-abi=hard -mlittle-endian -mthumb-interwork
आम तौर पर स्थिर और हमेशा दाईं ओर जोड़ा जाता है, और आईडीई में इसके बारे में एक शब्द भी नहीं है। इसके अलावा, "-ओ" विकल्प परियोजना के गुणों ("ग्रे") में अपरिवर्तनीय है। मैं समझाऊंगा कि क्या हो रहा है।
- -ओ - केवल अनुकूलन लागू होते हैं जो ऑब्जेक्ट के आकार में वृद्धि नहीं करते हैं
- -fpic - स्थिति स्वतंत्र कोड स्थानांतरण मॉडल द्वारा विधानसभा। मैं आपको याद दिलाता हूं कि बाडा टूलचेन पर विधानसभा के सभी परिणाम (तथाकथित कलाकृतियां) गतिशील पुस्तकालय (साझा पुस्तकालय) हैं। यह खबर किसके लिए है - आप विशिष्ट कोड <ProjectName> Entry.cpp पर भी देख सकते हैं:
_EXPORT_ int OspMain ( int argc, char * pArgv [ ]]
अगर हम _EXPORT_ की परिभाषा पर जाते हैं, तो हम देखेंगे (FBaseConfig.h):
#if परिभाषित (_WIN32) // एमएस कंपाइलर और मिनगॉव जीसीसी <br/>
# परिभाषित _EXPORT_ __declspec (dllexport) <br/>
# एलिफ परिभाषित (__ GNUG__) // GCC <br/>
# परिभाषित _EXPORT_ __attribute __ ((दृश्यता ("डिफ़ॉल्ट")) <br/>
# एलिफ परिभाषित (__ ARMCC_VERSION) // ARM कंपाइलर (RVCT 3.1) <br/>
# परिभाषित _EXPORT_ <br/>
#else <br/>
# परिभाषित _EXPORT_ <br/>
#endif
क्या वह सब मैं ही हूं? तो, PIC एक विश्वसनीय, लेकिन थोड़ा धीमा मॉडल है। इसके अलावा, यह देखते हुए कि बाडा में सभी एप्लिकेशन उनके सैंडबॉक्स में हैं और सामान्य डायनेमिक लाइब्रेरी को साझा नहीं कर सकते हैं, यह PIC का उपयोग करने के लिए कोई मतलब नहीं है। दुर्भाग्य से, इस झंडे के बिना, प्रोजेक्ट असेंबली गतिशील पुस्तकालय को जोड़ने के चरण में गिर सकती है (और यह गिर जाता है, मैंने जाँच की), क्योंकि ld (arm-samsung-nucleusabi-ld द्वारा किया गया) कुछ मामलों में लिंक करने में सक्षम नहीं है, इसलिए सैमसंग के कोरियाई लोगों ने इस झंडे को अंदर से सीवे किया। GCC 4.x में एक दोष के कारण, कंपाइलर R_ARM_MOVW_ABS_NC को पुन: बनाता है, जो बन्नीटल्स को पसंद नहीं है। अब, अगर विधानसभा LLVM का उपयोग कर रहा था ... मैं कुछ में शामिल हो गया। सामान्य तौर पर, इस स्थिति में, -fPIC अपरिहार्य है। - -mfpu = vfpv3 - फ्लोटिंग पॉइंट मॉडल का संस्करण
- -मफ्लोट-अबी = कठिन - केवल फ्लोटिंग-पॉइंट लोहे के संचालन का उपयोग करें। सामान्यतया, यदि कोड में फ्लोटिंग पॉइंट फ़ंक्शन के लिए कॉल है जो ARM FPU में नहीं है, तो संकलन विफल हो जाएगा, लेकिन यह बहुत संभावना नहीं है।
- -मेटी-एंडियन - यह स्पष्ट नहीं है कि क्यों। कॉर्टेक्स-ए 8 के बारे में और इसलिए यह ज्ञात है कि वह थोड़ा एंडियन है।
- -थंब-इंटरवर्क - एक निष्पादन योग्य फ़ाइल में एआरएम और थम्ब कोड दोनों को सुरक्षित रूप से संयोजित करने की क्षमता। जैसा कि आप जानते हैं, एआरएम वास्तुकला अन्य चीजों के बीच भी अच्छा है क्योंकि इसमें 16-बिट थम्ब निर्देश का एक सेट होता है। मुद्दा यह है कि एक एआरएम निर्देश में 32 बिट्स होते हैं, और एक थंब इंस्ट्रक्शन आधे से अधिक लेता है। कुल में, हमने परिणामी कोड का आकार आधा (सैद्धांतिक रूप से) घटा दिया है। व्यावहारिक रूप से - लगभग दो बार (अतिरिक्त संचालन के रूप में ओवरहेड है और कुछ और)। डिफ़ॉल्ट रूप से, असेंबली एआरएम कोड में होती है, अंगूठे के कोड में कार्यक्रम बिल्कुल संकलन नहीं कर सकता है (जो, उदाहरण के लिए, "अनुकूलित" असेंबलर आवेषण को प्यार करता है? हमारे संकलक उन्हें अस्पष्टता के साथ कवर करते हैं), सैमसंग वेव फर्मवेयर में सबसे अधिक संभावना है, और कोरियाई सुरक्षित हैं। माइनस के रूप में, अतिरिक्त युग्मन निर्देशों के कारण ऑब्जेक्ट मालिकों का आकार थोड़ा बढ़ रहा है।
तो, हम निम्नलिखित अन्याय देखते हैं:
- निष्पादन योग्य फ़ाइल के आकार पर अनुकूलन हमेशा बेहतर नहीं होता है (विशेषकर सिस्टम, एल्गोरिदमिक चीजों के लिए!)
- mfpu = vfpv3, अच्छा है, लेकिन कोर्टेक्स में नीयन है
- परियोजनाओं को "गूंगा" अंगूठे के बजाय एआरएम निर्देशों के एक सेट में संकलित किया गया है
सैमसंग की स्थिति को समझा जा सकता है: चंचल हाथ, उल्लिखित झंडे को बदलना, परियोजना की विधानसभा को आसानी से बर्बाद कर सकता है, और फिर वे कोरियाई समर्थन टीम को साबित कर सकते हैं कि वे वास्तव में कौन हैं। हालाँकि, हम जानते हैं कि हम क्या कर रहे हैं। क्या हम स्थिति को ठीक कर सकते हैं? हाँ!
आइए फ़ाइल पर ध्यान दें <bada SDK की जड़> /IDE/buildoptions.xml। इसमें बस उन झंडों का एक सेट होता है जिन्हें आईडीई के माध्यम से सामान्य मानव तरीके से नहीं बदला जा सकता है। इस फ़ाइल को संपादित करने के बाद, ग्रहण को फिर से शुरू करना सुनिश्चित करें। हम पूरा खींच लेते हैं:
<comp>-fpic -mthumb -fshort-wchar -O2 -mcpu=cortex-a8 -mfpu=vfpv3 -mfloat-abi=hard</comp>
थम्ब कोड को संकलित करने के लिए
-थुंब बल,
-ओ 2 आमतौर पर कार्यक्रम का अनुकूलन करता है, और अब अर्थहीन
-मथुम-इंटरवर्क हटा दिया
जाता है। मैंने कई कार्यक्रमों पर इस तरह के झंडे के साथ ऑपरेशन की जांच की, और वे सभी काम करते हैं जैसे उन्हें चाहिए। मैं दो बातें नोट करता हूं:
- यदि आप -mfpu = नियॉन करते हैं , तो डिवाइस पर लॉन्च होने पर एप्लिकेशन क्रैश हो जाते हैं। क्यों - यह स्पष्ट नहीं है, मैं इस क्षण की खोज कर रहा हूं। परीक्षण बोर्डों पर काम करते समय, मैंने ऐसा कई बार किया।
- -मथुम्ब-इंटरवर्क अभी भी कुछ विशेष मामलों में आवश्यक हो सकता है। मैंने परीक्षण चलाए - इसके बिना सब कुछ ठीक काम करता है।
बडा 1.1 उपकरणों (52x की तरह बजट लहरों की एक पंक्ति) के लिए हम विधानसभा के झंडे में क्या देखते हैं?
<comp>-fpic -fshort-wchar -mcpu=arm9 -mfloat-abi=soft -mlittle-endian -mthumb-interwork</comp>
सबसे पहले, एक खराब प्रोसेसर जो आधिकारिक सैमसंग वेबसाइट पर विनिर्देश में बिल्कुल भी नहीं लिखा गया है, साथ ही
-mfloat-abi = soft , जिसके कारण FPU का उपयोग बिल्कुल नहीं किया जाता है,
हड़ताली है । Arm.com पर ARM9 कल्पना बताती है कि FPU वास्तव में वैकल्पिक है। मेरे पास ये उपकरण नहीं हैं, और मैं यह सुनिश्चित करने के लिए नहीं कह सकता कि क्या इस ध्वज को
-mfloat-abi = softfp या
-mfloat-abi = हार्ड में बदलना अच्छा है। लेकिन फिर से मैं
-मथुम जोड़ने की सलाह देता हूं।
मैं उन लोगों को सलाह दूंगा जिनके पास बहुत सारे फ्लोटिंग-पॉइंट
गणनाएँ हैं:
-funsafe-math-ऑप्टिमाइज़ेशन -ffast-math फ्लैग को प्रोजेक्ट फ्लैग (सामान्य तरीके से) में जोड़ें। आपको इसका पछतावा नहीं होगा।
अंत में,
एआरएम के लिए विशिष्ट सभी जीसीसी झंडे का लिंक ।
आपके सफल विकास के लिए धन्यवाद!