2011-10-04 9 views
6

मैं एक 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

उत्तर

8

आप, या लिंकर को उचित विकल्प गुजर, जैसे द्वारा या तो एक लिंकर स्क्रिप्ट के साथ यह करने के लिए सक्षम होना चाहिए। ld के लिए, --defsym=SVC_Handler=vPortSVCHandler

ld --defsym विकल्प की अधिक जानकारी के लिए binutils दस्तावेज़ देखें, और assignments in linker scripts

+1

बस लिंकर स्क्रिप्ट के शीर्ष पर 'SVC_Handler = vPortSVCHandler;' जोड़कर काम पूरा हो जाता है। अभी भी गन्दा लगता है, लेकिन यह काम करता है। –

+0

ध्यान दें कि यह समाधान एलटीओ के साथ काम करने के लिए प्रतीत नहीं होता है। ऐसा लगता है कि संकेत हमेशा उत्पन्न होता है 0x0 को इंगित करता है जिससे उत्पन्न निर्देशों में "कॉल 0" होता है। –

0

मैं यकीन है कि एसवीसी हैंडलर केवल FreeRTOS द्वारा प्रयोग किया जाता हूँ प्रारंभिक स्टार्टअप पर , इसलिए एक संकेतक अपवाद हैंडलर प्रदर्शन को चोट पहुंचाने वाला नहीं है (लेकिन इसकी बदसूरत)। बेस्टआरटीओएस मंच पर सर्वश्रेष्ठ से पूछें, प्रतिक्रिया आमतौर पर बहुत बढ़िया है।

आशा इस मदद करता है, शुभकामनाएं, डेव

+0

मैं जोड़ने चाहिए कि मैं इस w/SysTick और PendSV हैंडलर करने के लिए और साथ ही जरूरत है। मैं फ्रीआरटीओएस मंचों पर भी पूछ सकता हूं, लेकिन यह फ्रीआरटीओएस की तुलना में जीसीसी टूलचेन के बारे में वास्तव में एक सवाल है। –

1

एक अन्य समाधान है कि मैं FreeRTOS उदाहरणों में से एक से बटोरा अपने FreeRTOSConfig.h के लिए निम्न जोड़ने के लिए है .. ।

/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS 
standard names - or at least those used in the unmodified vector table. */ 
#define vPortSVCHandler SVC_Handler 
#define xPortPendSVHandler PendSV_Handler 
#define xPortSysTickHandler SysTick_Handler 

मूल फ़ाइल FreeRTOS/डेमो/CORTEX_M0_LPC1114_LPCXpresso/RTOSDemo/स्रोत/FreeRTOSConfig.h जो भी config में CMSIS सिस्टम घड़ी को एकीकृत से है। एक सीएमएसआईएस/फ्रीआरटीओएस परियोजना के लिए एक बहुत अच्छा प्रारंभिक बिंदु।

2

मुझे लगता है कि उपनाम के साथ समस्या यह है कि यह घोषित और परिभाषित फ़ंक्शन की अपेक्षा करता है, क्योंकि यह केवल एक उपनाम है। आप इसे किसी अन्य फ़ंक्शन की अग्रेषित घोषणा के रूप में उपयोग करना चाहते हैं।

void SVC_Handler(void) asm("vPortSVCHandler"); 

यह SVC_Handler के प्रवेश बिंदु का नाम बदलता है, और यदि आप तो यह परिभाषित नहीं करते, यह vPortSVCHandler खोजना चाहिए: मैं एक ऐसी ही ऐसे ही काम करने के लिए बात हो गया।

देखें: https://gcc.gnu.org/onlinedocs/gcc/Asm-Labels.html

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

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