रास्पबेरी पाई 2 में कोर 1,2,3 कैसे शुरू करें


10

मैंने एक नंगे धातु मल्टी कोर उदाहरण लिखा है।

कोड, सर्किट आरेख यहाँ है - https://github.com/jeffreyantony/multipi/tree/master/ample/01

मेरे उदाहरण में, रास्पबेरी पाई के जीपीआईओ पिन से जुड़े 3 एलईडी हैं। रास्पबेरी पाई में पूरी तरह से 4 कोर हैं। प्रत्येक कोर को इसकी संबंधित एलईडी को ब्लिंक करने के लिए सौंपा गया है।

मैंने नीचे दिए गए पते में प्रत्येक कोर द्वारा कोड का पता लिखा है 0x4000009C कोर 1 के लिए 0x400000AC कोर 2 के लिए 0x400000BC कोर 3 के लिए

कोड संकलित करने के बाद, केवल कोर 1 को दिया गया एलईडी ब्लिंक कर रहा है (इस उदाहरण के अनुसार, पीले एलईडी)। अन्य नहीं हैं।

इसका मतलब है कि कोर 2 और 3 के लिए कोड नहीं चल रहे हैं (चूंकि अन्य एलईड निमिष नहीं हैं)। मैंने यह भी पाया कि सभी कोर शुरू करने के बाद कोड भी नहीं चल रहा है यानी core0_submain () - इस फ़ंक्शन को रास्पबेरी पाई पर अधिनियम एलईडी को झपका देना चाहिए

क्या कोई मुझे बता सकता है कि समस्या क्या है? क्या ऐसा इसलिए है क्योंकि सभी 4 कोर एक ही GPIO रजिस्टर में लिखने की कोशिश करते हैं और केवल कोर 1 ही लेखन में जीत रहा है?

मैंने " विशेषता ((नग्न))) जोड़ने की कोशिश की ?" core0_submain () के लिए लेकिन कोई फायदा नहीं हुआ।

मैं https://launchpad.net/gcc-arm-embedded से टूलचिन का उपयोग कर रहा हूं

एक बार फिर से कोड - https://github.com/jeffreyantony/multipi/blob/master/Example_01/ainain.c

Makefile - https://github.com/jeffreyantony/multipi/blob/master/Example_01/Makefile

अपडेट 20 अक्टूबर 2015 : मैंने JTAG के लिए समर्थन जोड़ा है। लेकिन डीबग इंटरफ़ेस प्राप्त करने में सफल नहीं
अद्यतन 25 अक्टूबर 2015 : मुद्दा तय हो गया है। उत्तर देखो।

सर्किट आरेख यहाँ छवि विवरण दर्ज करें


यह वास्तव में अच्छा लगता है। मैं इस पर गौर करूंगा। मेरा मतलब है, रास्पियन में कुछ सॉफ़्टवेयर हो सकते हैं जो केवल 1 कोर का उपयोग करते हैं जब तक कि दूसरों को ऊर्जा या कुछ और बचाने की आवश्यकता न हो ...
काचमेंनस

जवाबों:


6

अद्यतन 25 अक्टूबर 2015:

रास्पबेरी पाई मंच ने मुझे जवाब दिया ।

  1. -Nostdlib का उपयोग करते समय _start की अवधारणा नहीं है

  2. पहले निष्पादित की जाने वाली कोड लिंकर को पारित करने वाली पहली फ़ाइल होनी चाहिए।

  3. यदि बेहतर नियंत्रण की आवश्यकता है, तो कोड को एक init अनुभाग में रखा जाना चाहिए और लिंकर को इस अनुभाग को कॉपी करने के लिए कहें 0x8000

समर्थन के लिए धन्यवाद। जीएनयू सी कंपाइलर के बारे में बहुत कुछ सीखा।

अपडेट 24 अक्टूबर 2015:

जब मैंने मेकफाइल में संकलन के लिए दी गई फाइलों के क्रम को बदल दिया, तो मुझे अनुकूलन के साथ सही क्रम (यानी 0x8000हमारे पास _startफ़ंक्शन है) मिला -O2। लेकिन अभी भी _startप्रतीक के संबंध में मेरे नीचे के स्टैकओवरफ़्लो प्रश्न अभी तक हल नहीं हुए हैं। में नया कोड चेक किया गया है।

मुझे कुछ सफलता मिली है। नए कोड को जीथब में जांचा गया है

उदाहरण पूरी तरह से नहीं चल रहा है। संकलन के साथ कुछ मुद्दे हैं। मैं प्रत्येक को समझाऊंगा:

  1. वास्तव में मुझे उम्मीद थी कि _startमेरे कस्टम स्टार्ट से प्रतीक लिया जाएगा। लेकिन ऐसा नहीं था। इस वजह से स्टैक पॉइंटर कॉन्फ़िगर नहीं किया गया था और मेन टू जंप नहीं हुआ था।

मैंने पहले ही इस बारे में एक सवाल पूछा है । लेकिन मैंने ज्यादा प्रगति नहीं की है। इसलिए मैंने मुख्य फ़ंक्शन में स्टैक पॉइंटर को लोड करने के लिए एक इनलाइन असेंबली को जोड़ा।

  1. लेकिन फिर भी कोड नहीं चला। जब मैंने असेंबली लिस्टिंग की जाँच की, तो मैंने पाया कि 0x8000रास्पबेरी पाई का पता (जहां निष्पादन शुरू होता है) कोर 1 के लिए कोड है - void core1_main(void)। मेरी धारणा यह थी कि 0x8000वहाँ होगा _start(जो शुरू से ही नहीं है। फ़ाइल संकलन के लिए नहीं ली गई है) या कम से कम शून्य मुख्य (शून्य) फ़ंक्शन। -O2जीसीसी के अनुकूलन के कारण ऐसा होता है । जीसीसी में, उच्च अनुकूलन स्तरों के साथ, फ़ंक्शंस फिर से चालू हो जाते हैं .. जब मैंने ऑप्टिमाइज़ेशन ( -O0) बंद कर दिया , तो पते पर 0x8000, मुख्य मौजूद था।

आप यहां फंक्शन रीक्रोडिंग के बारे में पढ़ सकते हैं

सारांश: वर्तमान कोड केवल एक ठीक है। मुख्य मुद्दा हल करने के लिए - Why _start को start.S से नहीं कहा जाता है? यदि यह तय है, तो पते 0x8000 _startपर आ जाएगा। इसके साथ हमें उच्च अनुकूलन के दौरान जीसीसी द्वारा किए गए फ़ंक्शन ऑर्डर के बारे में परवाह नहीं है।

सबूत के तौर पर मेरी तरफ से एक डेमो वीडियो भी है । यद्यपि कोड में एलईडी ब्लिंकिंग दरें अलग और आवधिक हैं, क्योंकि सभी कोर एक ही GPIO रजिस्टर में लिखने की कोशिश करते हैं, कुछ संघर्ष हैं जो एल ई डी को यादृच्छिक अंतराल पर झपकी का कारण बनता है।


स्क्रीन पर मल्टी कोर डेटा दिखाने के लिए वे कैसे करते हैं, यह जानने के लिए htop सोर्स कोड देखें और देखें।
पायोटर कुला

3
@ppumkin वह व्यर्थ है। htopएक * निक्स आधारित यूजरलैंड टूल है। लिनक्स पर यह कर्नेल के माध्यम से अपनी जानकारी प्राप्त करता है /proc। यह नंगे धातु का सामान है। क्वेरी करने के लिए कोई कर्नेल नहीं है।
गोल्डीलॉक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.