2013-07-16 3 views
5

हैंडलिंग में हस्तक्षेप करना I atmega168a-pu और interrupts के साथ एक सी अनुप्रयोग विकसित करता है। मैं निम्नलिखित बीच में आता है का उपयोग करें:एवीआर प्रोग्रामिंग,

ISR(TIMER0_COMPA_vect); 
ISR(TIMER0_COMPB_vect); 
ISR (TIMER2_COMPA_vect); 
ISR(SPI_STC_vect); 
ISR(TIMER1_COMPA_vect); 
ISR (PCINT1_vect); 

और मेरे कोड दिखता

तरह
int main(void){ 
///initialization etc. 
    sei(); 
    while(1){ 
    ///do some stuff and wait the interrupts 
    } 
return 0; 
} 

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

क्या आप इसे कोड स्निपेट पर समझा सकते हैं कि मैं इसे कैसे कर सकता हूं?

संपादित करें: http://www.nongnu.org/avr-libc/user-manual/optimization.html#optim_code_reorder बताता है कि इस तरह के उपयोग समस्या को फिर से हल करने का कारण बनता है।

function(){ 
    cli(); 
    .. 
    sei(); 
} 

उत्तर

2

पिछला उत्तर मैंने यहां पोस्ट किया था, मूल प्रश्न पर आधारित था, avr-gcc की पुनरावृत्ति समस्या का उल्लेख नहीं। जाहिर है यह भी बहुत पहले है, कि मैं AVR के साथ काम किया है, लेकिन एक घंटी बीच में आता है

अक्षम करने के बारे में बज रही थी

बाधित किए जाने से

रक्षा बीच में आता है सवाल का संशोधित उत्तर

Atmel डाटाबेस में इंटरप्ट हैंडलिंग के बारे में लिखते हैं:

जब कोई बाधा उत्पन्न होती है, तो ग्लोबल इंटरप्ट सक्षम I-bit साफ़ हो जाता है और सभी पूर्णांक rrupts अक्षम हैं। उपयोगकर्ता सॉफ़्टवेयर नेस्टेड इंटरप्ट को सक्षम करने के लिए आई-बिट में तर्क लिख सकता है। सभी सक्षम इंटरप्ट्स वर्तमान इंटरप्ट रूटीन को बाधित कर सकते हैं। I-bit स्वचालित रूप से सेट होता है जब इंटरप्ट निर्देश से वापस लौटें - आरईटीआई - निष्पादित किया जाता है।

इसलिए जो व्यवहार आप मांगते हैं वह हार्डवेयर में पहले ही लागू हो चुका है।

पुनःअनुक्रमण मुद्दा

मैं भी इस पुनर्व्यवस्था मुद्दे पर कुछ जांच किया था। स्पष्ट रूप से बड़ी असहमति है कि यह संकलक की त्रुटि है या नहीं। ऐसा लगता है कि पुनर्वितरण का मुख्य जोखिम यह है कि इंटरप्ट्स लंबे समय तक अक्षम होने की अपेक्षा की जाती हैं। मेरे शोध के दौरान मुझे उस पर समाधान नहीं मिला जो समाधानों को छोड़कर अधिक भार/स्टोर गतिविधि उत्पन्न करता है जो वास्तव में एक विकल्प नहीं है।

+0

कोई समस्या पैदा किए बिना आप वैश्विक इंटरप्ट को कैसे अक्षम और सक्षम करते हैं? –

+0

क्या डाउनवॉटर कृपया उनके डाउनवोट को समझाएंगे? जोहान ने पोस्टिंग के 8 मिनट बाद बग विवरण को संकेत दिया। – junix

+0

@JohanElmander मैंने आपके संशोधित प्रश्न का उत्तर अपडेट किया। – junix

1

यहां प्रश्न थोड़ा अजीब है क्योंकि इंटरप्ट्स का डिफ़ॉल्ट व्यवहार यह है कि नए इंटरप्ट अक्षम हैं (जैसे आग नहीं होगी) जबकि एक बाधा की सेवा की जा रही है।

लिखने वाले कोड के संबंध में जो बाधित नहीं होना चाहिए, मुझे आमतौर पर <util/atomic.h> में परमाणु कार्यक्षमता का उपयोग करने के लिए पर्याप्त मिला है। यदि यह पर्याप्त नहीं है और आप वास्तव में सुनिश्चित करना चाहते हैं कि कोई पुनरीक्षण नहीं है तो शायद आप असेंबली में महत्वपूर्ण अनुभाग लिख सकते हैं।

यह संभव है कि आप उस कोड खंड में सब कुछ बनाने के साथ मेमोरी बाधाओं का उपयोग कर सकें, लेकिन यह कई मामलों में काफी बड़े पैमाने पर निराशाजनक होगा। इससे उत्पन्न असेंबली संकेत दे सकती है कि अगर आप हाथ से असेंबली लिखना चाहते हैं तो आप क्या लिखेंगे।

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