2015-01-05 3 views
7

यह प्रश्न एम्बेडेड नियंत्रकों के बारे में है। मैं मेमोरी में एक कॉन्स एरे शुरू करना चाहता हूं। लेकिन इस सरणी को मेमोरी में संग्रहीत करते समय मैं इसे विशिष्ट स्थान पर 0x8000 कहता हूं। इस तरह मैं कोड की कुछ मात्रा पर कब्जा करना चाहता हूं ताकि बाद में रन टाइम के दौरान मैं मिटा सकता हूं वह हिस्सा और इसे अपने अन्य उद्देश्य के लिए उपयोग करें। मूल रूप से मैं यह करने के लिए चाहते हैं:मेमोरी में विशिष्ट पते पर एक कॉन्स सरणी कैसे प्रारंभ करें?

const unsigned char dummy_string[] = "This is dummy string"; 

लेकिन dummy_string का पता मेरी hand.like मैं प्रदान कर सकते हैं जो कुछ भी पता मैं इसे करना चाहते हैं में होना चाहिए।

+1

सी या सी ++? उत्तर प्रत्येक के लिए अलग होगा। – cdhowie

+1

"और इसे अपने अन्य उद्देश्य के लिए उपयोग करें" - कोड इंजेक्शन? –

+0

आपके पते को निर्दिष्ट करने के लिए 'mmap()' का उपयोग कर सकते हैं। पते हालांकि वर्चुअल हैं। – Rohan

उत्तर

1

पोर्टेबल तरीका है पता

const unsigned char dummy_string[] = "This is dummy string"; 
    unsigned char* p = (unsigned char*)0x1234; 

    strcpy(p, dummy_string); 

गैर पोर्टेबल तरह से स्थापित करने के लिए सूचक का उपयोग करने के संकलक/मंच-विशिष्ट निर्देशों का उपयोग करने के लिए पता सेट करने के लिए है। उदाहरण के लिए, AVR एक पर जीसीसी के लिए की तरह

int data __attribute__((address (0x1234))); 
+0

पी हस्ताक्षर किए गए चार के लिए सूचक है और यह रैम पता शुरू कर रहा है। मैं बस ऐसा करना चाहता हूं लेकिन पी को फ्लैश मेमोरी एड्रेस को इंगित करना चाहिए। और आप 0x1234 को टाइप करने के बिना टाइपिंग को कैसे निर्दिष्ट कर सकते हैं? –

+0

@GurigLION ठीक है, क्या आप फ़्लैश पता जानते हैं? क्या आप इसे पढ़ सकते हैं? क्या आप 'char * p = (char *) FLASH_ADDRESS जैसे कुछ कर सकते हैं; cout << * p; ' –

+0

हाँ फ्लैश पता 0x8000 है। मुझे इसे नियंत्रक के डेटा शीट से मिला है। और मैं जो भी कहता हूं वह कर सकता हूं। लेकिन बिंदु यह है कि मेरे पास फ्लैश मेमोरी में 0x8000 स्थान हो सकता है और RAM नहीं जो भी डेटा चाहते हैं। –

0

सी और/या सी ++ से कुछ, बस जिस तरह से आप प्रश्न में लिखा है उपयोग कर सकते हैं। संभावित रूप से extern को C++ के const -is- static -by-डिफ़ॉल्ट नियम को ओवरराइड करने के लिए जोड़ें।

फिर कोड कोड फ्लैश/रोम में किसी विशेष पते पर उस प्रतीक को मजबूर करने के लिए आपको एक लिंकर निर्देश (.ld फ़ाइल शायद) का उपयोग करने की आवश्यकता होगी।

या, आप निर्माण प्रक्रिया प्रोग्राम के बाहर मेमोरी को कुछ मान सकते हैं, और आपका कोड बस इसे एक्सेस करता है। फिर आप कुछ ऐसा कर सकते हैं:

inline const unsigned char* dummy_string() { return (const unsigned char*)0x8000; } 
+0

के लिए रनटाइम CPU control.btw धन्यवाद की आवश्यकता होगी, लेकिन यह सिर्फ dxy_string को 0x8000 पता देगा। अगर मैं 0x8000 पर कुछ डेटा और उसके बाद के स्थानों को छोड़ना चाहता हूं? –

+0

@GurigLION: आप पॉइंटर अंकगणितीय का उपयोग कर उसके बाद स्थानों तक पहुंच सकते हैं ... –

4

वैरिएबल को नामित मेमोरी सेक्शन में रखने के लिए एक प्रज्ञा कथन का प्रयोग करें। फिर वांछित पते पर नामित स्मृति अनुभाग का पता लगाने के लिए लिंकर कमांड स्क्रिप्ट का उपयोग करें।

मैं कुछ MSP430 प्रलेखन के माध्यम से स्कैन और मैं इसे कुछ इस तरह काम कर सकते हैं लगता है ... स्रोत कोड उपयोग #pragma DATA_SECTION में

#pragma DATA_SECTION(dummy_string, ".my_section") 
const unsigned char dummy_string[] = "This is dummy string"; 

फिर लिंकर में .cmd फ़ाइल ऐसा कुछ करें।

MEMORY 
{ 
    ... 
    FLASH : origin = 0x8000, length = 0x3FE0 
    ... 
} 

SECTIONS 
{ 
    ... 
    .my_section : {} > FLASH 
    ... 
} 

यदि अनेक फ़्लैश में स्थित वर्गों तो शायद .my_section पहले लिस्टिंग की गारंटी देगा कि यह फ़्लैश की शुरुआत में स्थित है कर रहे हैं। या शायद आपको एक विशेष नामित मेमरी क्षेत्र, जैसे कि MYFLASH को परिभाषित करना चाहिए, जिसमें केवल .my_section होगा। विशिष्ट पते पर अनुभागों का पता लगाने के तरीके के बारे में अधिक विचारों के लिए लिंकर कमांड मैन्युअल पढ़ें।

+0

क्या मुझे फ्लैश भाग भी संशोधित करना चाहिए? –

+0

हाय बहुत बहुत धन्यवाद। मुझे यह भी मिला: कॉन्स्टिनेटेड char flash_mem [1024] __attribute __ ((स्थान (0x8000)); –

+0

फ्लैश मूल और मेरे उत्तर में लंबाई सिर्फ उदाहरण हैं। मुझे नहीं पता कि वे मूल्य आपके बोर्ड के लिए उपयुक्त हैं या नहीं। लिंकर .cmd फ़ाइल में स्मृति {} ब्लॉक मान्य स्मृति क्षेत्रों को परिभाषित करता है। स्मृति क्षेत्रों को ओवरलैप नहीं करना चाहिए। यदि आप मूल फ्लैश क्षेत्र को दोफ्लैश और फ्लैश नामक दो क्षेत्रों में विभाजित करते हैं तो हां, आपको उस भाग को हटाने के लिए फ्लैश क्षेत्र को बदलना चाहिए जिसे आप MYFLASH को असाइन कर रहे हैं ताकि वे ओवरलैप न हों। – kkrambo

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