2010-07-27 16 views
10

अंदर मैं सी भाषा का प्रयोग कर एक माइक्रो नियंत्रक में काम कर रहा हूँ। इस विशिष्ट सूक्ष्म में, बीच में आता है निम्नलिखित तरीके से #pragma का उपयोग कर परिभाषित किया जा करने के लिए है:#pragma #define

static void func(); 
#pragma INTERRUPT func <interrupt_address> <interrupt_category> 
static void func() { /* function body */ } 

<interrupt_address> सदिश तालिका में बाधा का पता है।

static void _int_p00(); 
#pragma INTERRUPT _int_p00 0x10 1 
static void _int_p00() { (*isr_p00)(); } 

हम (उदाहरण की तरह isr_p00) कहीं और वास्तविक बाधा सेवा दिनचर्या और उपयोग समारोह सूचक को परिभाषित उन्हें निष्पादित करने के लिए: <interrupt_category> में पोर्ट 0 पिन 0 व्यवधान परिभाषित करने के लिए 1 या 2 उदाहरण के लिए, है।

यह सुविधाजनक हो सकता है अगर बीच में आता है मैक्रो का उपयोग में परिभाषित किया जा सकता है। मैं निम्नलिखित तरीके से मैक्रो निर्धारित करना चाहती:

#define DECLARE_INTERRUPT(INT_NAME, INT_CAT) \ 
    static void _int_##INT_NAME(); \ 
    #pragma INTERRUPT _int_##INT_NAME INT_NAME##_ADDR INT_CAT \ 
    static void _int_##INT_NAME() { (*isr_##INT_NAME)(); } 

संकलक निम्न त्रुटि फेंक: निम्न पंक्ति का संकेत

Formal parameter missing after '#' 

:

static void _int_##INT_NAME() { (*isr_##INT_NAME)(); } 

मुझे लगता है कि पूर्वप्रक्रमक निर्देशों में नहीं किया जा सकता #define एस? क्या कोई काम आसपास है?

+1

क्या माइक्रोकंट्रोलर और संकलक? यदि यह जीसीसी आधारित है, तो माइक्रोचिप के सी 32 में एक विशेष विशेषता मैक्रो यो का उपयोग किया जा सकता है: 'शून्य __ISR (_TIMER_5_VECTOR) SomeISR (शून्य)' – detly

+1

माइक्रो ओकेआई 431 है और कंपाइलर OKI से है: IDEU8। – Donotalo

उत्तर

11

C99 नई _Pragma कीवर्ड आप #pragma अंदर मैक्रो जगह देता है कि है। असल में यह एक स्ट्रिंग को एक तर्क के रूप में उम्मीद करता है जो उस पाठ से मेल खाता है जो आपने #pragma निर्देश को दिया होगा।

अपने संकलक इस का समर्थन नहीं करता (जीसीसी करता है) और आप क्या जरूरत है की एक बाहरी कार्यान्वयन के लिए जाना चाहते हैं (जैसा कि कहा, m4 एक विकल्प हो सकता है) सबसे अच्छा शायद अधिक से अधिक निकट रहने के लिए होगा उस नए _Pragma पर नहीं। फिर एक बार आपका कंपाइलर बिल्डर मानक के साथ पकड़ लेता है तो आप बस अपनी स्क्रिप्ट का उपयोग बंद कर सकते हैं।

+0

कंपाइलर _Pragma का समर्थन नहीं करता है। :( – Donotalo

+1

@ डोनोटलो, बहुत बुरा।यह केवल 11 साल है कि यह मानक मौजूद है ;-) आप प्रीप्रोसेसर के रूप में 'gcc' का उपयोग करके और फिर संकलन के बाद के चरणों के लिए अपने मूल कंपाइलर का उपयोग करके मिश्रित समाधान का प्रयास कर सकते हैं। –

1

एक workround कोड पीढ़ी या preprocess के लिए एक और मैक्रो भाषा अपने कोड का प्रयोग है।

यानी एक अलग एक्सटेंशन के साथ कोड लिखें।

एक ग फ़ाइल

फिर संकलन है कि उत्पन्न करने के लिए अपने makefile या इसी तरह के कॉल मैक्रो भाषा (जैसे m4) या किसी न किसी रूप से एक स्क्रिप्ट है।

+0

ऐसे समाधान की तलाश है जो अन्य स्क्रिप्ट को नहीं बुलाएगा। – Donotalo

0

जहां तक ​​मुझे पता है, आप विशेष रूप से पूछना असंभव है। मैं एक प्रीप्रोसेसर मान रहा हूं जो GNU C Preprocessor जैसा ही काम करता है। उस के लिए मैनुअल, it states में:

The compiler does not re-tokenize the preprocessor's output. Each preprocessing token becomes one compiler token.

+0

मैंने यह भी सोचा कि यह असंभव है। लेकिन मैं सोच रहा हूं कि किसी भी अन्य तरीके से इसे हासिल किया जा सकता है। – Donotalo