embedded - रास्पबेरी पीआई पर एआरएम घड़ी की गति




arm low-level (4)

रास्पबेरी पीआई संगठन के डाउनलोड पृष्ठों से आर्क लिनक्स संदर्भ वितरण के साथ प्रदान किए गए बूट लोडर को देखने के लिए उपयुक्त हो सकता है। मुझे पता नहीं है कि यह एक कार्यशील विकल्प है, लेकिन इसके config.txt में लाइन शामिल है

#arm_freq=800

यहां तक ​​कि लोगों की रिपोर्टों में पाई को खत्म कर दिया गया है - घड़ी की शुरुआत के बारे में इतनी जानकारी कहीं बाहर है, कहीं

बेर-मेटल चल रहा है (कोई ऑपरेटिंग सिस्टम नहीं, कोई लिनक्स नहीं)

चश्मा का अर्थ है कि एआरएम 700MHz चला सकता / चलाता है, सिस्टम घड़ी मैनुअल से मेल खाता है और 250 मेगाहर्ट्ज पर चलती प्रतीत होती है। एआरएम पर साधारण परीक्षण यह दर्शाता है कि यह वही कर रहा है, उदाहरण के लिए अनुदेश कैश के साथ

test:
  subs r0,r0,#1
  bne test

और शाखा पर हावी होने के लिए एसईसी की संख्या में भिन्नता है, यह 250 मेगाहर्टज के बॉल पार्क में है, लेकिन 700 मेगाहर्ट्ज से बहुत दूर है।

मैं वहाँ एक phy सेटिंग है कि मैं एआरएम घड़ी गुणा के लिए datasheet में नहीं देख रहा हूँ?

संपादित करें:

शायद मेरी धारणाएं दोषपूर्ण हैं ...

.globl ARMTEST0
ARMTEST0:
    subs r0,r0,#1
    bne ARMTEST0
    bx lr

.globl ARMTEST1
ARMTEST1:
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    bne ARMTEST1
    bx lr

.globl ARMTEST2
ARMTEST2:
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    subs r0,r0,#1
    bne ARMTEST2
    bx lr

.globl ARMTEST3
ARMTEST3:
    subs r1,r0,#1
    subs r2,r1,#1
    subs r3,r2,#1
    subs r0,r3,#1
    subs r1,r0,#1
    subs r2,r1,#1
    subs r3,r2,#1
    subs r0,r3,#1
    subs r1,r0,#1
    subs r2,r1,#1
    subs r3,r2,#1
    subs r0,r3,#1
    subs r1,r0,#1
    subs r2,r1,#1
    subs r3,r2,#1
    subs r0,r3,#1
    bne ARMTEST3
    bx lr

सिस्टम टाइमर हेक्स प्रति फ़ंक्शन में टिक्सेस (स्टॉपवॉच, आदि के बारे में सत्यापित 250 MHz सिस्टम टाइमर)।

02DB6DF7 ARMTEST0
02DB6E1C ARMTEST0
00AB6E2A ARMTEST1
00836E46 ARMTEST2
00836E2A ARMTEST3

जो देता है:

ARMTEST0
0x01000000 subs instructions
0x01000000 bne  instructions
0x02000000 instructions
1.43 clocks per instruction.  175Mips.

ARMTEST1
0x01000000 sub instructions
0x00200000 bne instructions
0x01200000 instructions
1.68 instructions per clock. 420Mips

ARMTEST2
0x01000000 sub instructions
0x00100000 bne instructions
0x01100000 instructions
2.07 instructions per clock. 517Mips

ARMTEST3
0x01000000 sub instructions
0x00100000 bne instructions
0x01100000 instructions
2.07 instructions per clock. 517Mips

ARM11 सुपर-स्केलर प्रति घड़ी एक से ज्यादा निर्देश अनपेक्षित नहीं है मैं और अधिक की उम्मीद करेंगे। केवल रजिस्टर 0 का उपयोग कर पाइप के साथ गड़बड़ हो सकती है क्योंकि आपको अगले निष्पादित करने से पहले एक अनुदेश के एक परिणाम का इंतजार करना पड़ता है। मुझे परीक्षण 2 और 3 के बीच अंतर देखने की उम्मीद थी, शायद एक और बुरा धारणा। शायद इसकी वास्तव में 500Mhz नहीं 700? लिनक्स स्रोतों में एक पंक्ति है जो 500000000 घड़ी का उल्लेख करती है।

static struct clk osc_clk = {
#ifdef CONFIG_ARCH_BCM2708_CHIPIT
    .rate = 27000000,
#else
    .rate = 500000000,  /* ARM clock is set from the VideoCore booter */
#endif
};

/* warning - the USB needs a clock > 34MHz */

#ifdef CONFIG_MMC_BCM2708
static struct clk sdhost_clk = {
#ifdef CONFIG_ARCH_BCM2708_CHIPIT
    .rate = 4000000,    /* 4MHz */
#else
    .rate = 250000000,  /* 250MHz */
#endif
};
#endif

शायद मुझे क्या लगता है कि मैंने 250 मेगाहर्ट्ज के रूप में मापा है 270 और एआरएम 500 मेगाहर्टज है?

EDIT2 ... DOH

यह एक महान पाइपलाइन सुधार नहीं था, यह बेहतर है:

.globl ARMTEST3
ARMTEST3:
    subs r0,r0,#1
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    subs r0,r0,#1
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    subs r0,r0,#1
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    subs r0,r0,#1
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    subs r0,r0,#1
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    subs r0,r0,#1
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    subs r0,r0,#1
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    subs r0,r0,#1
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    bne ARMTEST3
    bx lr


    ARMTEST3
    0x01000000 sub instructions
    0x08000000 nop instructions
    0x00100000 bne instructions
    0x09100000 instructions
    037000D7 system clocks
    2.64 instructions per clock. 659Mips

मैं config.txt को पहले काम करने में विफल रहा, फिर एक लिनक्स एसडी कार्ड को फिर से बना, यह पता लगाने के लिए कि / boot / निर्देशिका वास्तव में वसा विभाजन है जिसमें gpu बूट फाइल और kernel.img बांह बूट शामिल है फ़ाइल। तो नहीं, एक बूट / डीआईआर में, लेकिन उसी डायर में .bin और .elf और .img फ़ाइल config.txt बनाते हैं और arm_freq = कुछ बनाते हैं, तो जीपीयू बूटलोडर पीएलएल गुणक में संशोधन करता है ताकि जब हाथ लग जाए यह उस गति पर है मुझे अभी भी प्रति सेकंड 700 मिलियन से अधिक अनुदेशों की अपेक्षा है और मुझे नहीं लगता है कि, मुझे लगता है कि कोशिश करनी चाहिए।


संभवतः इस तथ्य के कारण कि रास्पबेरी पी फाउंडेशन में मुख्यतः ब्रॉडकॉम कर्मचारी शामिल हैं, उन्होंने एक ब्रॉडकॉम डिवाइस को सीपीयू के रूप में चुना है। हालांकि इसका मतलब है कि आरपीआई बहुत कम कीमत पर अपेक्षाकृत उच्च प्रदर्शन एआरएम 11 प्राप्त करता है, दुर्भाग्य से ब्रॉडकॉम केवल चिप के पूर्ण विवरणों को लाइसेंस प्रदान करता है, इसलिए आपको पीएलएल की स्थापना की जानकारी सार्वजनिक रूप से उपलब्ध न हो, और मुझे संदेह है कि ब्रॉडकॉम द्वारा प्रदान किए गए "फ़र्मवेयर" बायनेरिज़ में एम्बेडेड


आप अपने रास्पबेरी पी को ट्यून कर सकते हैं और उदाहरण के एआरएम घड़ी की गति और राम / वीडियो राम को बदल सकते हैं। एक अच्छा ट्यूटोरियल


मुझे पता है कि इस बारे में पूछा गया था और कुछ समय पहले जवाब दिया था, लेकिन मैंने इस सवाल के लिए एक त्वरित जवाब पाने की उम्मीद की है। अगर किसी और को यह जानना चाहिये कि मैं इसे अपने बेअर मेटल सेटअप के लिए कैसे तय किया है मुझे जोड़कर RPI3 पर सफलता मिली

force_turbo = 1
arm_freq = 1200

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