Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:1
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:5
Форум » starterkit.ru » ARM
SAM9G45 скорость работы
RattleSnake
Добавлено 13.06.2012 14:33 Сообщение: 11
RattleSnake
0

Пункты: 814
Регистрация: 30.03.2012
Цитата
Для начала нужно создать таблицу трансляции адресов - вам хватит одноуровневой с отображением PA<->VA 1:1. Поищите на электроникс.ру - там были вроде подобные темы.


Нашел тему, написал код. Однако стало только хуже)

Код

;***************************************************************************
; * 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


Вот в таком виде все становится медленней раз в 20) Опять у меня подозрения, что где то что то я не так написал...
Спуститься к концу Подняться к началу
Персональная информация
RattleSnake
Добавлено 15.06.2012 12:10 Редактировалось 15.06.2012 12:11 Сообщение: 12
RattleSnake
0

Пункты: 814
Регистрация: 30.03.2012
Накопал код инициализации MMU.

Код

#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);
}



Стало значительно быстрее. Однако все равно тормоза.
Результаты:
без MMU и кешей
0,924 MIPS
c включенными MMU и кешами
20,028 MIPS. Как по мне, так это далеко от заявленных 400))
Что я делаю не так?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 15.06.2012 14:03 Сообщение: 13
sasamy
4.70

Пункты: 77214
Регистрация: 14.08.2009
Цитата

c включенными MMU и кешами
20,028 MIPS.


Вы случайно в своем измерителе попугаев не забыли на 10 умножить - число которое вы получили в 10 раз меньше чем должно быть когда код выполняется в кеше и есть например в Linux - это можно увидеть по bogomips, количество пустых циклов в секунду которое определяется для програмных задержек.
Спуститься к концу Подняться к началу
Персональная информация
RattleSnake
Добавлено 15.06.2012 15:28 Редактировалось 15.06.2012 15:39 Сообщение: 14
RattleSnake
0

Пункты: 814
Регистрация: 30.03.2012
Цитата

Вы случайно в своем измерителе попугаев не забыли на 10 умножить - число которое вы получили в 10 раз меньше чем должно быть когда код выполняется в кеше и есть например в Linux - это можно увидеть по bogomips, количество пустых циклов в секунду которое определяется для програмных задержек.


Вроде все проверял и перепроверял. У меня заливка экрана 640х480х16 занимает 16 мс. Я вот понять не могу, это много или мало?

p.s. Заметил такую особенность - после включения MMU у меня появляются ошибки при доступе к регистром процессора. Иными словами проц зависает. Наверное. проблема в таблице TLB.
Спуститься к концу Подняться к началу
Персональная информация
RattleSnake
Добавлено 15.06.2012 15:53 Сообщение: 15
RattleSnake
0

Пункты: 814
Регистрация: 30.03.2012
Цитата

p.s. Заметил такую особенность - после включения MMU у меня появляются ошибки при доступе к регистром процессора. Иными словами проц зависает. Наверное. проблема в таблице TLB.


проблему решил добавкой строчки
//LCDC Controller
pTranslationTable[0x5] = (0x00500000)|TLB_NCNB;
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 15.06.2012 17:05 Сообщение: 16
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
Вроде все проверял и перепроверял. У меня заливка экрана 640х480х16 занимает 16 мс. Я вот понять не могу, это много или мало?

если не ошибаюсь - 16мс - это ~60 фпс

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
RattleSnake
Добавлено 15.06.2012 21:58 Сообщение: 17
RattleSnake
0

Пункты: 814
Регистрация: 30.03.2012
Цитата

если не ошибаюсь - 16мс - это ~60 фпс


Ну так это же просто заливка. А если еще рассчитывать что то, то фпс проседает сильно... Например стрелочки, шкалы - уже один экран 140 мс...
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 16.06.2012 01:10 Сообщение: 18
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
Ну так это же просто заливка. А если еще рассчитывать что то, то фпс проседает сильно... Например стрелочки, шкалы - уже один экран 140 мс...

тогда мне неясен смысл вопроса..
у вас вроде стендалоне, перемножьте цифры - получите трансфер в мегабайтах, потом смотрите в маны на камень, иногда там пишут скорость обмена или зная частоту шины и камня, попробовать прикинуть самому..
как вы сами писали 14мс - это 100% загрузка ЦПУ и для полезной работы просто нет времени..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
RattleSnake
Добавлено 18.06.2012 09:48 Сообщение: 19
RattleSnake
0

Пункты: 814
Регистрация: 30.03.2012
Цитата

тогда мне неясен смысл вопроса..


Смысл - это максимальная производительность процессора, или я опять что то забыл где то настроить:)
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 18.06.2012 10:24 Редактировалось 18.06.2012 10:38 Сообщение: 20
sasamy
4.70

Пункты: 77214
Регистрация: 14.08.2009
Цитата

Смысл - это максимальная производительность процессора


максимальная производительность - когда данные и код находятся в кешах, ваши суждения о мипсах процессора весьма странные - DDR это внешняя память, это вам не микроконтроллер с TCM.

Цитата
Например стрелочки, шкалы - уже один экран 140 мс...


чтобы нарисовать стрелочку - вы весь экран будете пересовывать каждый раз когда изменилось только положение одной стрелки ? Если говорить о периферии Atmel - контроллер LCD совершенно тупейший - нет даже простейших операций для ускорения отрисовки типа blit, fill, copy - тот же imx233 на голову выше, единственное - в lqfp корпусе шина LCD 8 битный обрезок поэтому с подключением панелей проблематично.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » ARM