2011-03-24 19 views
5

मैं जानना चाहता हूं कि line को यह सुनिश्चित करना संभव है कि यह आईएसआर और मुख्य संदर्भ दोनों द्वारा निष्पादित किया जा सके। मैं एआरएम 9 (एलपीसी 313 एक्स) पर काम कर रहा हूं और रीयल व्यू 4 (armcc) का उपयोग कर रहा हूं।क्या यह परमाणु रूप से निष्पादित किया जा सकता है?

foo() { 
    .. 
    stack_var = ++volatile_var; // line 
    .. 
} 

मैं C166, सीधे विधानसभा कोड, आदि के लिए _atomic_ की तरह किसी भी दिनचर्या के लिए देख रहा हूँ मैं बीच में आता है को निष्क्रिय करने के लिए नहीं पसंद करेंगे।

बहुत बहुत धन्यवाद।

उत्तर

6

का शीघ्रता से अवलोकन से, C166 _atomic_ मैक्रो एक निर्देश है कि प्रभावी ढंग से मास्क निर्देश की एक निर्धारित संख्या की अवधि के लिए व्यवधान उपयोग करने के लिए लगता है। एआरएम आर्किटेक्चर में सीधे इसके अनुरूप कुछ भी नहीं है।

आप निश्चित रूप से महत्वपूर्ण अनुभाग के चारों ओर लॉक को लागू करने के लिए एसपीपी निर्देश (या रीयल व्यू टूलचेन में आंतरिक __swp आंतरिक) का उपयोग कर सकते हैं। एलडीआरएक्स/स्ट्रेक्स किसी अन्य उत्तर में उल्लिखित एआरएम आर्किटेक्चर संस्करण 5 में मौजूद नहीं है, जिसमें एआरएम 9 प्रोसेसर शामिल हैं। http://infocenter.arm.com/help/topic/com.arm.doc.dui0491c/CJAHDCHB.html और http://infocenter.arm.com/help/topic/com.arm.doc.dui0489c/Chdbbbai.html क्रमशः।

इस के चारों ओर एक साधारण ताला कार्यान्वयन (RealView toolchain का उपयोग) होगा:

{ 
    /* Loop until lock acquired */ 
    while (__swp(LOCKED, &lockvar) == LOCKED); 
    .. 
    /* Critical section */ 
    .. 
    lockvar = UNLOCKED; 
} 

हालांकि, ISR संदर्भ में गतिरोध को यह होगा नेतृत्व जब मुख्य धागा ताला पहना हुआ है।

मुझे लगता है कि ऑपरेशन के आसपास मास्किंग इंटरप्ट्स कम से कम बालों का समाधान होने की संभावना है, हालांकि यदि आपका मुख्य संदर्भ उपयोगकर्ता मोड में निष्पादित हो रहा है तो इसे लागू करने के लिए सिस्टम कॉल की आवश्यकता होगी।

+0

धन्यवाद unixsmurf। – JoeSlav

+0

आप एकाधिक/एकल पैटर्न के लिए पुराने एआरएम पर 'swpb 'के साथ' swpb 'मिश्रण कर सकते हैं। आईई, ** एकाधिक ध्वज सेटर्स ** और ** एकल ध्वज स्पष्ट **। चार 'बाइट्स 'या ** राज्य ** तक उपलब्ध हैं। –

8

नहीं, मुझे नहीं लगता कि आप कभी भी ++volatile_var परमाणु होने की उम्मीद कर सकते हैं, भले ही आपके पास असाइनमेंट न हो। इसके लिए एक उचित परमाणु आदिम का प्रयोग करें। यदि आपका कंपाइलर ऐसा एक्सटेंशन प्रदान नहीं करता है तो आप वेब पर उस के लिए आसानी से शॉर्ट इनलाइन असेंबलर पा सकते हैं। असेंबलर निर्देश हाथ पर परमाणु विनिमय के लिए ldrex और strex पर कॉल करते हैं, मुझे लगता है।

संपादित करें: ऐसा लगता है कि प्रश्न में पूछे जाने वाले विशिष्ट प्रोसेसर प्रकार इन निर्देशों को लागू नहीं करते हैं।

संपादित करें: निम्नलिखित जीसीसी के साथ काम करना चाहिए, एक और कंपाइलर के लिए शायद __asm__ भागों को अनुकूलित करना होगा।

inline 
size_t arm_ldrex(size_t volatile*ptr) { 
    size_t ret; 
    __asm__ volatile ("ldrex %0,[%1]\[email protected] load exclusive\n" 
        : "=&r" (ret) 
        : "r" (ptr) 
        : "cc", "memory" 
        ); 
    return ret; 
} 

inline 
_Bool arm_strex(size_t volatile*ptr, size_t val) { 
    size_t error; 
    __asm__ volatile ("strex %0,%1,[%2]\[email protected] store exclusive\n" 
        : "=&r" (error) 
        : "r" (val), "r" (ptr) 
        : "cc", "memory" 
        ); 
    return !error; 
} 

inline 
size_t atomic_add_fetch(size_t volatile *object, size_t operand) { 
    for (;;) { 
    size_t oldval = arm_ldrex(object); 
    size_t newval = oldval + operand; 
    if (arm_strex(object, newval)) return newval; 
    } 
} 
+0

अगर कोई कुछ प्रकाश डाल सकता है तो यह सहायक होगा, लेकिन निम्नलिखित परमाणु नहीं माना जाएगा? ADD r0, r0, # 1 एक मूल्य बढ़ाने के लिए ldrex/strex का उपयोग कैसे किया जा सकता है? मैं निश्चित रूप से कुछ याद कर रहा हूँ। – TheLoneJoker

+0

@ जेन्स, मैं इसके लिए थोड़ा नया हूं। क्या आप मुझे कुछ संसाधन/दस्तावेज़ीकरण के लिए इंगित कर सकते हैं जो कोड __asm__ अस्थिर ("ldrex% 0, [% 1] \ t @ लोड विशेष के बारे में अधिक जानकारी देता है \ n" : "= & r" (ret) : "r "(पीआरटी) :" सीसी "," मेमोरी " ); मैं अंदर के सामान के बारे में बहुत स्पष्ट नहीं हूं। – TheLoneJoker

+0

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

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