2010-03-31 15 views
12

मैं http://embeddedgurus.com/embedded-bridge/2010/03/different-bit-types-in-different-registers/, जिसमें कहा गया पढ़ रहा था:एम्बेडेड सिस्टम पर रजिस्टरों के लिए आवश्यक-संशोधित-लिखना क्यों आवश्यक है?

पढ़ने के साथ

/बिट्स, फर्मवेयर सेट लिख सकते हैं और जब जरूरत बिट्स साफ करता है। यह आम तौर पर पहले रजिस्टर पढ़ता है, वांछित बिट को संशोधित करता है, तो बाहर

वापस संशोधित मूल्य लिखते हैं और मैं जबकि कुछ उत्पादन यहां पुराने नमक एम्बेडेड लोगों द्वारा कोडित कोड को बनाए रखने कि consrtuct में चलाने की है। मुझे समझ में नहीं आता कि यह क्यों जरूरी है।

जब मैं थोड़ा सेट/साफ़ करना चाहता हूं, तो मैं हमेशा बिटमैस्क के साथ बस या/nand करता हूं। मेरे दिमाग में, यह किसी थ्रेडसेफ की समस्याओं को हल करता है, क्योंकि मैं सेटिंग मानता हूं (या तो मास्क के साथ असाइनमेंट या ऑरिंग द्वारा) एक रजिस्टर केवल एक चक्र लेता है। दूसरी तरफ, यदि आप पहले रजिस्टर पढ़ते हैं, तो संशोधित करें, फिर लिखें, पढ़ने और लिखने के बीच होने वाली बाधा के परिणामस्वरूप रजिस्टर के लिए पुराना मूल्य लिखना पड़ सकता है।

तो क्यों पढ़ना-संशोधित-लिखना? क्या यह अभी भी जरूरी है?

उत्तर

15

यह आपके विशेष एम्बेडेड डिवाइस की वास्तुकला पर कुछ हद तक निर्भर करता है। मैं तीन उदाहरण दूंगा जो आम मामलों को कवर करते हैं। हालांकि, इसका मूलभूत ज्ञान यह है कि मूल रूप से सीपीयू कोर सीधे आई/ओ डिवाइस के रजिस्टरों पर काम नहीं कर सकता है, उन्हें एक बाइट-या यहां तक ​​कि शब्द-आधारित फैशन में पढ़ने और लिखने के अलावा।

1) 68 एचसी 08 श्रृंखला, एक 8-बिट स्वयं निहित माइक्रोकंट्रोलर।

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

आप यह भी देखेंगे कि वे व्यक्तिगत पढ़ने या लिखने के निर्देशों से अधिक समय लेते हैं, लेकिन नौकरी के लिए तीन निर्देशों का उपयोग करने से कम समय (नीचे देखें)।

2) एआरएम या पावरपीसी, पारंपरिक 32-बिट आरआईएससी सीपीयू (अक्सर उच्च अंत माइक्रोकंट्रोलर में भी पाए जाते हैं)।

इनमें कोई निर्देश शामिल नहीं हैं जो दोनों स्मृति तक पहुंच सकते हैं और एक बार गणना (और/या) कर सकते हैं। आप सी में लिखते हैं:

LBZ r4,r8 
ORI r4,r4,#0x40 
STB r4,r8 

क्योंकि यह कई निर्देश है, यह नहीं है:

*register |= 0x40;

यह folowing विधानसभा में बदल जाता है (इस PowerPC उदाहरण के लिए, r8 रजिस्टर पते शामिल हैं) परमाणु, और इसे बाधित किया जा सकता है। इसे परमाणु बनाना या यहां तक ​​कि एसएमपी-सुरक्षित इस उत्तर के दायरे से बाहर है - इसके लिए विशेष निर्देश और तकनीकें हैं।

3) आईए 32 (x86) और AMD64। आप इन्हें "एम्बेडेड" के लिए क्यों इस्तेमाल करेंगे, मेरे बाहर है, लेकिन वे दो अन्य उदाहरणों के बीच आधे रास्ते के घर हैं।

मैं भूल जाता हूं कि एक एकल-निर्देश-मेमोरी बिट-सेट और x86 पर बिट-साफ़ है या नहीं। यदि नहीं, तो ऊपर आरआईएससी अनुभाग देखें, यह केवल तीन के बजाय केवल दो निर्देश लेता है क्योंकि x86 एक निर्देश में लोड और संशोधित कर सकता है।

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

विचित्रता यह है कि x86 (एचसी 08 के विपरीत) बस मास्टर द्वारा मध्य-लेनदेन में मेमोरी बस पर बाधा डाली जा सकती है, न केवल पारंपरिक सीपीयू इंटरप्ट द्वारा। तो आप इस मामले में, जैसे कि कई मेमोरी चक्रों को पूरा करने के लिए एक निर्देश के लिए मैन्युअल रूप से एक LOCK उपसर्ग जोड़ सकते हैं। हालांकि आप इसे सादा सी से नहीं प्राप्त करेंगे।

+0

धन्यवाद। मैं पावरपीसी का उपयोग कर रहा हूं, और मैंने बस कुछ अलग-अलग हिस्सों को सत्यापित करने के लिए पकड़ा है, और मैं 3 ऑप्स देखता हूं। मैंने सोचा था कि एक स्मृति स्थान के साथ एक मुखौटा एंडिंग/ऑरिंग के लिए एक एकल असेंबली निर्देश था। –

+0

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

+1

मैंने एक प्रोसेसर का उपयोग किया है जिसमें केवल-लिखने वाले रजिस्ट्रार थे, और रैम वेरिएबल में रजिस्टर की एक छाया प्रति रखने की आवश्यकता थी। उन मामलों में, आपको छाया पढ़नी, इसे संशोधित करना, रजिस्टर लिखना और छाया लिखना पड़ा। निश्चित रूप से परमाणु संचालन नहीं, इसलिए आपको इंटरप्ट को भी अक्षम करना होगा। – tomlogic

7

बात यह है कि यदि आप रजिस्टर में अन्य बिट्स को संशोधित नहीं करना चाहते हैं तो आपको यह जानना होगा कि वे कुछ लिखने से पहले क्या हैं। इसलिए पढ़ें/मोडिय/लिखो। ध्यान दें कि यदि आप की तरह एक सी बयान का उपयोग करें:

*pRegister |= SOME_BIT; 

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

ध्यान दें कि स्मृति-मैप किए गए हार्डवेयर रजिस्टरों को आम तौर पर volatile चिह्नित किया जाता है ताकि ये अनुकूलन न हो जाएं (अन्यथा कई हार्डवेयर पंजीकरण दिनचर्या ठीक से काम नहीं करेंगे)।

अंत में, कभी-कभी ऐसे रजिस्टरों के लिए हार्डवेयर समर्थन होता है जो विशेष रूप से हार्डवेयर में बिट्स को सेट/संशोधित/लिखने के अनुक्रम की आवश्यकता के बिना सेट या साफ़ करते हैं। कुछ एटम एआरएम माइक्रोकंट्रोलर जिनके साथ मैंने काम किया है, उनके पास विशिष्ट रजिस्टरों के साथ यह है कि हार्डवेयर में बिट्स को साफ़ या सेट करें, केवल उन बिट्स जो सेट पर लिखते हैं जब आप रजिस्टर में लिखते हैं (अकेले किसी भी परेशान बिट को छोड़कर)। इसके अलावा कॉर्टेक्स एम 3 एआरएम सीपीयू मेमोरी में या पढ़ने के लिए एक बिट (पढ़ने या लिखने के लिए) तक पहुंचने का समर्थन करता है या हार्डवेयर रजिस्टर्स को एक तकनीक के साथ एक विशिष्ट पता स्थान तक पहुंचने के माध्यम से 'bit-banding' पर कॉल करता है। बिट-बैंडिंग एल्गोरिदम पहली नज़र में जटिल दिखता है, लेकिन यह वास्तव में कुछ सरल अंकगणित है जो एक पते में किसी बिट में ऑफसेट को किसी अन्य 'बिट-विशिष्ट' पते पर मैप करने के लिए है।

वैसे भी, नीचे की रेखा यह है कि कुछ प्रोसेसर हैं जहां आप पढ़/संशोधित/लिखने वाली श्रृंखला के बिना दूर हो सकते हैं, लेकिन इसका कोई मतलब सार्वभौमिक रूप से सच नहीं है।

0

जब मैं थोड़ा सेट/साफ़ करना चाहता हूं, तो मैं हमेशा बिटमैस्क के साथ या/nand।

कुछ रजिस्ट्रारों के लिए जो काफी अच्छा है। ऐसे मामले में सीपीयू का फर्मवेयर अभी भी एक पठन-संशोधित-लेखन करने जा रहा है।

मेरे मन के लिए, यह किसी भी threadsafe समस्याओं को हल करती है, के बाद से मैं स्थापित करने (या तो काम या एक मुखौटा साथ oring) एक रजिस्टर केवल एक चक्र लेता है मान।

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

2

यदि आपको किसी शब्द में बिट्स का सबसेट संशोधित करना है, और आर्किटेक्चर केवल शब्द स्तर पढ़ने/लिखने का समर्थन करता है, तो आपको उन बिट्स को पढ़ना होगा जिन्हें वापस लिखना नहीं है ताकि वे नहीं लिख सकें ताकि वे नहीं हैं संशोधित।

कुछ आर्किटेक्चर वैश्विक स्तर पर या स्मृति के विशिष्ट क्षेत्रों के लिए बिट स्तर मेमोरी एक्सेस का समर्थन करते हैं। लेकिन फिर भी जब कई बिट्स को संशोधित करते हैं, तो कम-से-कम निर्देशों में कई परिणाम पढ़ें-संशोधित करें। मल्टी-थ्रेडेड सिस्टम में देखभाल सुनिश्चित करने के लिए लिया जाना चाहिए कि दो थ्रेड एक ही शब्द पर इस गैर-परमाणु क्रिया को एक साथ नहीं कर सकते हैं।

2

आधुनिक प्रोसेसर या तो एकल निर्देश के साथ बिट्स सेट या साफ़ कर सकते हैं। हालांकि, ये निर्देश एक ही समय में सेट और साफ़ नहीं हो सकते हैं। ऐसे कई उदाहरण हैं जब आईओ पोर्ट के कुछ बिट्स एक साथ बदलना चाहिए और अन्य बिट्स को प्रभावित नहीं करना चाहिए। जब तक पढ़ने-संशोधित-लेखन का अनुक्रम टूटा नहीं जा सकता है, तब तक कोई समस्या नहीं है।

स्थिति जहां आर-एम-डब्ल्यू समस्या बन सकती है, तीन स्थितियों की आवश्यकता होती है।

  1. वैरिएबल वैश्विक स्तर पर पहुंच योग्य होना चाहिए जैसे आईओ पोर्ट या विशेष फ़ंक्शन रजिस्टर या वैश्विक रूप से परिभाषित चर।

  2. वैश्विक चर को एक ऐसे फ़ंक्शन में संशोधित किया जा सकता है जिसे पूर्ववत किया जा सकता है।

  3. एक ही वैश्विक चर को एक छूट के दौरान संशोधित किया जाता है।

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

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