मैं एक STM32 (Cortex-एम 3) पर FreeRTOS साथ काम कर रहा हूँ, और सब कुछ bootstrap करने के लिए अनुसूचित जनजाति से CMSIS लाइब्रेरी का उपयोग कर।जीसीसी उपनाम अनुवाद इकाई के बाहर काम करने के लिए-AKA- क्या यह नौकरी के लिए भी सही उपकरण है?
CMSIS पुस्तकालय स्टार्टअप ".s" फ़ाइल में कमजोर प्रतीक SVC_Handler
परिभाषित करता है। इंटरप्ट वेक्टर टेबल में अपना आईएसआर प्राप्त करने के लिए इसे कहीं कहीं ओवरराइड किया जाना चाहिए। फ्रीआरटीओएस vPortSVCHandler
परिभाषित करता है, जो आईएसआर है जिसे मैं एसवीसी इंटरप्ट को संभालना चाहता हूं।
मैं दोनों एक साथ (w/ओ modifyng FreeRTOS या CMSIS स्रोत कोड अर्थात) अपने आवेदन कोड का उपयोग कर "गोंद" करना चाहते हैं। मैंने सोचा था कि एक अन्य नाम इस काम के लिए सही उपकरण हो सकता है, तो मैं (एक अलग स्रोत फ़ाइल में, main.c) इस कोशिश की:
void SVC_Handler(void) __attribute__ ((alias ("vPortSVCHandler")));
कि में परिणाम: error: 'SVC_Handler' aliased to undefined symbol 'vPortSVCHandler'
, बाहर बदल जाता है के अनुसार alias
विशेषता का उपयोग करने के लिए, जीसीसी दस्तावेज http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html पर, आप अनुवाद इकाई के बाहर एक प्रतीक को उपनाम नहीं कर सकते हैं। तो मैंने सोचा कि मैं तो जैसे main.c में प्रतीक extern
करने की कोशिश करेंगे:
extern void vPortSVCHandler(void) __attribute__ ((naked));
void SVC_Handler(void) __attribute__ ((alias ("vPortSVCHandler")));
यह वही त्रुटि उत्पन्न करता है। कोई सुझाव???
मैं वास्तव में पुस्तकालयों में से किसी को संशोधित करने से बचने के लिए चाहते हैं। मुझे पता है कि मैं एक समारोह SVC_Handler
लिख सकता हूं जो बस vPortSVCHandler
पर कॉल करता है, लेकिन यह आईएसआर (संभवतः अनुकूलन सेटिंग्स के आधार पर) के लिए अनावश्यक ओवरहेड जोड़ सकता है। नोट: FreeRTOS उदाहरण कस्टम स्टार्टअप फ़ाइल के माध्यम से इसे पूरा करते हैं। मैं अपनी लिंकर स्क्रिप्ट सी या से ऐसा करने का एक तरीका ढूंढ रहा हूं।
- संकलक संस्करण: जीसीसी संस्करण 4.5.2 (Sourcery जी ++ लाइट 2011.03-42)
- लक्ष्य: हाथ-नन-EABI
बस लिंकर स्क्रिप्ट के शीर्ष पर 'SVC_Handler = vPortSVCHandler;' जोड़कर काम पूरा हो जाता है। अभी भी गन्दा लगता है, लेकिन यह काम करता है। –
ध्यान दें कि यह समाधान एलटीओ के साथ काम करने के लिए प्रतीत नहीं होता है। ऐसा लगता है कि संकेत हमेशा उत्पन्न होता है 0x0 को इंगित करता है जिससे उत्पन्न निर्देशों में "कॉल 0" होता है। –