Тактовая частота ARM на Raspberry Pi
Работает голое железо (без операционной системы, без Linux)
Спецификации подразумевают, что ARM может работать на частоте 700 МГц, системные часы соответствуют руководству и, кажется, работают на частоте 250 МГц. Простые тесты на ARM подразумевают, что он делает то же самое, например, с кэшем команд на
test:
subs r0,r0,#1
bne test
И варьируйте количество подчиненных инструкций, чтобы доминировать над ветвью, это в шариковом парке 250 МГц, но далеко от 700 МГц.
У меня есть фи-настройки, которые я не вижу в таблице для умножения тактовых импульсов ARM?
РЕДАКТИРОВАТЬ:
Может быть, мои предположения ошибочны...
.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 МГц сверен с секундомером и т. Д.).
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, возможно, еще одно неверное предположение. Может быть, его действительно 500 МГц, а не 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
Может быть, я думаю, что 250 МГц - это 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, затем пересобрать SD-карту linux, загрузил ее и обнаружил, что каталог / boot / фактически является толстым разделом, содержащим загрузочные файлы gpu и загрузочный файл kernel.img arm. файл. Так что НЕ в boot / dir, а в том же самом dir с файлом.bin и.elf и.img создайте config.txt и поместите arm_freq= что-то, загрузчик gpu затем модифицирует множитель pll, чтобы при запуске руки именно на такой скорости. Я все еще ожидаю более 700 миллионов инструкций в секунду и не вижу этого, мне нужно будет продолжать попытки, я думаю.
5 ответов
Возможно, стоит взглянуть на загрузчик, предоставленный справочным дистрибутивом Arch Linux со страниц загрузки организации Raspberry Pi. Я понятия не имею, является ли это рабочий вариант, но его config.txt включает в себя строку
#arm_freq=800
Есть также сообщения о том, что люди разогнали Pi - так что информация об инициализации часов, безусловно, где-то есть.
Вероятно, из-за того, что Raspberry Pi Foundation в основном состоит из сотрудников Broadcom, они выбрали устройство Broadcom в качестве центрального процессора. Хотя это означает, что RPi получает относительно высокопроизводительный ARM11 по очень низкой цене, к сожалению, Broadcom предоставляет лицензиарам только полную информацию о чипе, поэтому информация, необходимая для настройки PLL, может быть недоступна для общественности, и я подозреваю, что встроенные в "прошивку" двоичные файлы, предоставляемые Broadcom.
Вы можете настроить Raspberry Pi и изменить, например, тактовую частоту ARM и Ram/Video Ram. Хороший учебник.
Я знаю, что это задавали и отвечали некоторое время назад, но я наткнулся на этот вопрос, надеясь получить быстрый ответ. На тот случай, если кто-то еще захочет узнать, вот как я это исправил для своей голой установки. Я имел успех на RPI3, добавив
force_turbo = 1
arm_freq = 1200
Опять же, несмотря на то, что это был "голый железо", файл config.txt читается встроенным ПО графического процессора перед загрузкой ARM и загрузкой кода "голого металла" (насколько я понимаю). Я нашел это здесь. Обратите внимание, что я также пытался программно изменить частоту, но не смог найти ссылку (я даже просмотрел дерево исходных текстов ядра Linux, но я полный новичок в разработке ядра).
Я не очень разбираюсь в программировании на голом металле, но этот код может быть полезен: https://github.com/dwelch67/raspberrypi
Следует отметить часть readme, которая описывает порядок загрузки:
1) ботинки на чипе
2) читает SD-карту и ищет дополнительные загрузочные файлы, специфичные для GPU, bootcode.bin, loader.bin, start.elf в корневом каталоге первого раздела (форматированный жирный)
3) в том же каталоге он ищет файл config.txt, с помощью которого вы можете изменить скорость активации по умолчанию на 700 МГц, изменить адрес для загрузки kernel.img и многое другое.
4) он читает kernel.img бинарный файл arm boot и копирует его в память
5) сбрасывает сброс на руке так, что он запускается с адреса, где были записаны данные kernel.img
Это означает, что config.txt отделен от ядра Linux, и чип сам устанавливает тактовую частоту (если эта последовательность действительно верна).
Код в этом хранилище может помочь вам ответить на ваш вопрос.
Кроме того, на сайте Raspberry Pi они опубликовали сообщение об официальном разгоне: http://www.raspberrypi.org/archives/2008
Они упоминают драйвер cpufreq, к которому вы должны иметь возможность получить исходный код (поскольку он является частью дерева исходных текстов linux). Это также может помочь.