|
|
  |
SAm9g45 производительность, Что то мне кажется, что он тормозит |
|
|
|
Jun 8 2012, 06:04
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 28-07-09
Пользователь №: 51 641

|
Использую плату от Стартеркита SK-9g45-oem. Развел платку, подключил дисплей NEC NL6448BC18-01F. Все работает весело, картинка цветная)) Однако есть одно но. Чтобы заполнить весь экран каким либо цветом, у процессора уходит 35-40 мс времени (Измеряю с помощью PIT). В моем понимании, это слишком много. Написал программу заливки по алгоритму - так вообще, на одну картинку уходит 500 мс. Это вообще бардак. Вот у меня возник вопрос, так как я этот процессор только начал осваивать, может я чего то там недоинициализировал? Использовал исходники с SAM9G45EK для начальной инициализации проца, настроил дисплей и ДМА и все. В общем, прошу совета. p.s. Появилось подозрение, что всему виной низкая скорость обмена с памятью DDR2. Кто может подсказать, как правильно инициализировать память в комплекте с платой (k4T511630I, может у кого завалялся код?). Я использовал настройки памяти из проектов SAM9G45-EK p.s.s. Подозрения подтвердились. Написал прогу: Код unsigned short *lcdbuffer = (unsigned short *) (AT91C_DDR2 + 0x00100000);
uint32 time1,time2; uint16 ITemp;
timestamp=0; for(cnt=0;cnt<640000;cnt++) *lcdbuffer=0xffff; time1=timestamp; timestamp=0; for(cnt=0;cnt<640000;cnt++) ITemp=0xffff; time2=timestamp; TRACE_INFO("time1 is %u, time2 is %u\r",time1,time2); т.е. сначала записывал в DDR2, потом работал со встроенной памятью(Как мне кажется, может я не прав, поправьте) и получил результат time1 is 1287433, time2 is 3 Что я делаю не так? Явно же где то мой косяк в настройке DDR2.
Сообщение отредактировал Rattle_the_Snake - Jun 8 2012, 12:08
|
|
|
|
|
Jun 9 2012, 12:04
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 28-07-09
Пользователь №: 51 641

|
Мне кажется, что решением проблемы может быть включение MMU и кеша. Кто нибудь может выложить пример настройки MMU (минимально необходимый)? Пытался читать на infocenter.arm.com - ниасилил. Буду благодарен за помощь в этом направлении.
|
|
|
|
|
Jun 13 2012, 10:28
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 28-07-09
Пользователь №: 51 641

|
Цитата(aaarrr @ Jun 9 2012, 15:18)  Использовал этот пример. Однако время увеличилось с 200 мс до 5 секунд))) Мож я как то не так написал? I NEED HELP) CODE ;********************************************************************** ***** ; * Cache and MMU Configuration
mrc p15, 0, r0, c1, c0, 0; read CP15 register 1 into r0 bic r0, r0, #0x01 ; clear MMU enable bic r0, r0, #(0x01 << 0x0c); disable I Cache bic r0, r0, #(0x01 << 0x02); disable D Cache mcr p15, 0, r0, c1, c0, 0; write value back
mov r0, #0x00 mcr p15, 0, r0, c7, c7, 0; invalidate caches mcr p15, 0, r0, c8, c7, 0; invalidate TLBs
ldr r0, =ttb_first_level; set start of Translation Table base (16k Boundary) mcr p15, 0x00, r0, c2, c0, 0x00; write to CP15 register 2 ; ; Create translation table for flat mapping ; Top 12 bits of VA is pointer into table ; Create 4096 entries from 000xxxxx to fffxxxxx ; mov r1, #0x00 ; loop counter ldr r2, =0xDF2 ; set access permissions (AP) for full access SVC/USR (11:10) ; set for domain 15 (8:5) ; must be 1 (4) ; set non cachable non bufferable (CB) (3:2) ; set for 1Mb section (1:0) init_ttb0 orr r3, r2, r1, lsl #0x14 ldr r4, =sections init_ttb1 ldr r5, [r4], #0x04 tst r5, #0x01 bne init_ttb2 cmp r1, r5, lsr #0x14 addlo r4, r4, #0x08 blo init_ttb1 ldr r5, [r4], #0x04 cmp r1, r5, lsr #0x14 addhs r4, r4, #0x04 bhs init_ttb1 ldr r5, [r4] orr r3, r3, r5 init_ttb2 str r3, [r0, r1, lsl #0x02] add r1, r1, #0x01 cmp r1, #0x1000 blo init_ttb0 ; ; Init domains ; mov r0, #(0x1 << 0x1e); must define behaviour for domain 15 (31:30), set client mcr p15, 0x00, r0, c3, c0, 0x00; write to CP15 register 3 ; ; Set global core configurations ; mrc p15, 0x00, r0, c1, c0, 0x00; read CP15 register 1 into r0
orr r0, r0, #(0x01 << 0x0c); enable I Cache orr r0, r0, #(0x01 << 0x02); enable D Cache orr r0, r0, #0x01 ; enable MMU ; ; Additional configuration options ; ; orr r0, r0, #(0x01 << 0x0e); enable Round Robin cache replacement ; orr r0, r0, #(0x01 << 0x0d); enable Hi Vectors orr r0, r0, #(0x01 << 0x01); enable data address alignment checking
mcr p15, 0x00, r0, c1, c0, 0x00; write cp15 register 1 nop nop nop nop nop nop nop nop bx lr
; *************************************************************************** ; *
sections DCD 0x00000000; SRAM DCD 0x00100000 DCD 0xC ; wb, buffered
DCD 0x70000000; DDRAM DCD 0x72000000 DCD 0xC ; wb, buffered
DCD 0x00000001; END
; *************************************************************************** ; *
ttb_first_level EQU 0x70000000
Сообщение отредактировал IgorKossak - Jun 13 2012, 12:48
Причина редактирования: [codebox] а не [spoiler] для длинного кода!!!
|
|
|
|
|
Jun 14 2012, 08:24
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 28-07-09
Пользователь №: 51 641

|
Решил проблему. Вот мой код для настройки кеша SAM9G45 CODE #include "cp15.h" //Atmel at91lib
#define SRAM_ADDRESS AT91C_IRAM
#define TLB_NCNB 0xDF2 // Noncachable, Nonbufferable 11 0 1111 1 00 10 #define TLB_WT 0xDFA // Write-through 11 0 1111 1 10 10 #define TLB_WB 0xDFE // Write-back 11 0 1111 1 11 10
static unsigned char *BufMMU = (unsigned char *) (SRAM_ADDRESS + 0x4000);
void InitMMU(unsigned int *pTranslationTable) { int i; int addSRAM;
// Program the TTB TRACE_DEBUG("TTB = 0x%X\n\r", (unsigned int)pTranslationTable);
CP15_WriteTTB((unsigned int)pTranslationTable);
// Program the domain access register CP15_WriteDomainAccessControl(0xFFFFFFFF); // domain 15: access are not checked
// Reset table entries for (i = 0; i < 4096; i++) { pTranslationTable[i] = 0; } // Program level 1 page table entry // Vector adress pTranslationTable[0x0] = (0x00000000)|TLB_NCNB; // SRAM adress (with D cache) addSRAM = (SRAM_ADDRESS >> 20); TRACE_DEBUG("addSRAM = 0x%X\n\r", addSRAM); TRACE_DEBUG("SRAM_ADDRESS = 0x%X\n\r", SRAM_ADDRESS); pTranslationTable[addSRAM] = (SRAM_ADDRESS)|TLB_WB; //DDRAM buf1 with write-through pTranslationTable[0x701] = (AT91C_DDR2 + 0x00100000)|TLB_WT; //DDRAM buf2 with write-through pTranslationTable[0x702] = (AT91C_DDR2 + 0x00200000)|TLB_WT; // Peripherals adress pTranslationTable[0xFFF] = (0xFFF00000)|TLB_NCNB; CP15_EnableMMU(); CP15_EnableDcache(); CP15_EnableIcache(); }
int main() { //somewhere in init InitMMU((unsigned int*)BufMMU); }
Сообщение отредактировал Rattle_the_Snake - Jun 15 2012, 08:14
|
|
|
|
|
Jun 15 2012, 08:14
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 28-07-09
Пользователь №: 51 641

|
После включения MMU проц выдает 28 MIPS по сравнению с 1. Неплохой прирост, однако все же далековато от заявленных 400. Что еще можно сделать, куда копнуть? Использую тест из примера at91sam9xe-ek
|
|
|
|
|
Jun 18 2012, 05:49
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 28-07-09
Пользователь №: 51 641

|
Цитата(AVR @ Jun 18 2012, 03:44)  где можно скачать код этого примера? у меня тоже at91sam на 400 МГц, я мог бы запустить и поделиться результатами Я брал пример из стандартных IAR. Называется at91sam9xe-ek/basic-dhrystone-project, и немного переделал под свой проц
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|