2011-07-19 10 views
5

CMSIS परिभाषाओं जीसीसी के लिए आप कुछ इस तरह पा सकते हैं में:डाटा मेमोरी बैरियर CMSIS पुस्तकालयों में (डीएमबी) के लिए कॉर्टेक्स- M3s

static __INLINE void __DMB(void) { __ASM volatile ("dmb"); } 

मेरे सवाल यह है: अगर यह होता है क्या उपयोग करता है एक स्मृति बाधा क्लॉबर सूची में "स्मृति" घोषित नहीं करें?

क्या यह core_cm3.h में एक त्रुटि है या क्या कोई कारण है कि बिना किसी अतिरिक्त सहायता के जीसीसी को सही तरीके से व्यवहार करना चाहिए?

+1

अच्छा सवाल। ध्यान दें कि लिनक्स 'मेमोरी' क्लॉबर का उपयोग करता है: http://lxr.free-electrons.com/source/arch/arm/include/asm/system.h?v=2.6.39#L135 – ninjalj

+1

@ निंजालज: धन्यवाद संपर्क। (त्वरित googling पर नहीं आया) – jpc

उत्तर

5

मैंने जीसीसी 4.5.2 (एलटीओ के साथ निर्मित) के साथ कुछ परीक्षण किया। अगर मैं इस कोड संकलन: arm-none-eabi-objdump -d dmb.o से

static inline void __DMB(void) { asm volatile ("dmb"); } 
static inline void __DMB2(void) { asm volatile ("dmb" ::: "memory"); } 

char x; 

char test1 (void) 
{ 
    x = 15; 
    return x; 
} 

char test2 (void) 
{ 
    x = 15; 
    __DMB(); 
    return x; 
} 

char test3 (void) 
{ 
    x = 15; 
    __DMB2(); 
    return x; 
} 

arm-none-eabi-gcc -Os -mcpu=cortex-m3 -mthumb -c dmb.c का उपयोग कर, तो मैं मिलता है इस:

00000000 <test1>: 
    0: 4b01  ldr r3, [pc, #4] ; (8 <test1+0x8>) 
    2: 200f  movs r0, #15 
    4: 7018  strb r0, [r3, #0] 
    6: 4770  bx lr 
    8: 00000000 .word 0x00000000 

0000000c <test2>: 
    c: 4b02  ldr r3, [pc, #8] ; (18 <test2+0xc>) 
    e: 200f  movs r0, #15 
    10: 7018  strb r0, [r3, #0] 
    12: f3bf 8f5f dmb sy 
    16: 4770  bx lr 
    18: 00000000 .word 0x00000000 

0000001c <test3>: 
    1c: 4b03  ldr r3, [pc, #12] ; (2c <test3+0x10>) 
    1e: 220f  movs r2, #15 
    20: 701a  strb r2, [r3, #0] 
    22: f3bf 8f5f dmb sy 
    26: 7818  ldrb r0, [r3, #0] 
    28: 4770  bx lr 
    2a: bf00  nop 
    2c: 00000000 .word 0x00000000 

यह स्पष्ट है कि __DBM() केवल dmb अनुदेश सम्मिलित करता है और यह DMB2() लेता है वास्तव में करने के लिए मजबूर करने के लिए संकलक रजिस्टरों में कैश किए गए मानों को फ्लश करें।

मुझे लगता है कि मुझे एक सीएमएसआईएस बग मिला।

2

आईएमएचओ सीएमएसआईएस संस्करण सही है।

पीटना सूची में स्मृति के बिना बाधा अनुदेश इंजेक्शन को प्राप्त होता है कि वास्तव में क्या यह करने के लिए माना जाता है:

हैं पर "एक्स" चर पिछले लिखने तो बफ़र था यह प्रतिबद्ध है। यह उपयोगी है, उदाहरण के लिए, यदि आप "एक्स" पते को डीएमए पते के रूप में पास करने जा रहे हैं, या यदि आप एमपीयू सेट अप करने जा रहे हैं।

इसका "x" लौटने पर कोई प्रभाव नहीं पड़ता है (यदि आप स्मृति बाधा को छोड़ देते हैं तो भी आपका प्रोग्राम सही होने की गारंटी है)।

पीटना सूची में स्मृति डालने से दूसरी ओर, इससे पहले कि आप उदाहरण की तरह स्थितियों में प्रभाव का कोई प्रकार है (डीएमए, MPU ..)।

बाद के मामले में एकमात्र अंतर यह है कि यदि आपके पास उदाहरण के लिए "str" ​​के बाद "x" के मान को संशोधित करने वाला एक आईएसआर है, तो वह मान वापस लौटाया जाएगा जो आईएसआर द्वारा संशोधित मान है, क्योंकि क्लॉबर ने संकलक को फिर से पंजीकरण करने के लिए स्मृति से पढ़ने के लिए प्रेरित किया। लेकिन यदि आप यह चीज़ प्राप्त करना चाहते हैं तो आपको "अस्थिर" चर का उपयोग करना चाहिए।

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

+1

लेकिन आसपास के निर्देशों को पुन: व्यवस्थित करने के लिए संकलक मुक्त नहीं है ताकि बाधा निष्पादित होने पर "x" लिखने पर कैश नहीं मारा जा सके? मैं मेमोरी क्लॉबर चाहता था ताकि संकलक को चर (संभवतः कैश) मेमोरी को चर करने के लिए मजबूर किया जा सके, और उसके बाद कैश फ्लश को मजबूर करने के लिए बाधा। – jpc

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