2011-12-15 13 views
5

मेरे पास एक कॉन्फ़िगरेशन संरचना है जिसे मैं एआरएम कॉर्टेक्स एम 3 के आंतरिक फ्लैश पर सहेजना चाहता हूं। विनिर्देशों के अनुसार, आंतरिक फ्लैश में डेटा सहेजना, 32 बिट के साथ गठबंधन किया जाना चाहिए। क्योंकि मेरे पास बहुत सारी बूलियन है, और मेरी संरचना में वर्ण हैं, मैं 8 बिट्स स्टोर करने के लिए 32 बिट्स का उपयोग नहीं करना चाहता ... मैंने __packed प्रीप्रोसेसर प्राग्मा का उपयोग करके संरचना को पैक करने का निर्णय लिया, फिर जब मैं इसे पूरी संरचना के रूप में सहेजता हूं , मुझे बस यह सुनिश्चित करना है कि संरचना का आकार 4 (4 बाइट्स = 32 बिट्स) द्वारा विभाजित है, यदि आवश्यक हो तो मैं इसे पैडिंग बाइट जोड़कर करता हूं। वर्तमान में, विकास के दौरान मैं संरचना को बहुत बदलता हूं, और इसे 32 बिट्स के साथ गठबंधन करने के लिए, मुझे हर समय पैडिंग बाइट्स को बदलने की ज़रूरत है। वर्तमान में, संरचना चित्र इसआंतरिक फ्लैश मेमोरी में सी संरचना का संरेखण

typedef __packed struct 
{ 
uint8_t status; 
uint16_t delay; 
uint32_t blabla; 
uint8_t foo[5]; 
uint8_t padding[...] // this has to be changed every time I alter the structure. 
} CONFIG; 

वहाँ मैं क्या कर रहा हूँ प्राप्त करने के लिए एक बेहतर तरीका है देखने के लिए? मैं एंबेडेड प्रोग्रामिंग में काफी नया हूं, और मैं यह सुनिश्चित करना चाहता हूं कि मैं गलती नहीं कर रहा हूं।

संपादित करें: कृपया ध्यान दें। डेटा आंतरिक फ्लैश के अंत में एक समान होती है, तो गद्दी काम नहीं करेगा ...

+1

मुझे विश्वास था कि आपकी समझ सही नहीं है। फ्लैश मेमोरी में निर्देशों को गठबंधन किया जाना चाहिए और यह संकलक द्वारा गारंटी दी जाएगी। लेकिन फ्लैश में संग्रहीत डेटा को भी अनियंत्रित किया जा सकता है जिसे आर्म कॉर्टेक्स एम 3 कोर द्वारा प्रबंधित किया जा सकता है। आप किस कंपनी का एमसीयू उपयोग करते हैं? –

उत्तर

4

को छोड़ते हुए शायद यह एक विचार है:

typedef __packed struct { 
    uint8_t status; 
    uint16_t delay; 
    uint32_t blabla; 
    uint8_t foo[5]; 
} CONFIG; 

typedef __packed struct { 
    CONFIG cfg; 
    uint8_t padding[4 - (sizeof(CONFIG) % 4)] 
} CONFIGWRAPPER; 
+0

असल में जब मैं इसके बारे में सोचता हूं। यदि यह पहले ही गठबंधन है तो हम – stdcall

4

समाधान 1: आप इसे एक संघ के अंदर डाल सकता है

union 
{ 
    CONFIG config; 
    uint8_t total_size[32]; 
} my_union; 
+0

कुछ भी नहीं के लिए 4 बाइट जोड़ते हैं, यह कहना दिलचस्प है कि आकार (CONFIG) कुल_ आकार के आकार से कम है। और मैंने संघ में कॉन्फ़िगरेशन सेट किया है। आकार (my_union) का आकार क्या होगा? – stdcall

+0

यदि 'CONFIG'' total_size' से छोटा है तो 'sizeof (my_union)' 'total_size' का आकार होगा, ठोस रूप से 32. – Lindydancer

1

समाधान 2: आपके संरचना और पात्रों की एक सरणी युक्त आप config डेटा फ्लैश के अंत से 32 जैसे किसी विशिष्ट स्थान पर रखने के लिए IAR-विशिष्ट सुविधा #pragma location इस्तेमाल कर सकते हैं। इस तरह आप पैड को किसी भी तरह से संरचना की जरूरत नहीं होगी:

/* Fictitious end of flash location. */ 
#pragma location=0x1234FFE0 
struct [... your struct goes here ...] 
3

सबसे पहले, पैक संरेखण आमतौर पर है, परहेज किया जाता है, तो आप उनके प्राकृतिक सीमाओं के अनुरूप नहीं डेटा के साथ खत्म, कुछ सीपीयू सिर्फ एक जारी करेगा जब आप उन्हें एक्सेस करने का प्रयास करते हैं तो जाल।

सबसे पहले, सदस्यों को एक क्रम में संग्रहित करें ताकि संकलक संरेखण के लिए अंतराल नहीं जोड़ता (या यदि ऐसा होता है, तो यह अंत में जोड़ता है)। यदि आप कर सकते हैं, तो 1. सदस्य के पास संरेखण आवश्यकता है जो आप चाहते हैं - क्योंकि यह संकलक को कम से कम उस संरेखण को प्रदान करने के लिए मजबूर करता है जो बहुत संरेखण करता है।

इसके बारे में कुछ जानकारी चाहिए कि आपके प्लेटफ़ॉर्म और कंपाइलर की संरेखण आवश्यकताओं, उदाहरण के लिए गद्दी सरणी से छुटकारा मिलता है, और बदल

typedef struct 
{ 
uint8_t status; 
uint16_t delay; 
uint32_t blabla; 
uint8_t foo[5]; 
uint8_t padding[...]; 
} CONFIG; 

को

typedef struct 
{ 
uint32_t blabla; 
uint16_t delay; 
uint8_t status; 
uint8_t foo[5]; 
} CONFIG; 

फिर संकलक है कि इस struct (4 बाइट aligment की जरूरत है इस मामले में बता यह संभावना पहले से ही होगा पहले सदस्य 4 बाइट के रूप में या अधिक संरेखण आवश्यकता)। जैसे जीसीसी उपयोग attribute((__aligned__(4))

फिर एक छोटा परीक्षण प्रोग्राम लिखें जो आपके पास संरेखण आवश्यकताओं को मान्य करता है (जो केवल एक छोटा प्रोग्राम है जो आपकी संरचना पर sizeof() और alignof() का उपयोग करता है), यह आपको यह भी बताएगा कि क्या आप गठबंधन करने के लिए संरचना के लिए निर्देश जोड़ने की जरूरत है। उस प्रोग्राम को बिल्ड/पैकेजिंग के हिस्से के रूप में चलाएं।

+0

उत्कृष्ट उत्तर और अच्छी तरह से कहा गया है। नमूना परीक्षण कार्यक्रम आपकी सफलता या विफलता के लिए महत्वपूर्ण है, यदि आप संकलन डोमेन में स्ट्रक्चर के साथ क्या करने की कोशिश कर रहे हैं (हार्डवेयर को संकलित डोमेन मानें) तो आप इस चरण को नहीं छोड़ सकते हैं। –

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