2012-06-11 12 views
6

मैं एलपीसी 1114, एक छोटा एआरएम (वास्तव में कॉर्टेक्स) लक्ष्य के लिए संकलित करता हूं। राम रोम की तुलना में बहुत सीमित है। मैं नवीनतम सलाहकार (कोडबेन्चलाइट) जीसीसी कंपाइलर (जीसीसी 4.6.3) का उपयोग करता हूं। मेरे पास कुछ स्थिर वस्तुएं हैं जिन्हें मैं रोम में रखना चाहता हूं। जहां तक ​​मैं नीचे कोड में ffx ऑब्जेक्ट को समझता हूं, उसे रोम (कोड) में समाप्त होना चाहिए, लेकिन इसके बजाय इसे डेटा में रखा गया है।मैं रोम में सी ++ कॉन्टेक्सप्रिप रखने के लिए जीसीसी कैसे प्राप्त कर सकता हूं?

class flop { 
    public: 
     int x; 
     constexpr flop(int x) : x(x){} 
}; 

extern constexpr flop ffx(1); 

मैं संकलक को पूर्व-गणना करने और इसे रोम में रखने के लिए कैसे संकलित कर सकता हूं?

या शायद मैं पूछना चाहिए:

  • मैं किसी भी तरह जी ++ संकलक ffx के लिए ROMable डेटा उत्पन्न करने
  • यदि हां, तो मेरी कोड इस
  • यदि ऐसा है तो के लिए सही है, जो जी के लिए है उम्मीद कर सकते हैं ++ संस्करण इस समर्थित है (मैं 4.6 का उपयोग करें, शायद मैं 4.7 की आवश्यकता है?)

============================= ==========

यह बगजिला एंट्री c++/49673 इंगित करता है कि मेरा एक ज्ञात समस्या है, शायद जीसीसी 4.7 में तय है। दुर्भाग्य से मैं निर्मित मेन्टर/कोडसॉररी का उपयोग करना पसंद करता हूं, जो अभी भी 4.6.3 पर है। तो मुझे लगता है कि मैं उस समय के लिए अटक गया हूँ। :(

+1

मुझे आर्किटेक्चर नहीं पता है, लेकिन यह * लिखने * * पढ़ने के लिए * स्मृति * लिखने की कोशिश करने के लिए ऑक्सीमोरोन नहीं लगता है? –

+1

@ जॉन डीबलिंग: ऐसा लगता है, लेकिन आप गलत होंगे। छोटे प्रोसेसर के पास अक्सर आपके प्रोग्राम को रोम में फ्लैश करने का एक तरीका होता है। –

+0

ऐसा कुछ भी नहीं है जो सी ++ मानक आपको देगा। हालांकि, आप यहां वर्णित अनुसार * स्कैटरलोडिंग * को आजमा सकते हैं: [स्मृति और कोड में डेटा ढूंढना (स्कैटरलोडिंग)] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc। पूछे जाने वाले प्रश्न/ka3558.html)। HTH! – dirkgently

उत्तर

1

# 2 अद्यतन: जीसीसी के साथ टेस्ट परिणाम 4.7.0

यह वास्तव में जीसीसी 4.7.0 में तय हो गई है आपका कोड निम्नलिखित कोडांतरक उत्पादन का उत्पादन:।

.file "constexpr.cpp" 
    .globl _ffx 
    .section .rdata,"dr" 
    .align 4 
_ffx: 
    .long 1 

जो आप शायद चाहते हैं। उन्नयन?

मुझे लगता है कि आपको इसके लिए एक प्लेटफॉर्म विशिष्ट समाधान की आवश्यकता है।देखें:

स्कैटरलोडिंग आपको पते के पूरे मानचित्र में फैले कई अलग-अलग कोड और डेटा क्षेत्रों में एक एप्लिकेशन को विभाजित करने की अनुमति देता है। इन क्षेत्रों का स्थान भार समय और रन टाइम के बीच भिन्न हो सकता है:

  1. लोड क्षेत्र में एप्लिकेशन द्वारा उपयोग किए जाने वाले एप्लिकेशन कोड और/या डेटा को पावर-ऑन/लोड टाइम (आमतौर पर रोम) पर उपयोग किया जाता है।

इसके बजाय अकेले जीसीसी पर भरोसा करने की, जैसा कि ऊपर दिए गए लिंक में सुझाव दिया armlink का उपयोग करने के लिए प्रयास करें।

अपडेट: मैंने आपके द्वारा नोट की गई जीसीसी बग देखी है। एलएलवीएम/मिनजीडब्ल्यू समान रूप से निराशाजनक है। हालांकि, मैं जीसीसी 4.6 के साथ चारों ओर खेल रहा है और यहाँ कुछ मुझे लगता है कि हो सकता है मदद आप:

struct Data 
{ 
    int i;  
}; 
constexpr Data getData() { return Data{1}; } 

बजाय एक ctor होने के हैं, तो आप एक constexpr समारोह है, और कोडांतरक उत्पादन उत्पन्न करने के लिए प्रयास करते हैं, आउटपुट आम तौर पर खाली होगा (.data खंड)।और अगर आप (वैश्विक क्षेत्र में) इस का उपयोग कुछ चर प्रारंभ करने में नीचे के रूप में: (इस g++ -std=c++0x -S कमांड लाइन के साथ है)

.file "constexpr.cpp" 
    .section .rdata,"dr" 
    .align 4 
__ZL3foo: 
    .long 1 

:

const Data foo = getData(); 

आप इस प्रकार एक विधानसभा मिल चाहते हैं। क्या ये तुम्हारे लिए कारगर है?

+0

ट्रेविस के उत्तर पर मेरी टिप्पणी देखें (और मैंने प्रश्न संपादित किया है): समस्या यह है कि संकलक रैम को आरक्षित कर रहा है और प्रारंभिक स्थिर डेटा उत्पन्न करने के बजाय प्रारंभिक कोड उत्पन्न कर रहा है। –

+0

@WoutervanOoijen: मुझे लगता है कि यह इस तथ्य से संबंधित हो सकता है कि एक सीटीओ एक विशेष सदस्य समारोह है और संकलक यह सुनिश्चित करने के लिए कोड का थोड़ा सा उत्पन्न करता है कि सब ठीक हो जाए। क्या अनुकूलन झंडे के साथ आउटपुट बदल गया है (मुझे नहीं लगता कि यह होगा लेकिन मुझे लगता है कि यह एक कोशिश के लायक है)। वैसे भी, मैंने अपनी नवीनतम जांच के साथ अपना जवाब अपडेट किया और यह आपकी मदद कर सकता है। – dirkgently

+0

हां, यह .rodata में समाप्त होता है, लेकिन यह मेरी बहुत मदद नहीं करता है: मैंने जो कोड दिखाया है वह एक सरलीकृत उदाहरण है, मुझे एक क्लास ऑब्जेक्ट की आवश्यकता होती है जिसमें एक गैर-तुच्छ (लेकिन अभी भी कंस्ट्रैक्स) सीटीओआर है। LLVM की जांच के लिए धन्यवाद। –

0

मेरे अनुभव में, const डेटा केवल पढ़ने के लिए अनुभाग में रखा गया है, इसलिए इस खंड में सभी डेटा रोम में जा सकते हैं (या फ्लैश में प्रोग्राम किया जा सकता है)।

जीसीसी लिंकर निर्देश फ़ाइल (* .ld), विभिन्न वर्गों को पते असाइन कर सकता है।

एक और विकल्प असेंबली भाषा में बड़ी डेटा संरचनाओं (जैसे फोंट) को रखना है। असेंबली भाषा सी या सी ++ लैंगेज कर से डेटा को सेगमेंट में आसान रख सकती है।

हमारा अगला उद्देश्य डेटा को हमारे निष्पादन योग्य से अलग करना है। यह निष्पादन योग्य को कम करता है और निष्पादन योग्य पर परीक्षण समय को कम करता है।

+0

एक कॉन्स ऑब्जेक्ट जिसमें एक (गैर-तुच्छ?) प्रारंभकर्ता है रोम में नहीं रखा जाएगा। यह संभव बनाने के लिए constexpr के कारणों में से एक है (जहां तक ​​मैं समझता हूं), लेकिन ऐसा लगता है कि मेरे लिए ऐसा नहीं लगता है।(constexpr एक सी ++ 0x09/11 निर्माण है जो (और तात्पर्य) कॉन्स से मजबूत है)। –

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