Ситуация такая:
Есть следующая программка:
int start_C()
{
int i, count = 1000;
long *start = (long *) (0x00800000);
long *stop = (long *) (0x00896000); //stop-start = 640*480*2
long *ind;
for(i = 0; i < count; i++){
ind = start;
do{
*(ind++) = 0xABCDEF01;
}while(ind < stop);
}
return count;
}
Компилю её с помощью 3.2.1-elf c флагом -O2.
В итоге получаю бинарник, результат дизассемблирования:
c0008000 <_entry>:
c0008000: ea000000 b c0008008 <start_C>
c0008004 <set_pc>:
c0008004: e1a0f000 mov pc, r0
c0008008 <start_C>:
c0008008: e3a02889 mov r2, #8978432 ; 0x890000
c000800c: e59f1028 ldr r1, [pc, #40] ; c000803c <start_C+0x34>
c0008010: e2822a06 add r2, r2, #24576 ; 0x6000
c0008014: e3a00000 mov r0, #0 ; 0x0
c0008018: e3a03502 mov r3, #8388608 ; 0x800000
;
;следующие три инструкции должны выполниться 640*480/2*1000 = 153 600 000 раз
c000801c: e4831004 str r1, [r3], #4
c0008020: e1530002 cmp r3, r2
c0008024: 3afffffc bcc c000801c <start_C+0x14>
;
c0008028: e2800001 add r0, r0, #1 ; 0x1
c000802c: e3500ffa cmp r0, #1000 ; 0x3e8
c0008030: a3a00ffa movge r0, #1000 ; 0x3e8
c0008034: a1a0f00e movge pc, lr
c0008038: eafffff6 b c0008018 <start_C+0x10>
c000803c: abcdef01 blge bf383c48 <_entry-0xc843b8>
Эту программку запускаю в u-boot:
tftp 0 mem.bin
go 0
И работает она около 20-ти секунд.
В результате нехитрых вычислений получается производительность при работе с памятью ок. 20 MIPS.
Вопросы:
1) это верно?
2) почему так медленно?
3) можно ли быстрее заполнить массив в памяти?