कोर्टेक्स-एम 3 पर महत्वपूर्ण खंड


10

मैं एक कॉर्टेक्स-एम 3 पर महत्वपूर्ण कोड अनुभागों को लागू करने के बारे में सोच रहा हूं जहां समय की कमी या निर्णायक मुद्दों के कारण अपवादों की अनुमति नहीं है।

मेरे मामले में, मैं LPC1758 चला रहा हूं और मेरे पास बोर्ड पर TI CC2500 ट्रान्सीवर है। CC2500 में पिन होते हैं जिन्हें RX बफर में डेटा के लिए इंटरप्ट लाइन्स और TX बफर में फ्री स्पेस के रूप में इस्तेमाल किया जा सकता है।

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

यह कोर्टेक्स-एम 3 पर सबसे अच्छा कैसे किया जाता है?

जवाबों:


11

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

ध्यान दें कि STREX अक्सर निराशावादी होता है। वहाँ स्थितियों की एक किस्म है जहाँ यह दुकान प्रदर्शन नहीं करने का निर्णय ले सकता है, भले ही सवाल में स्थान को छुआ न गया हो। उदाहरण के लिए, LDREX और STREX के बीच एक व्यवधान STREX का कारण बनेगा कि जिस स्थान को देखा जा रहा है वह हिट हो सकता है। इस कारण से, आमतौर पर LDREX और STREX के बीच कोड की मात्रा को कम करना एक अच्छा विचार है। उदाहरण के लिए, कुछ इस तरह से विचार करें:

इनलाइन शून्य safe_increment (uint32_t * addr)
{
  uint32_t new_value;
  करना
  {
    new_value = __ldrex (addr) + 1;
  } जबकि (__ स्ट्रेक्स (new_value, addr));
}

जो कुछ इस तरह संकलित करता है:

; मान लें कि R0 प्रश्न में पता रखता है; r1 ट्रैश किए गए
एल.पी.:
  ldrex r1, [r0]
  r1, r1, # 1 जोड़ें
  strex r1, r1, [r0]
  सीएमपी आर 1, # 0; अगर गैर शून्य
  bn lp
  .. कोड जारी है

अधिकांश समय कोड निष्पादित होता है, LDREX और STREX के बीच कुछ भी नहीं होगा कि उन्हें "परेशान" किया जाए, इसलिए STREX आगे की हलचल के बिना सफल होगा। यदि, हालांकि, LDREX या ADD निर्देश के तुरंत बाद एक व्यवधान उत्पन्न होता है, तो STREX स्टोर का प्रदर्शन नहीं करेगा, लेकिन इसके बजाय कोड [r0] के (संभवतः अद्यतन किए गए) मान को पढ़ने के लिए वापस चला जाएगा और एक नए संचित मूल्य की गणना करेगा। उस पर आधारित है।

Safe_increment जैसे ऑपरेशन बनाने के लिए LDREX / STREX का उपयोग करना न केवल महत्वपूर्ण अनुभागों को प्रबंधित करना संभव बनाता है, बल्कि कई मामलों में उनकी आवश्यकता से बचने के लिए भी संभव है।


इसलिए "अवरुद्ध" करने का कोई तरीका नहीं है, ताकि वे एक बार अनब्लॉक होने के बाद फिर से परोसे जा सकें? मुझे पता है कि यह संभवत: एक अयोग्य समाधान है भले ही मैं संभव हो, लेकिन मैं एआरएम बाधा से निपटने के बारे में अधिक जानना चाहता हूं।
एमिल एरिकसन

3
इंटरप्ट को अक्षम करना संभव है, और कोर्टेक्स-एम 0 पर अक्सर ऐसा करने का कोई व्यावहारिक विकल्प नहीं होता है। मैं एलडीआरईएक्स / एसटीआरईएक्स दृष्टिकोण को बाधित करने में अक्षम होने की तुलना में क्लीनर मानता हूं, हालांकि कई मामलों में यह वास्तव में मायने नहीं रखता है (मुझे लगता है कि प्रत्येक चक्र को समाप्त करने में सक्षम और अक्षम करें, और पांच चक्रों के लिए व्यवधान को निष्क्रिय करना शायद बहुत बड़ी बात है) । ध्यान दें कि अगर कोड मल्टी-कोर सीपीयू में माइग्रेट होता है, तो एक ldrex / strex दृष्टिकोण काम करेगा, जबकि एक दृष्टिकोण जो बाधित करता है, बाधित नहीं होगा। इसके अलावा, कुछ RTOS के रन कोड कम अनुमतियों पर बाधित नहीं होने दिए जाते हैं।
सुपरकैट

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

ऊपर दिए गए एक उत्तर पर भरोसा नहीं किया जा सकता क्योंकि संबंधित कोड एक कोष्ठक याद कर रहा है: while(STREXW(new_value, addr); हम कैसे कह सकते हैं कि आप जो कहते हैं वह सही है यदि आपका कोड भी संकलित नहीं होगा?

@ समय: क्षमा करें मेरी टाइपिंग सही नहीं है; मेरे पास तुलना के लिए मेरे द्वारा लिखा गया वास्तविक कोड नहीं है, इसलिए मुझे याद नहीं है कि मैं जिस सिस्टम का उपयोग STREXW या __STREXW कर रहा था, लेकिन एक कंपाइलर संदर्भ सूची __strex को एक आंतरिक (STREXW के विपरीत) जो कि सीमित है 32-बिट STREX, __strex आंतरिक उपयोग किए गए सूचक आकार के आधार पर एक STREXB, STREXH, या STREX का उपयोग करता है)
Supercat

4

ऐसा लगता है कि आपको अपने MCU सॉफ़्टवेयर में कुछ परिपत्र बफ़र्स या FIFOs की आवश्यकता है। पढ़ने और लिखने के लिए सरणी में दो सूचकांकों या बिंदुओं को ट्रैक करके, आप बिना किसी हस्तक्षेप के अग्रभूमि और पृष्ठभूमि दोनों को एक ही बफर तक पहुंच सकते हैं।

अग्रभूमि कोड किसी भी समय परिपत्र बफर को लिखने के लिए स्वतंत्र है। यह लिखने के सूचक पर डेटा सम्मिलित करता है, फिर लेखन सूचक को बढ़ाता है।

बैकग्राउंड (इंटरप्ट हैंडलिंग) कोड रीड पॉइंटर से डेटा की खपत करता है और रीड पॉइंटर को बढ़ाता है।

जब पढ़ने और लिखने के संकेत समान होते हैं, तो बफर खाली होता है और पृष्ठभूमि प्रक्रिया कोई डेटा नहीं भेजती है। जब बफ़र भर जाता है, तो अग्रभूमि प्रक्रिया किसी भी अधिक लिखने से इनकार करती है (या आपकी ज़रूरतों के आधार पर पुराने डेटा को अधिलेखित कर सकती है)।

पाठकों और लेखकों को अपवित्र करने के लिए परिपत्र बफ़र्स का उपयोग करना बाधित करने की आवश्यकता को दूर करना चाहिए।


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

3
@ ईमिल: उन्हें होना नहीं है। क्लासिक सर्कुलर बफर के लिए, दो पॉइंटर्स और एक "बेकार" स्लॉट के साथ, यह आवश्यक है कि मेमोरी राइट परमाणु और क्रम में लागू हो। पाठक एक सूचक का मालिक है, लेखक दूसरे का मालिक है, और, हालांकि वे दोनों या तो सूचक पढ़ सकते हैं, केवल सूचक का मालिक ही अपने सूचक को लिखता है। उस बिंदु पर, आप सभी को परमाणु-क्रम लिखते हैं।
जॉन आर। स्ट्रॉहम

2

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


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