2012-06-04 10 views
2

Запуск голый металл (без операционной системы, ни Linux)ARM тактовая на Raspberry Pi

спецификации подразумевает ARM может/мчит 700 МГц, то SYS часы соответствует инструкции и, кажется, работает на частоте 250 МГц. Простые тесты на ARM предполагают, что он делает то же самое, например, с помощью кэша команд на

test: 
    subs r0,r0,#1 
    bne test 

И варьировать количество инструкций Subs доминировать над веткой, она находится в шаре парка 250MHz, но далеко от 700 МГц.

У меня там phy-настройка, которую я не вижу в техническом описании для умножения часов ARM?

EDIT:

Может быть, мои предположения ошибочны ...

.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 

Системный таймер тикает в шестнадцатеричном на функцию (системный таймер 250MHz сверены секундомером и т.д.).

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? В источниках Linux есть одна строка, в которой упоминаются часы 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 

Может быть, то, что я думаю, что я измерил, как 250MHz 270 и ARM находится на 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 работать на первом, а затем вновь построить linux sd, загрузив его, чтобы найти, что каталог/boot/фактически является жирным разделом, содержащим загрузочные файлы gpu и файл загрузки ядра kernel.img. Так что НЕ в boot/dir, но в том же каталоге с файлами .bin и .elf и .img создайте config.txt и поместите arm_freq = что-то, загрузчик gpu затем произведет модификацию множителя pll, чтобы при запуске руки это с такой скоростью. Я все еще ожидаю более 700 миллионов инструкций в секунду, и я не вижу этого, мне нужно будет продолжать попытки, я думаю.

+2

Вы можете выполнить аналогичный тест под любым, что является самым официальным ядром linux для pi (возможно, взломать тест в самом ядре). Также проверьте количество циклов инструкций, необходимых для выполнения вашего кода. И прочитайте их код инициализации ядра для конкретного устройства, чтобы проверить, перепрограммируют ли регистр PLL. –

+1

Мне интересно узнать, загрузили ли вы свой тестовый код с SD-карты или внесли ли вы его JTAG. Не помогайте в вопросе, который вы понимаете, а потому, что мне интересно, нашли ли вы информацию о загрузчике. – Clifford

+0

Есть три jtags, gpu, arm и сетевой чип. GPU, нет, я ничего не сделал с gpu. сеть jtag, nope, arm jtag, да, может и есть, но для использования arm jtag вам нужен код руки для переключения контактов gpio, который я использую SD-карту для загрузки этой небольшой программы. У меня есть как серийный загрузчик (рука запускается на SD-карте), так и загрузчик jtag (рука начинается с карты). –

ответ

2

Возможно, стоит посмотреть загрузчик, снабженный ссылочным дистрибутивом Arch Linux на страницах загрузки страницы малины Pi. Я не знаю, является ли это рабочим вариантом, но его конфигурацией.TXT включает строку

#arm_freq=800 

Есть также сообщения людей, имеющие разогнали Pi - так что информация о инициализации часов, конечно, там, где-то.

+0

ну, читайте больше об этом, это именно то, как он должен работать, но я не могу заставить его работать ... и у моей Linux-файловой системы с файлом есть файл /boot/config.txt с разными номерами arm_freq = xxx, и он не изменяет скорость руки. –

+0

Конфигурационный файл в/boot (или на некоторых встроенных linux, gzipped in/proc) имеет тенденцию быть удобством * output * или администратором note-to-later, указывающим конфигурацию, с которой было скомпилировано ядро. Изменение его после компиляции не будет иметь никакого эффекта. Кроме того, в таком файле ведущим «#» является комментарий, отключая эту строку. Тем не менее, записи в таком файле имеют все ограничения, начинающиеся с CONFIG_, поэтому у вас может быть другой вид файла, хотя выход с возможностью ввода остается –

2

Возможно, из-за того, что Фонд Малины Pi в основном состоит из сотрудников Broadcom, они выбрали устройство Broadcom в качестве центрального процессора. Хотя это означает, что RPi получает относительно высокопроизводительный ARM11 по очень низкой цене, к сожалению, Broadcom предоставляет полную информацию об чипе лицензиям, поэтому информация, необходимая для настройки PLL, может быть недоступна публично, и я подозреваю, что это встроенных в двоичные файлы «прошивки», предоставляемые Broadcom.

+0

Есть действительно некоторые неприятные аспекты для выпуска, но не будет ли пользовательская система с открытым металлом находиться за пределами того же первоначального начального загрузчика, что и предлагаемое ядро ​​linux и/или вторичный загрузчик? –

+0

@ Крис: Мне интересно то же самое! – Clifford

+0

мой интерес находится на низком уровне, воспитывайте, а не просто пишите приложение на кого-то elses chip/board. gpu здесь не изменяется. До сих пор у нас нет способа возиться с ним. если бы он изменил pll, то это было бы изменено до того, как рука была освобождена от сброса, которая повлияла бы на меня, а также на путь linux. если linux действительно работает быстрее, то ответ скорее всего будет в источниках linux, но надеялся, что кто-то знает ответ от руки. –

0

Я много о программировании голого металла не знаю, но этот код может быть полезен: https://github.com/dwelch67/raspberrypi

отметить это часть ридми, который описывает порядок загрузки:

1) 2) считывает SD-карту и ищет дополнительные загрузочные файлы gpu bootcode.bin, loader.bin, start.elf в корневом каталоге первого раздела (с отформатом в жире)
3) в том же каталоге он ищет config.txt, который вы можете делать так, как изменить скорость руки с 700 МГц по умолчанию, изменить адрес, где загрузить kernel.img и многие другие
4) он читает ядро .img загрузочного рукава двоичного файла и копирует его в память
5) высвобождает сброс на руке таким образом, что он работает с адреса, где в kernel.img данных были написан

означает, что config.txt отделен от ядра linux, и чип устанавливает сам такт (если эта последовательность действительно истинна.)

Код в этом репозитории может помочь вам ответить на ваш вопрос.

Кроме того, на сайте Raspberry Pi, они сделали запись об официальном разгоне: http://www.raspberrypi.org/archives/2008

Они упоминают драйвер CPUfreq, что вы должны быть в состоянии получить источник для (так как часть дерева исходных текстов Linux.) Это также может помочь.

+1

. Автор этого голого металлического кода на github - это OP –

0

Вы можете настроить свой малиновый Pi и изменить, например, тактовую частоту ARM и Ram/Video Ram. A good tutorial.

0

Я знаю, что это было задано и ответили некоторое время назад, но я столкнулся с этим вопросом, надеясь получить быстрый ответ. В случае, если кто-то еще захочет узнать об этом, я установил его для своей установки без гола. Я имел успех на RPI3, добавив

force_turbo = 1
arm_freq = 1200

Опять же, даже если это был голый металл, то config.txt считывается прошивке GPU перед загрузкой ARM и загрузку вашего голого кода (из того, что я понимаю). Я нашел это ссылкой here. Обратите внимание, что я также пытался программно изменить частоту, но не смог найти ссылку (я даже просмотрел исходное дерево ядра Linux, но я полный новичок в разработке ядра).