स्टार्टिंग STM32: बिट ऑपरेशंस

एक छोटा सा विषयांतर ...


पिछले पाठ में, हमने देखा कि कहां से शुरू करें यदि आपने एसटीएम 32 माइक्रोकंट्रोलर का अध्ययन करने का फैसला किया: एक आईडीई कैसे स्थापित करें, एक साधारण परियोजना कैसे बनाएं, एक कार्यक्रम कैसे संकलित करें, और एक कार्यक्रम कैसे चलाएं। डिस्कवरी बोर्ड पर चमकती एलईडी की प्रशंसा करने के बाद)


एक नया लेख शुरू करते हुए, मैंने तुरंत कार्यक्रम लिस्टिंग के एक विस्तृत विश्लेषण पर जाने की योजना बनाई, जिसने हमारे एल ई डी को वैकल्पिक रूप से झपकी दिया, लेकिन जब मैंने लिखना शुरू किया, तो मुझे अचानक अपने लिए एहसास हुआ कि बड़ी संख्या में प्रश्न हैं जिनके उत्तर के बिना कार्यक्रम पर विचार करने के लिए आगे बढ़ना आवश्यक होगा। समय से पहले ही। और खुद के लिए, मैंने ऐसे मुद्दों की एक पूरी सूची की पहचान की है :


  1. बिटवाइज़ ऑपरेशन क्या हैं? उनका उपयोग कैसे करें?
  2. रजिस्टर क्या हैं और वे बिट संचालन से कैसे संबंधित हैं?
  3. STM32F0xx- सीरीज़ के माइक्रोकंट्रोलर्स में क्या होता है, घड़ी की कलगी कैसी होती है और एमके के अंदर क्या होता है?
  4. एमके की शुरुआत कैसे होती है, मुझे स्टार्टअप फाइल की आवश्यकता क्यों है, SystemInit फ़ंक्शन क्या करता है ? उंगलियों पर स्पष्टीकरण।
  5. CMSIS लाइब्रेरी में क्या होता है ? इसे कैसे नेविगेट करें? इससे क्या सीखा जा सकता है और इसका उपयोग कैसे किया जाए?

यह इन मुद्दों पर विचार करने से है कि मैं STM32 की प्रोग्रामिंग के बारे में कहानी जारी रखना चाहूंगा।


लेखों की सूची:
  1. STM32 का अध्ययन शुरू करना या स्मार्ट तरीके से लाइट का प्रबंधन करना
  2. स्टार्टिंग STM32: बिट ऑपरेशंस
  3. शुरू हो रही STM32: रजिस्टर क्या हैं? उनके साथ कैसे काम करना है?


बुनियादी तर्क संचालन


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


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

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


  • Conjunction - "Logical AND" या "Logical Multiplication" के रूप में निर्दिष्ट है। वास्तव में, ए और बी के लिए दो के इस तार्किक संचालन को करने का परिणाम उनके गुणन के समान है। अर्थात्, अभिव्यक्ति "1" तभी लेगी जब A और B दोनों का मान "1" होगा। अन्य सभी मामलों में, मान "0" होगा। और, &&, और, द्वारा निरूपित किया जा सकता है
  • विघटन - "तार्किक या" या "तार्किक जोड़" के रूप में निर्दिष्ट है। ए और बी के लिए इस तार्किक दो ऑपरेशन को करने का परिणाम उनके जोड़ के समान है। यही है, यदि अभिव्यक्ति A और B में से कम से कम एक का मान "1" है तो अभिव्यक्ति "1" मान लेगी। OR, ||, OR, | के रूप में नामित किया जा सकता है
  • उलटा - "तार्किक नहीं" या "इनकार" के रूप में नामित किया गया है। अभिव्यक्ति ए के लिए दो के इस तार्किक संचालन को करने का परिणाम विपरीत है। यही है, अगर अभिव्यक्ति ए 0 है और इसके विपरीत, अभिव्यक्ति 1 मान लेगा। के रूप में नामित नहीं किया जा सकता है ;, नहीं, ~।

  • सख्त विवाद - जिसे "विशेष या" या "तार्किक जोड़ विशेष " के रूप में नामित किया गया है। ए और बी के लिए दो के इस तार्किक संचालन को करने का परिणाम ए और बी के अलग-अलग मान होने पर मान 1 होगा। एक्सल के रूप में नामित किया जा सकता है या, XOR, ^।

बिट संचालन


बिट ऑपरेशंस लगभग लॉजिकल ऑपरेशंस के समान ही होते हैं, एकमात्र अंतर यह है कि वे बिट्स और बाइनरी नंबर पर लागू होते हैं।


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


बिट ऑपरेशन "नहीं" - "~"

यदि बिट "1" है, तो ऑपरेशन "नहीं" करने के बाद यह "0" के बराबर होगा, और इसके विपरीत। ऑपरेशन तुरंत बाइनरी नंबर के सभी बिट्स पर किया जाता है। उदाहरण के लिए, एफएफ नंबर को उल्टा करें:



बिट ऑपरेशन "और" - "और"

यदि बिट में दोनों बिट्स "1" के बराबर हैं, तो ऑपरेशन "AND" करने के बाद, बिट में परिणाम "1" के बराबर होगा, लेकिन यदि कम से कम बिट्स में से एक "0" है, तो परिणाम "0" के बराबर होगा। ऑपरेशन को बिटवाइज़ भी किया जाता है। उदाहरण के लिए, "गुणा करें" दो संख्याएँ 0xFF0 और 0xF0F:


नतीजतन, हम देखेंगे कि उन श्रेणियों में जहां दोनों संख्याओं में इकाइयां थीं, परिणाम इकाइयों थे, अन्य सभी मामलों में - शून्य।

व्यावहारिक अनुप्रयोग के विकल्पों पर विचार करें:

  • ऐसी स्थिति में जहां हमें एक विशिष्ट बिट या बिट्स के समूह को शून्य पर रीसेट करने की आवश्यकता होती है, हम एक मुखौटा का उपयोग कर सकते हैं। मुझे लगता है कि इसे एक उदाहरण के साथ दिखाना स्पष्ट होगा। मान लीजिए कि हम एक संख्या और 0xF8F लेते हैं और हमें एकता के बजाय शून्य बनने के लिए 7 वें बिट की आवश्यकता है। कोई समस्या नहीं है, एक मुखौटा पर रखो और वांछित बिट को अनचेक करें। संख्याओं को गुणा करें और परिणाम प्राप्त करें:

  • यदि हमें 0 या 1 के लिए एक संख्या में एक विशिष्ट बिट की जांच करने की आवश्यकता है - हम मास्क का उपयोग गुणा करने के लिए भी करते हैं। मास्क में, हमने थोड़ा सेट किया है जिसे हम जांचना चाहते हैं। यदि आवश्यक बिट "0" है, तो गणना का परिणाम "0" होगा, यदि "1" तब, क्रमशः, "1"। यदि हम यह पता लगाना चाहते हैं कि क्या 7 वां बिट एक के बराबर है, तो हम संबंधित मास्क बनाते हैं और मास्क द्वारा हमारी संख्या को गुणा करते हैं। सब कुछ सरल है:

    यदि हमें किसी संख्या की समता की जांच करने की आवश्यकता है (जिसका अर्थ है कि संख्या की संख्या दो से विभाज्य है), तो हम उसी तरह से 1 बिट की जांच करते हैं, यदि यह "1" है, तो संख्या विषम है, यदि "0" है तो संख्या समान है। अपने आप को आज़माएं, कौशल का प्रशिक्षण और निर्माण करने के लिए, यह परीक्षण करें।

बिटवाइज़ ऑपरेशन "या" - "|

यदि बिट्स की एक या दोनों जोड़ी "1" है, तो परिणाम "1" होगा, अन्यथा यदि दोनों बिट्स "0" के बराबर हैं तो परिणाम "0" होगा। यही है, मोटे तौर पर बोलते हुए, अंकों में सभी इकाइयों के अतिरिक्त प्रदर्शन किया जाता है। उदाहरण के लिए, यदि हम दो संख्याएँ 0xF8F और 0x7F जोड़ते हैं, तो हमें निम्नलिखित परिणाम मिलते हैं:



एक व्यावहारिक अनुप्रयोग पर विचार करें:
  • यदि हमें संख्या 1 में एक विशिष्ट बिट सेट करने की आवश्यकता है, तो हम इसके अलावा प्रदर्शन करने के लिए मास्क का भी उपयोग करते हैं। उदाहरण के लिए, 0xFF0 में 15 वीं बिट सेट करने के लिए, आपको एक तार्किक जोड़ ऑपरेशन करने की आवश्यकता है और हमें वांछित परिणाम प्राप्त होंगे:


अपने दम पर अलग-अलग संख्याओं के साथ खेलने की कोशिश करें और परिणाम देखें।

EXCLUSIVE या बिटवाइज़ ऑपरेशन "^" है

यदि बिट में बिट्स अलग हैं और बराबर नहीं हैं तो परिणाम "1" होगा, अन्यथा "0"। उदाहरण के लिए, यदि हम XOR नंबर 0xF8F और 0x7F करते हैं, तो हम देखेंगे कि बिट्स में उत्कृष्ट बिट्स हैं, तो परिणाम "1" है और उन जगहों पर जहां बिट्स समान हैं, चाहे वह "0" या "1" हो, यह पता चला है "0" ", अंत में हमें निम्नलिखित परिणाम मिलते हैं:


व्यावहारिक अनुप्रयोग के विकल्पों पर विचार करें:

  • यदि हमें किसी संख्या में किसी भी बिट्स को पलटने की आवश्यकता है, तो हम XOR ऑपरेशन का उपयोग करके आसानी से ऐसा करने के लिए मास्क का उपयोग कर सकते हैं। चलो 0xC0 का उपयोग करके संख्या 0xF8 में 6 वें और 7 वें अंक का व्युत्क्रम करते हैं। आप छवि में परिणाम देख सकते हैं:

  • ऐसी परिस्थितियां हैं जब दो रजिस्टरों की तुलना करना और यह निर्धारित करना आवश्यक है कि वे समान हैं या नहीं । इस मामले में, हमें एक्सओआर संचालन के लिए मूल्यों को पंजीकृत करने की आवश्यकता है। यदि परिणाम "0" है, तो रजिस्टर बराबर हैं, अन्यथा वे बराबर नहीं हैं:



बिट शिफ्ट ऑपरेशन
शिफ्ट संचालन के रूप में संदर्भित कई दिलचस्प और कभी-कभी बेहद उपयोगी बिट संचालन होते हैं । आप डिस्चार्ज को दाएं और बाएं दोनों ओर ले जा सकते हैं। इस ऑपरेशन के दौरान, बाइनरी नंबर के सभी बिट्स को निर्दिष्ट संख्या के पदों द्वारा स्थानांतरित किया जाता है, इस मामले में, यदि शिफ्ट बाईं ओर जाती है , तो सबसे महत्वपूर्ण बिट (सबसे बाईं ओर) खो जाता है, और "0" को कम से कम महत्वपूर्ण (दाईं ओर) लिखा जाता है। दाईं ओर एक तार्किक बदलाव के साथ, विपरीत स्थिति उत्पन्न होती है - कम-ऑर्डर बिट (सबसे दाएं) खो जाता है, और "0" उच्च-ऑर्डर बिट को लिखा जाता है। इसके अलावा, मैं यह नोट करना चाहूंगा कि 32-बिट शब्दों के मामले में, सभी 32 बिट्स को एक पूरे के रूप में स्थानांतरित किया जाता है। शिफ्ट ऑपरेशन पर अधिक विस्तार से विचार करें।


वाम शिफ्ट - "<<"

आप देख सकते हैं कि नीचे की छवि में बदलाव कैसे होता है। मुझे लगता है कि सब कुछ काफी स्पष्ट है:


एक बाइनरी शिफ्ट के साथ, आप एक दिलचस्प विशेषता को नोटिस कर सकते हैं। एक अंक द्वारा एक पारी हमारी संख्या को 2 से गुणा करती है। यदि हम अपनी संख्या x को n अंकों से स्थानांतरित करते हैं, तो हमें x * (2 * 2) मिलता है। मतगणना के लिए हमारी उपयोगिता के माध्यम से इस पैटर्न को स्वतंत्र रूप से ट्रैक करने का प्रयास करें। =)

दाईं ओर शिफ्ट करें - ">>"

एक पारी से दाईं ओर क्या परिणाम छवि में स्पष्ट रूप से परिलक्षित होता है:


दाईं ओर एक बाइनरी शिफ्ट के साथ, आप नोटिस कर सकते हैं कि स्थिति बाईं ओर की शिफ्ट के विपरीत है - संख्या 2 एस से 1 अंक की शिफ्ट में विभाजित है और फिर 2 * एन द्वारा, जहां n बिट्स की संख्या है जिसके द्वारा शिफ्ट बनाया गया था। अपने आप को संख्याओं के साथ खेलने की कोशिश करें, जो स्पष्ट रूप से 2 में पूरी तरह से विभाजित हैं। और बैकफ़िल का सवाल - यदि आप विषम संख्या को इस तरह से विभाजित करते हैं तो परिणाम क्या होगा?

महत्वपूर्ण नोट । यदि आप एक नकारात्मक चिह्न (हस्ताक्षरित) के साथ एक चर के लिए एक बदलाव करते हैं, तो खाली पदों को भर दिया जाएगा।

निष्कर्ष में ...


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


होमवर्क के रूप में , हमारे प्रोग्राम कोड को खुद को पार्स करने का प्रयास करें जबकि (1) {...} ब्लॉक करें और समझें कि हम कैसे बिट्स ऑपरेशन के साथ अपने एलईडी को चालू और बंद करते हैं । खैर, अगले पाठ में मैं आपको बताऊंगा कि यह वास्तव में कैसे होता है!



लेखों की सूची:
  1. STM32 का अध्ययन शुरू करना या स्मार्ट तरीके से लाइट का प्रबंधन करना
  2. स्टार्टिंग STM32: बिट ऑपरेशंस
  3. शुरू हो रही STM32: रजिस्टर क्या हैं? उनके साथ कैसे काम करना है?

Source: https://habr.com/ru/post/hi406889/


All Articles