2016-07-15 12 views
5

मैं जीसीसी-एआरएम-एंबेडेड और फ्रीआरटीओएस के साथ काम करता हूं। फ्रीआरटीओएस में फ़ंक्शन vTaskSwitchContext() है जिसका उपयोग केवल इनलाइन असेंबलर कोड में किया जाता है।जीसीसी एलटीओ को फंक्शन हटाने से रोकें

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

मैं __attribute__((used)) लागू करूंगा लेकिन मैं फ्रीआरटीओएस कोड को स्पर्श नहीं करना चाहता (यह एसटीएम 32 क्यूबएमएक्स द्वारा जेनरेट किया गया है)।

मैं अपने कोड में यह डाल करने की कोशिश की, लेकिन वास्तव में जीसीसी बहुत चालाक है कि यह काम करने की अनुमति नहीं है:

if(false) 
    vTaskSwitchContext(); 

वहाँ किसी तरह एक अलग स्रोत फ़ाइल में जीसीसी बताने के लिए है, या पैरामीटर के माध्यम से, कि इस समारोह को हटाया नहीं जाना चाहिए?

उदाहरण

// file1.c 
void vTaskSwitchContext(void) 
{ 
    ... 
} 

// file2.c 
void xPortPendSVHandler(void) 
{ 
    __asm volatile 
    (
    ... 
    " isb         \n" 
    " bl vTaskSwitchContext    \n" 
    " mov r0, #0       \n" 
    ... 
    ); 
} 
+0

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

+0

@undur_gongor: एलटीओ कई चीजों को बदलता है और सामान्य रूप से आश्चर्य का कारण बन सकता है। "लिंकर" वास्तव में ऑब्जेक्ट फ़ाइलों और बाहरी संदर्भों को नहीं देखता है, बल्कि, लिंकर कंपाइलर बैक-एंड के सामने के अंत के रूप में कार्य करता है, और फिर संकलक बैक-एंड से परिणामों को लिंक करता है। –

उत्तर

6

एक अलग समारोह जो used चिह्नित है से समारोह कॉल करके देखें।

void dummyFunction(void) __attribute__((used)); 

// Never called. 
void dummyFunction(void) { 
    vTaskSwitchContext(); 
} 
संबंधित मुद्दे