एसएस एक्सटेंशन जीएनयू द्वारा उपयोग किया जाने वाला सम्मेलन और असेंबलर फ़ाइलों के लिए कई अन्य टूल-चेन है।
आखिरकार मैंने देखा कि एसटीएम 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 कॉन्फ़िगरेशन इत्यादि) के लिए अनुकूलन की आवश्यकता हो सकती है। चूंकि यह सी कोड है, और अच्छी तरह से टिप्पणी की है, तो आप शायद इसके साथ अधिक आरामदायक हो जाएगा।
सिवाय इसके कि मैंने अभी देखा है कि आपने STM32F2xx निर्दिष्ट किया है। उत्तर अभी भी लागू होता है, संबंधित फ़ाइल नामों को छोड़कर startup_stm32f2xx.s और system_stm32f2xx.c आपके मामले में हैं। मैंने इसे एसटीएम 32 एफ 2 के लिए अधिक विशिष्ट बनाने के लिए उत्तर संशोधित किया है। – Clifford
क्लिफोर्ड - एआरएम की वेबसाइट पर प्रलेखन में यह उल्लेख करता है कि startup_xxx.s, __user_initial_stack_heap में अन्य रूटीन, 88 से अधिक बाइट का उपयोग नहीं करना चाहिए। क्या आप जानते हैं कि वह सीमा कहां से आ रही है? Http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0099a/armlib_cihhdahf.htm – NickHalden
@ निकहाल्डन देखें: क्या आपको लगता है कि शायद वह खुद के प्रश्न के रूप में पोस्ट होने योग्य है? यह प्रश्न दो साल से अधिक पुराना है, और यहां तक कि आपका प्रश्न भी नहीं है। यह वह नहीं है जो उन्होंने टिप्पणी की है - एसओ एक चर्चा मंच नहीं है। के अतिरिक्त; आपको इस तरह एक बड़ा दर्शक मिल जाएगा। – Clifford