2012-03-21 19 views
18

मैं एआरएम कॉर्टेक्स एम 3 चिप (एसटीएम 32 एफ 2) के साथ काम कर रहा हूं और एसटी एक "मानक परिधीय पुस्तकालय" प्रदान करता है। इसमें कुछ उपयोगी .c और .h फ़ाइलें हैं। इसमें फाइलें भी हैं।सी प्रोजेक्ट में .s फ़ाइलों की भूमिका क्या है?

सी परियोजना के संदर्भ में इन फ़ाइलों का उद्देश्य क्या है? मैं अपना कंपाइलर/लिंकर/कैसे प्राप्त करूं? उन्हें ध्यान में रखना?

उत्तर

27

एसएस एक्सटेंशन जीएनयू द्वारा उपयोग किया जाने वाला सम्मेलन और असेंबलर फ़ाइलों के लिए कई अन्य टूल-चेन है।

आखिरकार मैंने देखा कि एसटीएम 32 मानक पेरिफेरल लाइब्रेरी में कोई असेंबलर फाइल नहीं है, हालांकि सीएमएसआईएस लाइब्रेरी में विभिन्न एसटीएम 32 भागों के लिए स्टार्ट-अप कोड है, उदाहरण के लिए startup_stm32f2xx.s सभी STM32F2xx श्रृंखला उपकरणों के लिए स्टार्ट-अप कोड है। विभिन्न टूल-चेन के लिए अलग-अलग कार्यान्वयन हैं; आपको अपने विशिष्ट भाग और टूल-चेन से जुड़े फ़ाइल को बनाने और लिंक करने की आवश्यकता है। यदि आप एक उदाहरण प्रोजेक्ट का उपयोग कर रहे हैं जो बनाता है और चलाता है या आईडीई जो आपके लिए पार्ट-विशिष्ट परियोजनाएं बनाता है, तो शायद यह पहले से ही किया जा चुका है - यदि आपके पास कोड है जो निश्चित रूप से चलता है।

कोड बनाने और लिंक करने के तरीके पर निर्भर करेगा कि आप किस टूल-चेन का उपयोग कर रहे हैं। अधिकांश आईडीई आधारित उपकरण स्वचालित रूप से एक्सटेंशन को पहचानेंगे और एक ऑब्जेक्ट फ़ाइल उत्पन्न करने के लिए असेंबलर को आमंत्रित करेंगे जो किसी अन्य की तरह लिंक होगा। टूल-चेन संस्करणों के बीच सटीक सामग्री थोड़ा अलग होती है, लेकिन मुख्य रूप से सी रनटाइम पर्यावरण (ढेर और ढेर) बनाता है, प्रोसेसर शुरू करता है, प्रारंभिक इंटरप्ट/अपवाद वेक्टर तालिका को परिभाषित करता है, स्थिर डेटा प्रारंभ करता है और मुख्य() तक कूदता है।

उदाहरण के लिए Keil/एआरएम RealView संस्करण के लिए फ़ाइल के मूल इस तरह दिखता है:

; Reset handler 
Reset_Handler PROC 
       EXPORT Reset_Handler    [WEAK] 
     IMPORT SystemInit 
     IMPORT __main 
       LDR  R0, =SystemInit 
       BLX  R0 
       LDR  R0, =__main 
       BX  R0 
       ENDP 

Reset_Handler पते के कार्यक्रम काउंटर (पीसी) रजिस्टर एक प्रोसेसर रीसेट के बाद करने के लिए सेट हो जाएगा।

SystemInit एक बाहरी सी कोड फ़ंक्शन है जो प्रारंभिकता का बड़ा हिस्सा करता है - इसे आपके हार्डवेयर के लिए अनुकूलन की आवश्यकता हो सकती है। कॉर्टेक्स-एम असामान्य है कि यह रीसेट के तुरंत बाद सी कोड चलाना शुरू कर सकता है क्योंकि वेक्टर तालिका में रीसेट पता और प्रारंभिक स्टैक पॉइंटर पता दोनों शामिल होते हैं, जो स्वचालित रूप से रीसेट पर एसपी रजिस्टर में लोड हो जाते हैं। नतीजतन आपको एक चलने के लिए ज्यादा असेंबलर ज्ञान की आवश्यकता नहीं है।

__main() आपके सी कोड के लिए कंपाइलर आपूर्ति प्रविष्टि बिंदु है।यह आपके द्वारा लिखे गए मुख्य() फ़ंक्शन नहीं है, लेकिन आपके 'मुख्य()' फ़ंक्शन को कॉल करने से पहले मानक लाइब्रेरी, स्थिर डेटा, ढेर के लिए प्रारंभिकरण करता है।

जीसीसी संस्करण कुछ और अधिक शामिल है क्योंकि यह किल/एआरएम रीयल व्यू संस्करण में __main() द्वारा किए गए अधिकांश काम करता है, लेकिन अनिवार्य रूप से यह वही कार्य करता है।

ध्यान दें कि CMSIS SystemInit() में system_stm32f2xx.c में परिभाषित किया गया है, और आपके बोर्ड (सही क्रिस्टल आवृत्ति, पीएलएल सेटअप, बाहरी SRAM कॉन्फ़िगरेशन इत्यादि) के लिए अनुकूलन की आवश्यकता हो सकती है। चूंकि यह सी कोड है, और अच्छी तरह से टिप्पणी की है, तो आप शायद इसके साथ अधिक आरामदायक हो जाएगा।

+0

सिवाय इसके कि मैंने अभी देखा है कि आपने STM32F2xx निर्दिष्ट किया है। उत्तर अभी भी लागू होता है, संबंधित फ़ाइल नामों को छोड़कर startup_stm32f2xx.s और system_stm32f2xx.c आपके मामले में हैं। मैंने इसे एसटीएम 32 एफ 2 के लिए अधिक विशिष्ट बनाने के लिए उत्तर संशोधित किया है। – Clifford

+0

क्लिफोर्ड - एआरएम की वेबसाइट पर प्रलेखन में यह उल्लेख करता है कि startup_xxx.s, __user_initial_stack_heap में अन्य रूटीन, 88 से अधिक बाइट का उपयोग नहीं करना चाहिए। क्या आप जानते हैं कि वह सीमा कहां से आ रही है? Http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0099a/armlib_cihhdahf.htm – NickHalden

+0

@ निकहाल्डन देखें: क्या आपको लगता है कि शायद वह खुद के प्रश्न के रूप में पोस्ट होने योग्य है? यह प्रश्न दो साल से अधिक पुराना है, और यहां तक ​​कि आपका प्रश्न भी नहीं है। यह वह नहीं है जो उन्होंने टिप्पणी की है - एसओ एक चर्चा मंच नहीं है। के अतिरिक्त; आपको इस तरह एक बड़ा दर्शक मिल जाएगा। – Clifford

7

वे आमतौर पर असेंबली कोड होते हैं। असेंबलर उन्हें ऑब्जेक्ट फाइलों में बदल देता है जिसे बाद में लिंकर द्वारा मुख्य सामग्री के साथ जोड़ा जाता है। लेकिन मुझे लगता है कि यह कंपाइलर, टूलचेन इत्यादि पर निर्भर करता है

1

आपको शायद अपने एसटी किट के लिए एक किल आधारित विकास वातावरण मिला है। आपके कंपाइलर के संस्करण के आधार पर, प्रोजेक्ट फ़ाइल में सी, सी ++ और असेंबलर कोड के लिए अलग-अलग अनुभाग होना चाहिए। अपने आईडीई में, अपनी प्रोजेक्ट खोलें और "प्रोजेक्ट प्रॉपर्टीज" या इसके जैसा कुछ ढूंढें।

आप असेंबलर कोड से और उसके लिए प्रतीकों को आयात और निर्यात कर सकते हैं ताकि यह और सी/सी ++ कोड लिंक हो। कील के साथ यह सब उचित रूप से अच्छी तरह से एकीकृत करता है।

निर्यात निर्देश असेंबलर को निर्दिष्ट प्रतीक सार्वजनिक करने के लिए कहता है ताकि आपका सी/सी ++ कोड उससे लिंक हो सके।

आयात निर्देश असेंबलर को बताता है कि निर्दिष्ट प्रतीक कहीं और परिभाषित किया गया है और लिंक समय पर हल किया जाएगा।

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