AVR SEI निर्देश


13

AVR SEI निर्देश ( http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_SEI.html ) इंटरप्ट को सक्षम करने से पहले समाप्त करने के लिए अगले निर्देश की प्रतीक्षा करता है।

यदि मैं SREG में I ध्वज सेट करने के लिए किसी अन्य निर्देश का उपयोग करता हूं, तो क्या यह भी 1 निर्देश की प्रतीक्षा करेगा?

दूसरे शब्दों में: क्या एसईआई निर्देश या स्थिति रजिस्टर की एक विशेषता है?

यदि यह एसईआई निर्देश की एक विशेषता है, तो किस बिंदु पर झंडा वास्तव में सेट हो जाता है, उस चक्र में जो एसईआई को निष्पादित करता है या अगले निर्देश के साथ?


यह एक महान प्रश्न है, लेकिन यह परीक्षण करना और सुनिश्चित होना बहुत मुश्किल नहीं होना चाहिए।
वोरैक

1
@ वोरैक क्या आप मुझे एक उदाहरण दे सकते हैं कि यह कैसे परीक्षण किया जा सकता है? यह सुनिश्चित करने के लिए मेरा स्वीकृत जवाब होगा।
जयजय

1
यह AVR आर्किटेक्चर के कार्यान्वयन की एक विशेषता हो सकती है, और जहां व्यवधानों को नियंत्रित किया जा सकता है। IIRC, AVR आर्किटेक्चर ने 3-स्टेज पाइपलाइन का इस्तेमाल किया। तो अगले निर्देश पहले से 'इन-फ़्लाइट' (यानी पाइपलाइन चरण एक में, या आगे) हो सकता है इससे पहले कि मैं झंडा परिवर्तन का उपयोग बाधित होने की जांच करने के लिए कर सकता हूं। मैंने लंबे समय तक नहीं देखा है, लेकिन मुझे नहीं लगता कि AVR वास्तुकला के डिजाइनरों ने खुद को अधिक विवश किया होगा। इसलिए, पाइपलाइन के चरण 1 में एक निर्देश के लिए रुकावट का परीक्षण करना, और अगले निर्देश से पहले नहीं (चरण 2 में) उन्हें कुछ लचीलापन देता है।
२४ बजे

जवाबों:


8

आनुभविक परिणाम!

जबकि अन्य उत्तर विचारशील और सुविचारित हैं, वे सभी अधूरे हैं या केवल अनुमान हैं। जहां दस्तावेज अस्पष्ट है, हमें प्रयोग करना चाहिए और हमें हर मामले का परीक्षण करना चाहिए।

यह प्रश्न एक निर्णायक उत्तर के योग्य है, तो आइए एक AVR को बाहर निकालें और कुछ बिट्स सेट करना शुरू करें!

प्रक्रिया

परीक्षण करने के लिए, मैंने थोड़ा Arduino (ATMEGA328P) प्रोग्राम बनाया जो होगा ...

  1. एक ISR सेटअप जो कभी नहीं लौटेगा ( while (1))
  2. ISR को एक ऐसे स्रोत को सौंपा जिसे मैं सॉफ्टवेयर में ट्रिगर कर सकता हूं ( INT0कम होता जा रहा है)
  3. विकलांग व्यवधान
  4. सक्षम किया गया और व्यवधान को ट्रिगर किया गया ताकि यह लंबित हो

मैंने एक परीक्षण बिस्तर का उपयोग किया था जो कि व्यवधान सक्षम होने के बाद एकल निर्देश में एक एलईडी चालू करेगा। परीक्षण बिस्तर में इंटरप्ट को सक्षम करने और एलईडी की जांच करने के विभिन्न तरीकों की कोशिश करके, मैं बता सकता हूं कि सक्षम करने के बाद निर्देश निष्पादित किया गया था या नहीं।

अगर एलईडी पर नहीं आया था, तो मुझे पता है कि ISR निष्पादित (और लॉक) बाधित होने के तुरंत बाद सक्षम थे।

अगर एलईडी पर आया था, तो मुझे पता है कि अगले निर्देश को आईएसआर के बुलाए जाने से पहले निष्पादित करने की अनुमति दी गई थी।

परिणाम

SEI निर्देश (बेस केस)

कोड:

sei

परिणाम: पर एलईडी। अनुदेश का पालन किया गया।

OUT अनुदेश

कोड:

in  r16,0x3f   // Get SREG
ori r16,128    // Set I bit 
out 0x3f,r16   // Save back to SREG

परिणाम:

नेतृत्व। अनुदेश का पालन किया गया।

ST अनुदेश

कोड:

   clr r29        // Clear Y high byte
   ldi r28,0x5f   // Set Y low byte to point to SREG
   ld r16, Y      // Get SREG
   ori r16,128    // Set I bit 
   st Y,r16       // Put SREG

परिणाम:

नेतृत्व। अनुदेश का पालन किया गया।

निष्कर्ष!

प्रश्न: क्या एसईआई निर्देश या स्थिति रजिस्टर की प्रतीक्षा है?

एक: ऐसा लगता है कि बदलते Iमें बिट SREGसे एक है 0एक करने के लिए 1निम्नलिखित अनुदेश अगले निष्पादित करने के लिए भले ही एक लंबित बाधा है, क्या अनुदेश बिट सेट करने के लिए प्रयोग किया जाता है की परवाह किए बिना अनुमति देगा।

टिप्पणियाँ

यह वास्तव में बहुत सारी जटिलताओं के साथ एक बहुत ही दिलचस्प सवाल में बदल गया। यदि आप रुचि रखते हैं, तो वह विवरण ...

http://wp.josh.com/2016/01/05/different-ways-to-set-i-bit-in-avr-sreg-besides-sei/


2
जब विनिर्देश अस्पष्ट है, तो "अनुभवजन्य परिणाम" के साथ एक समस्या है। केवल इसलिए कि हार्डवेयर का विशिष्ट टुकड़ा आपने एक विशिष्ट तरीके से काम किया है, इसका मतलब यह नहीं है कि अन्य भाग उस तरह से काम करेंगे। Atmel स्वतंत्रता को लागू करने के लिए परिवर्तन प्रदान कर रहे हैं, बशर्ते कि यह विनिर्देश नहीं बदलता है। तो, "जहां प्रलेखन अस्पष्ट है, ..." यह बिल्कुल वैसा ही रहता है, प्रयोग और परीक्षण के बाद, यह अभी भी अस्पष्ट है।
गूलर

@ कुलकर्मी मैं 100% सहमत हूँ। वह जो उत्पादन में अनिर्दिष्ट सुविधाओं का उपयोग करता है, वह दुखी होता है। फिर भी एक दिलचस्प अनुभवजन्य सवाल (और जवाब), और शायद एक-एक व्यक्तिगत परियोजना के लिए निर्भर होना ठीक है।
बिगजोश

हां, आपने एक आकर्षक जांच की।
गूलर

4

यह प्रलेखन से मेरी समझ है कि seiनिर्देश का प्रदर्शन सीधे SREG के 1 से I बिट लिखने से अलग नहीं है। निर्देश का लाभ यह है कि आपको 1<<ISREG को बदलने के लिए पहले एक कार्य रजिस्टर में मूल्य को लोड करने की आवश्यकता नहीं है , इस प्रकार यह समय बचाता है।

विस्तृत, का उपयोग करते हुए sei:

sei ; One cycle

बिट सेटिंग का उपयोग करना sbi(केवल तभी काम करेगा यदि SREG रजिस्टर मैप के निचले 32 बाइट्स में था, लेकिन ऐसा लगता है कि यदि यह सब नहीं है तो अधिक से अधिक।)

sbi SREG,7 ; Two cycles

SREG में सीधे I को लिखना:

in  r24,SREG ;
ori r24,0x80 ;
out SREG,r24 ; Three cycles

Iबिट के रूप में के रूप में जल्द SREG में सेट किया जाना चाहिए seiअनुदेश (या sbiया out) पूरा करती है। हालांकि, किसी भी लंबित व्यवधान को तब तक नहीं संभाला जाएगा जब तक कि अगला निर्देश पूरा न हो जाए - बिट सेट हो जाएगा, लेकिन इंटरप्ट को सक्षम होने में अतिरिक्त चक्र लगता है। क्योंकि एक व्यवधान को मध्य निर्देश को संभाला नहीं जा सकता है, और कुछ निर्देशों को निष्पादित करने में एक से अधिक चक्र लगते हैं, वे एक निर्देश के रूप में सक्षम होने में लगने वाले समय को निर्दिष्ट करते हैं। कोड के सभी संस्करणों के लिए यह मामला होना चाहिए - अर्थात उपरोक्त प्रत्येक निर्देश के देरी का कारण होगा।


थोड़ी खोज के बाद, मुझे यह धागा Arduino फोरम पर मिला जिसमें व्यवहार को सत्यापित करने के लिए कई अलग-अलग परीक्षण किए गए थे। मुझे लगता है कि मैंने ऊपर जो कहा है, उससे सहमत हूँ।

इसके अलावा, उस धागे के अनुसार, यदि Iझंडा पहले से ही सेट है, तो किसी रुकावट की प्रतिक्रिया में देरी नहीं होती है, seiजिसके कारण यह देरी होती है कि विलंबित प्रतिक्रिया स्वयं निर्देश के कारण नहीं होती है, बल्कि Iध्वज द्वारा नियंत्रित आंतरिक हार्डवेयर में होती है - किसी भी आपरेशन जो SREG में झंडा बदल कर, यह हो seiया outया stsहोगा वास्तव में एक ही व्यवहार।


इसलिए ऑपरेशन में देरी करने का कोई पहलू नहीं है, जो एसईआई के लिए विशिष्ट है, लेकिन बाहर नहीं है, जो निम्नलिखित निर्देश को पूरा करने की अनुमति देता है?
ब्रायन ड्रमंड बाद

आपके दूसरे उदाहरण के मामले में, एक लंबित व्यवधान कब संभाला जाता है? क्या पहले की तरह चक्र में देरी हो रही है?
jayjay

@ संजय मेरा अपडेट देखें।
टॉम कारपेंटर

1
ध्यान दें कि बिट को किसी भी कोड में SBIसेट करने के लिए उपयोग नहीं किया जा सकता है जो वास्तव में वास्तविक जीवन में परीक्षण नहीं किया गया था क्योंकि यह इकट्ठा भी नहीं होगा। केवल निचले 32 रजिस्टरों पर काम कर सकते हैं और SREG 63 ISREGSBI
वें

@ एसबीजॉश एसबीआई उदाहरण एक था जिसे मैंने बाद में सोचा outथा - एक मैं मूल रूप से उपयोग कर रहा था। मैंने सोचा था कि मैं एक AVR (एक ATTiny हो सकता हूं) जो कि 32 निचले रजिस्टरों में SREG है, लेकिन मैं इसकी कल्पना कर सकता हूं।
टॉम कारपेंटर

1

IMO SREG को लिखता है फिर भी देरी 1 निर्देश इस तरह से परीक्षण किया जा सकता है (छद्मकोश):

ISR() { PORTA = 0; while(1); }
main() 
{
    cli();
    DDRA = 0xff;
    configure_isr_for_level_interrupt_that_will_trigger_immediately();
    SREG = 0xff;
    cli();
    PORTA = 0xff;
    while(1);
}

दुर्भाग्य से मेरे पास इसे करने के लिए समय की कमी है :(


0

यह वह नहीं है जो यह कहता है। दस्तावेज कहते हैं

किसी भी लंबित व्यवधान से पहले SEI के निर्देशों का पालन किया जाएगा।

ऐसा नहीं है कि यह अगले निर्देश की प्रतीक्षा कर रहा है। मैंने इसे पढ़ा क्योंकि ध्वज को तुरंत सेट किया गया है, लेकिन सक्षम होने के बावजूद, जब तक कि अगले निर्देश को निष्पादित नहीं किया जाता है, तब तक कोई व्यवधान नहीं होगा।


यह सब सच है, लेकिन मेरा सवाल है: क्या यह व्यवहार एसईआई के लिए विशिष्ट है?
जयजय

@ संजय को संदेह है कि यह निर्देश पाइपलाइन की लंबाई के कारण है
crasic
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.