2014-06-23 5 views
6

मेजबान पर एक एम्बेडेड प्रोजेक्ट के यूनिट परीक्षण करने के लिए, मैंने फंक्शन पॉइंटर्स का उपयोग करना शुरू किया ताकि वे एक समारोह के 'असली' कार्यान्वयन और रनटाइम पर एक नकली के बीच बदल सकें। तो, मेरी समारोह 'foo' इस तरह ग फ़ाइल में दिखता है:जीसीसी: क्या आप फ़ंक्शन पॉइंटर्स को किसी भिन्न सेक्शन (नहीं .डेटा) में डाल सकते हैं?

// the 'real' implementation of the function to be used during runtime 
void fooImplementation () 
{ 
    /* ... */ 
} 
// the function pointer, initialized to the 'real' implementation 
void (*foo) () = fooImplementation; 

यह बाहर आ गया है कि लक्ष्य प्रोसेसर (Blackfin) एक अपवाद उत्पन्न करता है, क्योंकि समारोह सूचक आंतरिक एल 1 डेटा स्मृति में रहता है जो कोड ले जाने की अनुमति नहीं है बल्कि केवल डेटा है।

एक समाधान है कि काम करता है प्रत्येक कार्य सूचक को एक विशेषता आवंटित करने के लिए तो यह एक अलग अनुभाग कि एल 1 डेटा स्मृति में रहते हैं नहीं करता है, उदाहरण के लिए में डाल दिया है है:

void (*foo) () __attribute__ ((section(".ext_mem"))) = fooImplementation; 

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

तो मेरा सवाल यह है कि यदि सभी फ़ंक्शन पॉइंटर्स को डिफ़ॉल्ट रूप से किसी भिन्न सेक्शन में रखने के लिए जीसीसी को बताने का कोई तरीका है।

उत्तर

1

जीसीसी में ऐसा कोई विकल्प नहीं है, विशेष रूप से किसी विशेष अनुभाग में सभी फ़ंक्शन पॉइंटर्स को डिफ़ॉल्ट रूप से डालें। जब तक आप संकलक और लिंकर नियमों को फिर से लिखना नहीं चाहते हैं।

आपको प्रश्न में उल्लिखित __attribute__ कीवर्ड का उपयोग करना होगा। कोड जटिल लग रहा है, तो आप इसे चारों ओर एक मैक्रो बना सकते हैं:

#define SPECIAL_FOO(x) void (*x) () __attribute__ ((section(".ext_mem"))) 

और उसके बाद इस तरह इसका इस्तेमाल:

SPECIAL_FOO(foo) = fooImplementation; 

वहाँ हालांकि एक और तरीका है, भी है। आप अपने कार्य को पूरा करने के लिए कस्टम लिंकर स्क्रिप्ट बनाने के बारे में अधिक समझने के लिए यह SO थ्रेड देख सकते हैं: Forcing certain compiler-generated variables into specific ELF sections (with gcc)

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