|
Bопрос по АРМ9, Обработчики прерываний |
|
|
|
Feb 22 2009, 00:03
|
Участник

Группа: Новичок
Сообщений: 61
Регистрация: 29-01-09
Пользователь №: 44 105

|
контроллер at91rm9200. частота ядра 180мгц, шина 60мгц. на шине статическая память с 16-битной шиной, с NWS=0(без дополнительных тактов). кеши оба включены-память закеширована write-back, в ней исполняется программа. обработчики прерываний в этой памяти. вопрос- если обработчики разместить во внутренней sram контроллера,будет ли выигрыш в производительности? или с кешами это не принципиально? как обработчик прерывания в keil скопировать из одной памяти в другую с учётом коррекции счётчика адреса(РС?) И ещё-пробовал стек делать во внутренней памяти - на глаз быстродействие не изменилось
|
|
|
|
|
 |
Ответов
(15 - 29)
|
Feb 23 2009, 13:02
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(axa09 @ Feb 23 2009, 10:45)  В общем удалось ради эксперимента таблицу запихать во внутреннюю срам. прироста в скорости не дало  по ходу больше никак не выжать. вот собственно задача: есть буфер MxN байт- индексов другого массива(палитра). требуется находить средние интенсивности компонент цвета из 4-х смежных точек(2х2 пиксела). короче,некое подобие фильтра при уменьшении картинки в два раза. как можно сделать быстрее? буфера во внешней памяти Даже любопытно, как удалось 16 KB'ую таблицу запихнуть в 16 KB'ую SRAM и сохранить в ней таблицу векторов прерываний?
|
|
|
|
|
Feb 23 2009, 13:32
|
Участник

Группа: Новичок
Сообщений: 61
Регистрация: 29-01-09
Пользователь №: 44 105

|
Цитата(sergeeff @ Feb 23 2009, 04:02)  Даже любопытно, как удалось 16 KB'ую таблицу запихнуть в 16 KB'ую SRAM и сохранить в ней таблицу векторов прерываний? все просто. прикиньте сами: 0x00000000 - внутренняя SRAM после ReMap - отхавает RESET(вектор 0) 0x00100000 - внутренний ROM - отхавает Undef (вектор 1) 0x00200000 - внутренняя SRAM всегда - отхавает SWInt (вектор 2) далее не затираем. Поэтому IRQ и FIQ целые. Остальные не пользуем  0x00200400 - первый мегабайт SRAM (NCS0) 0x00200404 - второй мегабайт SRAM итд... 0x00200С00 - периферия(дисплей) не кешируется и не буферизуется ... стек в конце О задаче по -подробнее: //Буфер 256x240 исходного изобржения. Элемент -байт - индекс массива палитры extern uint8 *Buf; //Палитра. Каждый элемент 00rrr00ggg00bb- нули для того чтобы при сложении 4-х цветов небыло переполнения. u16 PALETTE[256]; /* 256 1212121212.. 3434343434.. 1212121212.. 240 3434343434.. ............ */ /* Далее ниже находим "средний пиксел"(среднее арифметическое каждой интенсивности R,G,  Для этого складываем все компоненты смежных пикселов "1"+"2"+"3"+"4" Потом сдвигами и битовыми "И" приводим к виду RRrGGgBB = R:G:B=>3:3:2 И отправляем байт в дисплей (шина EBI,8бит, автоинкремент адреса, 128x120 авто-скругление по кадру) */ #define Pixel \ c =PALETTE[*(u8*) Buf ]; \ c+=PALETTE[*(u8*)(Buf+ 1)]; \ c+=PALETTE[*(u8*)(Buf+256)]; \ c+=PALETTE[*(u8*)(Buf+257)]; \ Display_Data_Register=((c>>2)&0x03)|((c>>4)&0x1C)|((c>>6)&0xE0); \ Buf+=2; void BlitScreen(u8 *Buf) //Отрисовка экрана { register u32 y,BufE,c; for(y=0;y<120;y++) { BufE=(u32)Buf+256; for(;(u32)Buf<BufE;) { Pixel Pixel Pixel Pixel } Buf+=256; } } //Таким образом изображение 256x240 ужимаем в 128x120 с применением палитры(конвертируем цвета) // и "фильтра"(среднее значение компонент смежных пикселей 2x2) Как можно оптимизировать быстрее??? На ассемблере?
|
|
|
|
|
Feb 23 2009, 14:47
|
Участник

Группа: Новичок
Сообщений: 61
Регистрация: 29-01-09
Пользователь №: 44 105

|
У меня память 16 бит шина данных. всёравно по 32 бита читать? листинг смотрел-быстрее тот вариант, который с меньшим количеством обращений к памяти(операнды в квадратных скобках) и всё-же, предложите свой вариант который,возможно, быстрее
|
|
|
|
|
Feb 23 2009, 15:14
|
Участник

Группа: Новичок
Сообщений: 61
Регистрация: 29-01-09
Пользователь №: 44 105

|
Вариант идёт с 45 преобразований/с. но это не чисто- ещё много другого в цикле делается(не путать с циклом отрисовки!)
по таблице. не надо все 16кб заполнять! надо только память и периферию. остальное не имеет значение-всёравно обращений по этим адресам не будет!
|
|
|
|
|
Feb 23 2009, 15:41
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(axa09 @ Feb 23 2009, 18:14)  Вариант идёт с 45 преобразований/с. но это не чисто- ещё много другого в цикле делается(не путать с циклом отрисовки!) Т.е. не измеряли что ли? CODE #define Pixel \ a = Bufw[0]; \ b = Bufw[64]; \ c = PALETTE[a & 0xff]; \ c += PALETTE[(a >> 8) & 0xff]; \ c += PALETTE[b & 0xff]; \ c += PALETTE[(b >> 8) & 0xff]; \ Display_Data_Register=((c>>2)&0x03)|((c>>4)&0x1C)|((c>>6)&0xE0); \ c = PALETTE[(a >> 16) & 0xff]; \ c += PALETTE[(a >> 24) & 0xff]; \ c += PALETTE[(b >> 16) & 0xff]; \ c += PALETTE[(b >> 24) & 0xff]; \ Display_Data_Register=((c>>2)&0x03)|((c>>4)&0x1C)|((c>>6)&0xE0); \ Bufw++;
void BlitScreen(u8 *Buf) { u32 *Bufw = (u32*)Buf, a, b, c, y, x; for(y = 0; y < 120; y++) { for(x = 0; x < 64 / 4; x++) { Pixel Pixel Pixel Pixel } Bufw += 64; } }
25% не обещаю, но 15 точно должно быть. Buf должен быть выровнен по границе слова. Только вот процедурка и в исходном виде достаточно короткая (меньше 5мс).
|
|
|
|
|
Feb 23 2009, 21:30
|
Участник

Группа: Новичок
Сообщений: 61
Регистрация: 29-01-09
Пользователь №: 44 105

|
Спасибо! как проверю-напишу результаты и приведу асм-листинг обеих вариантов.
времянки дисплея выставлены максимально короткими. любопытно,что повышение частоты шины не ведёт к увеличению итоговой производительности. а вот оверклочение ядра с 180 на 200 на глаз ощутимо повышением скорости выполнения программы!
|
|
|
|
|
Feb 24 2009, 10:45
|
Участник

Группа: Новичок
Сообщений: 61
Регистрация: 29-01-09
Пользователь №: 44 105

|
Цитата(aaarrr @ Feb 23 2009, 07:41)  Т.е. не измеряли что ли?
25% не обещаю, но 15 точно должно быть. Buf должен быть выровнен по границе слова. Только вот процедурка и в исходном виде достаточно короткая (меньше 5мс). В общем сегодня замерил свой и ваш варианты. Мой 206 FPS, ваш 203 FPS. Я даже расстроился  Листинги вложил сюда. На всякий случай сообщаю настройки компилятора: Keil Real View v3.3 Code generation: ARM-Mode Use cross-module optimization C compiler: enable arm/thumb intervorking optimization level 2 (-02) optimize for time ASM: enable ARM/thumb interworking Дополнительные ключи C компилятора: --pointer_alignment=8 --min_array_alignment=8 --no_vfe замерял производительность с двумя вариантами стеков: во внутренней срам и во внешней - тоже самое все. пробовал PALETTE[] расположить во внутренней срам- тоже ничего не поменялось. листинги решил вложить, так как вымахали большими. есть подозрение что фиговый асм-код генерится. в общем посмотрите плиз. может что-то лишнее и вредное в настройках включено? или надо что-то добавить? если нетрудно, приведите плиз асм-код .
|
|
|
|
|
Feb 24 2009, 14:32
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Запись во внешний медленный порт сильно портит все дело. Вот что получилось у меня (RVDS 2.2, полная оптимизация по скорости): 1. Без записи в порт, вместо регистра пишем кэшируемую память. Ваш вариант 334 FPS, мой - 397 FPS. Разница заметна. 2. С записью в порт. Ваш вариант - 215 FPS, мой - 221 FPS. Практически одинаково. CODE BlitScreen $a .text 0x00000000: e92d07f0 ..-. PUSH {r4-r10} 0x00000004: e1a03000 .0.. MOV r3,r0 0x00000008: e59f03f4 .... LDR r0,[pc,#1012] ; [.bss$5 = 0x404] = 0 0x0000000c: e3a0a000 .... MOV r10,#0 0x00000010: e3a06202 .b.. MOV r6,#0x20000000 0x00000014: e3a050e0 .P.. MOV r5,#0xe0 0x00000018: e3a0401c .@.. MOV r4,#0x1c 0x0000001c: e3a07000 .p.. MOV r7,#0 0x00000020: e5931000 .... LDR r1,[r3,#0] 0x00000024: e5932100 .!.. LDR r2,[r3,#0x100] 0x00000028: e201c0ff .... AND r12,r1,#0xff 0x0000002c: e2018cff .... AND r8,r1,#0xff00 0x00000030: e08083a8 .... ADD r8,r0,r8,LSR #7 0x00000034: e080c08c .... ADD r12,r0,r12,LSL #1 0x00000038: e1dcc0b0 .... LDRH r12,[r12,#0] 0x0000003c: e1d880b0 .... LDRH r8,[r8,#0] 0x00000040: e088c00c .... ADD r12,r8,r12 0x00000044: e20280ff .... AND r8,r2,#0xff 0x00000048: e0808088 .... ADD r8,r0,r8,LSL #1 0x0000004c: e1d880b0 .... LDRH r8,[r8,#0] 0x00000050: e088c00c .... ADD r12,r8,r12 0x00000054: e2028cff .... AND r8,r2,#0xff00 0x00000058: e08083a8 .... ADD r8,r0,r8,LSR #7 0x0000005c: e1d880b0 .... LDRH r8,[r8,#0] 0x00000060: e088c00c .... ADD r12,r8,r12 0x00000064: e004822c ,... AND r8,r4,r12,LSR #4 0x00000068: e1a09e0c .... LSL r9,r12,#28 0x0000006c: e1888f29 )... ORR r8,r8,r9,LSR #30 0x00000070: e005c32c ,... AND r12,r5,r12,LSR #6 0x00000074: e188c00c .... ORR r12,r8,r12 0x00000078: e5c6c007 .... STRB r12,[r6,#7] 0x0000007c: e201c8ff .... AND r12,r1,#0xff0000 0x00000080: e1a01c21 !... LSR r1,r1,#24 0x00000084: e0801081 .... ADD r1,r0,r1,LSL #1 0x00000088: e080c7ac .... ADD r12,r0,r12,LSR #15 0x0000008c: e1dcc0b0 .... LDRH r12,[r12,#0] 0x00000090: e1d110b0 .... LDRH r1,[r1,#0] 0x00000094: e081100c .... ADD r1,r1,r12 0x00000098: e202c8ff .... AND r12,r2,#0xff0000 0x0000009c: e080c7ac .... ADD r12,r0,r12,LSR #15 0x000000a0: e1a02c22 ",.. LSR r2,r2,#24 0x000000a4: e1dcc0b0 .... LDRH r12,[r12,#0] 0x000000a8: e0802082 . .. ADD r2,r0,r2,LSL #1 0x000000ac: e1d220b0 . .. LDRH r2,[r2,#0] 0x000000b0: e08c1001 .... ADD r1,r12,r1 0x000000b4: e0821001 .... ADD r1,r2,r1 0x000000b8: e0042221 !".. AND r2,r4,r1,LSR #4 0x000000bc: e1a0ce01 .... LSL r12,r1,#28 0x000000c0: e1822f2c ,/.. ORR r2,r2,r12,LSR #30 0x000000c4: e0051321 !... AND r1,r5,r1,LSR #6 0x000000c8: e1821001 .... ORR r1,r2,r1 0x000000cc: e5c61007 .... STRB r1,[r6,#7] 0x000000d0: e5b31004 .... LDR r1,[r3,#4]! 0x000000d4: e5932100 .!.. LDR r2,[r3,#0x100] 0x000000d8: e201c0ff .... AND r12,r1,#0xff 0x000000dc: e2018cff .... AND r8,r1,#0xff00 0x000000e0: e08083a8 .... ADD r8,r0,r8,LSR #7 0x000000e4: e080c08c .... ADD r12,r0,r12,LSL #1 0x000000e8: e1dcc0b0 .... LDRH r12,[r12,#0] 0x000000ec: e1d880b0 .... LDRH r8,[r8,#0] 0x000000f0: e088c00c .... ADD r12,r8,r12 0x000000f4: e20280ff .... AND r8,r2,#0xff 0x000000f8: e0808088 .... ADD r8,r0,r8,LSL #1 0x000000fc: e1d880b0 .... LDRH r8,[r8,#0] 0x00000100: e088c00c .... ADD r12,r8,r12 0x00000104: e2028cff .... AND r8,r2,#0xff00 0x00000108: e08083a8 .... ADD r8,r0,r8,LSR #7 0x0000010c: e1d880b0 .... LDRH r8,[r8,#0] 0x00000110: e088c00c .... ADD r12,r8,r12 0x00000114: e004822c ,... AND r8,r4,r12,LSR #4 0x00000118: e1a09e0c .... LSL r9,r12,#28 0x0000011c: e1888f29 )... ORR r8,r8,r9,LSR #30 0x00000120: e005c32c ,... AND r12,r5,r12,LSR #6 0x00000124: e188c00c .... ORR r12,r8,r12 0x00000128: e5c6c007 .... STRB r12,[r6,#7] 0x0000012c: e201c8ff .... AND r12,r1,#0xff0000 0x00000130: e1a01c21 !... LSR r1,r1,#24 0x00000134: e0801081 .... ADD r1,r0,r1,LSL #1 0x00000138: e080c7ac .... ADD r12,r0,r12,LSR #15 0x0000013c: e1dcc0b0 .... LDRH r12,[r12,#0] 0x00000140: e1d110b0 .... LDRH r1,[r1,#0] 0x00000144: e081100c .... ADD r1,r1,r12 0x00000148: e202c8ff .... AND r12,r2,#0xff0000 0x0000014c: e080c7ac .... ADD r12,r0,r12,LSR #15 0x00000150: e1a02c22 ",.. LSR r2,r2,#24 0x00000154: e1dcc0b0 .... LDRH r12,[r12,#0] 0x00000158: e0802082 . .. ADD r2,r0,r2,LSL #1 0x0000015c: e1d220b0 . .. LDRH r2,[r2,#0] 0x00000160: e08c1001 .... ADD r1,r12,r1 0x00000164: e0821001 .... ADD r1,r2,r1 0x00000168: e0042221 !".. AND r2,r4,r1,LSR #4 0x0000016c: e1a0ce01 .... LSL r12,r1,#28 0x00000170: e1822f2c ,/.. ORR r2,r2,r12,LSR #30 0x00000174: e0051321 !... AND r1,r5,r1,LSR #6 0x00000178: e1821001 .... ORR r1,r2,r1 0x0000017c: e5c61007 .... STRB r1,[r6,#7] 0x00000180: e5b31004 .... LDR r1,[r3,#4]! 0x00000184: e5932100 .!.. LDR r2,[r3,#0x100] 0x00000188: e201c0ff .... AND r12,r1,#0xff 0x0000018c: e2018cff .... AND r8,r1,#0xff00 0x00000190: e08083a8 .... ADD r8,r0,r8,LSR #7 0x00000194: e080c08c .... ADD r12,r0,r12,LSL #1 0x00000198: e1dcc0b0 .... LDRH r12,[r12,#0] 0x0000019c: e1d880b0 .... LDRH r8,[r8,#0] 0x000001a0: e088c00c .... ADD r12,r8,r12 0x000001a4: e20280ff .... AND r8,r2,#0xff 0x000001a8: e0808088 .... ADD r8,r0,r8,LSL #1 0x000001ac: e1d880b0 .... LDRH r8,[r8,#0] 0x000001b0: e088c00c .... ADD r12,r8,r12 0x000001b4: e2028cff .... AND r8,r2,#0xff00 0x000001b8: e08083a8 .... ADD r8,r0,r8,LSR #7 0x000001bc: e1d880b0 .... LDRH r8,[r8,#0] 0x000001c0: e088c00c .... ADD r12,r8,r12 0x000001c4: e004822c ,... AND r8,r4,r12,LSR #4 0x000001c8: e1a09e0c .... LSL r9,r12,#28 0x000001cc: e1888f29 )... ORR r8,r8,r9,LSR #30 0x000001d0: e005c32c ,... AND r12,r5,r12,LSR #6 0x000001d4: e188c00c .... ORR r12,r8,r12 0x000001d8: e5c6c007 .... STRB r12,[r6,#7] 0x000001dc: e201c8ff .... AND r12,r1,#0xff0000 0x000001e0: e1a01c21 !... LSR r1,r1,#24 0x000001e4: e0801081 .... ADD r1,r0,r1,LSL #1 0x000001e8: e080c7ac .... ADD r12,r0,r12,LSR #15 0x000001ec: e1dcc0b0 .... LDRH r12,[r12,#0] 0x000001f0: e1d110b0 .... LDRH r1,[r1,#0] 0x000001f4: e081100c .... ADD r1,r1,r12 0x000001f8: e202c8ff .... AND r12,r2,#0xff0000 0x000001fc: e080c7ac .... ADD r12,r0,r12,LSR #15 0x00000200: e1a02c22 ",.. LSR r2,r2,#24 0x00000204: e1dcc0b0 .... LDRH r12,[r12,#0] 0x00000208: e0802082 . .. ADD r2,r0,r2,LSL #1 0x0000020c: e1d220b0 . .. LDRH r2,[r2,#0] 0x00000210: e08c1001 .... ADD r1,r12,r1 0x00000214: e0821001 .... ADD r1,r2,r1 0x00000218: e0042221 !".. AND r2,r4,r1,LSR #4 0x0000021c: e1a0ce01 .... LSL r12,r1,#28 0x00000220: e1822f2c ,/.. ORR r2,r2,r12,LSR #30 0x00000224: e0051321 !... AND r1,r5,r1,LSR #6 0x00000228: e1821001 .... ORR r1,r2,r1 0x0000022c: e5c61007 .... STRB r1,[r6,#7] 0x00000230: e5b31004 .... LDR r1,[r3,#4]! 0x00000234: e5932100 .!.. LDR r2,[r3,#0x100] 0x00000238: e201c0ff .... AND r12,r1,#0xff 0x0000023c: e2018cff .... AND r8,r1,#0xff00 0x00000240: e08083a8 .... ADD r8,r0,r8,LSR #7 0x00000244: e080c08c .... ADD r12,r0,r12,LSL #1 0x00000248: e1dcc0b0 .... LDRH r12,[r12,#0] 0x0000024c: e1d880b0 .... LDRH r8,[r8,#0] 0x00000250: e088c00c .... ADD r12,r8,r12 0x00000254: e20280ff .... AND r8,r2,#0xff 0x00000258: e0808088 .... ADD r8,r0,r8,LSL #1 0x0000025c: e1d880b0 .... LDRH r8,[r8,#0] 0x00000260: e088c00c .... ADD r12,r8,r12 0x00000264: e2028cff .... AND r8,r2,#0xff00 0x00000268: e08083a8 .... ADD r8,r0,r8,LSR #7 0x0000026c: e1d880b0 .... LDRH r8,[r8,#0] 0x00000270: e088c00c .... ADD r12,r8,r12 0x00000274: e004822c ,... AND r8,r4,r12,LSR #4 0x00000278: e1a09e0c .... LSL r9,r12,#28 0x0000027c: e1888f29 )... ORR r8,r8,r9,LSR #30 0x00000280: e005c32c ,... AND r12,r5,r12,LSR #6 0x00000284: e188c00c .... ORR r12,r8,r12 0x00000288: e5c6c007 .... STRB r12,[r6,#7] 0x0000028c: e201c8ff .... AND r12,r1,#0xff0000 0x00000290: e1a01c21 !... LSR r1,r1,#24 0x00000294: e0801081 .... ADD r1,r0,r1,LSL #1 0x00000298: e080c7ac .... ADD r12,r0,r12,LSR #15 0x0000029c: e1dcc0b0 .... LDRH r12,[r12,#0] 0x000002a0: e1d110b0 .... LDRH r1,[r1,#0] 0x000002a4: e081100c .... ADD r1,r1,r12 0x000002a8: e202c8ff .... AND r12,r2,#0xff0000 0x000002ac: e080c7ac .... ADD r12,r0,r12,LSR #15 0x000002b0: e1a02c22 ",.. LSR r2,r2,#24 0x000002b4: e1dcc0b0 .... LDRH r12,[r12,#0] 0x000002b8: e0802082 . .. ADD r2,r0,r2,LSL #1 0x000002bc: e1d220b0 . .. LDRH r2,[r2,#0] 0x000002c0: e08c1001 .... ADD r1,r12,r1 0x000002c4: e0821001 .... ADD r1,r2,r1 0x000002c8: e0042221 !".. AND r2,r4,r1,LSR #4 0x000002cc: e1a0ce01 .... LSL r12,r1,#28 0x000002d0: e1822f2c ,/.. ORR r2,r2,r12,LSR #30 0x000002d4: e0051321 !... AND r1,r5,r1,LSR #6 0x000002d8: e1821001 .... ORR r1,r2,r1 0x000002dc: e5c61007 .... STRB r1,[r6,#7] 0x000002e0: e2877001 .p.. ADD r7,r7,#1 0x000002e4: e3570010 ..W. CMP r7,#0x10 0x000002e8: e2833004 .0.. ADD r3,r3,#4 0x000002ec: 3affff4b K..: BCC {pc} - 0x2cc ; 0x20 0x000002f0: e28aa001 .... ADD r10,r10,#1 0x000002f4: e35a0078 x.Z. CMP r10,#0x78 0x000002f8: e2833c01 .<.. ADD r3,r3,#0x100 0x000002fc: 3affff46 F..: BCC {pc} - 0x2e0 ; 0x1c 0x00000300: e8bd07f0 .... POP {r4-r10} 0x00000304: e12fff1e ../. BX r14
Цитата(axa09 @ Feb 24 2009, 13:45)  замерял производительность с двумя вариантами стеков: во внутренней срам и во внешней - тоже самое все. пробовал PALETTE[] расположить во внутренней срам- тоже ничего не поменялось. Стек не используется, а PALETTE полностью ложится в кэш, так что разницы и не должно быть.
|
|
|
|
|
Feb 24 2009, 15:33
|
Участник

Группа: Новичок
Сообщений: 61
Регистрация: 29-01-09
Пользователь №: 44 105

|
тоесть в моём случае уже ничего не придумать?
|
|
|
|
|
Feb 24 2009, 19:50
|
Участник

Группа: Новичок
Сообщений: 61
Регистрация: 29-01-09
Пользователь №: 44 105

|
Он включен(бит buferable-1) или в другом месте еще надо?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|