Вот пример кода:
.globl _start
_start:
ldr r11,=0xD6800600
mov r1,#0
str r1,[r11,#0x08] ;@ stop timer
mvn r1,#0
str r1,[r11,#0x00] ;@ timer load register
mov r1,#3
str r1,[r11,#0x08] ;@ start timer, 1 x prescaler
mov r3,#3
mov r4,#4
mov r5,#5
mov r6,#6
mov r7,#7
mov r8,#8
mov r9,#9
mov r10,#10
ldr r0,=0xD6001000
mov r12,#0x400
ldr r13,[r11,#0x04]
write_loop:
stmia r0!, {r3,r4,r5,r6,r7,r8,r9,r10}
subs r12,#1
bne write_loop
ldr r1,[r11,#0x04]
ldr r0,=0xD6001000
mov r12,#0x400
ldr r2,[r11,#0x04]
read_loop:
ldmia r0!, {r3,r4,r5,r6,r7,r8,r9,r10}
subs r12,#1
bne read_loop
ldr r14,[r11,#0x04]
mov r0,r13
mov r3,r14
ldr sp,=0xD600E000
bl notmain
hang: b hang
.globl PUT32
PUT32:
str r1,[r0]
bx lr
.globl GET32
GET32:
ldr r0,[r0]
bx lr
Периферийная база 0xD6800000.Использование встроенного таймера.Это mpcore r2p0 (версия 2.0) с 64-битной шиной AXI.Вам может показаться интересным, что записи в 3 раза медленнее, чем чтения.распечатка времени и вычитание записи - это 0x191F5 тиков и чтение 0x81F7.
Но я знаю причину, почему.Этот контроллер памяти может / действительно превращает STM в 4 цикла записи двойных слов (что вы видите на шине AXI).Я думаю, что чтение - это передача из 8 слов (4 двойных слова), так что для записи в 4 раза увеличивается нагрузка шины.Накладные расходы плюс один такт для каждой записи, каждое чтение - это издержки плюс 8 тактов для передачи данных.
Я добавил код, чтобы убедиться, что кэши отключены.И добавил nops, по одному nop за раз, чтобы отрегулировать выравнивание инструкций в памяти (все еще может влиять на выборки и реализацию на чиповой памяти).Например, поместите nops перед чтением таймера перед каждым циклом.Управляя расположением циклов в памяти, цикл чтения был наиболее чувствительным, и я мог изменить результаты на 50% в любом случае.Вместо диапазона 0x8xxx он будет переходить к 0xAxxx в одном чувствительном месте и 0x6xxx в другом.Я не собираюсь углубляться в это, возможно, есть некоторые эффекты от самого плунжера, а также эффекты от ARM11 с некоторым сглаживанием при извлечении, а также, возможно, сглаженные чтения сглаживаются в меньшее количество совмещенных операций чтения и т. Д.
Я рекомендую вам сделать то же самое, выключить кэши, выключить MMU, отключить проверку четности или генерацию / проверку ecc.Затяните петли, время вне петли.Размещайте nops по одному перед тестовым кодом, по одному, возможно, целых 8, 16 или 32, если есть различия, шаблон должен повторяться на некоторой логической границе, такой как 4, 8 или 16 слов.Также, если ваш таймер дает вам другой номер (без перекомпиляции), запускаемый после запуска, у вас есть прерывания или что-то подобное, что может испортить ваши номера.Часы ядра процессора, подобные этим, я не могу себе представить, изменится даже на один такт, конечно, зависит от вашей системы памяти.Хммм, так как вы выполняете инструкции из 8 слов, попробуйте изменить начальный адрес на 0, 4, 8 и 12. Также попробуйте включить кэш инструкций (для этого не нужен mmu).Я подозреваю, что вы также увидите скачок показателей производительности.
Есть некоторые другие ARM, которые я могу попробовать ... Не чипы, о которых у меня столько внутренних знаний ...
Какая семья/ ядро у тебя работает?Можете ли вы опубликовать свой тестовый код?Ваш тестовый цикл похож на то, что я делал выше?