|
Ногодрыгание у ARM, Академический вопрос |
|
|
|
May 3 2009, 19:21
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Работаю с камнем LPC2106. Он меня полностью устраивает и прекрасно ложится под проект. Поэтому тот вопрос, который я задаю ниже - чисто академический, чтобы лучше узнать архитектуру. Мне не надо никак ускорять. Я просто хочу разобраться. Итак. Запустил камень на частоте близкой к 60 (14.7456*4). Частоту проверил JLink Comander-ом. Подтверждено. Сконфигурировал MAM как положено. Делитель переферийной шины 1:1. То есть быстродействие "по максимуму". Учитывая, что, согласно описанию, производительность данного камня из флэши практически равна такойже из RAM, то пока этим пренебрегаем. Выдаём прямоугольник на ножку прогой типа Код for(;; ) { OUT_EN_RS485; IN_EN_RS485; } Получаем асмовую прогу, по типу: Код \ ??main_5: \ 000002AC 4018A0E3 MOV R1,#+4194304 \ 000002B0 001080E5 STR R1,[R0, #+0] \ 000002B4 081080E5 STR R1,[R0, #+8] \ 000002B8 FBFFFFEA B ??main_5 Просмотрел систему команд ARM и высчитал (может ошибся) что данный цикл должен выполнятся 1+2+2+3 такта + ещё 3 такта на сброс конвеера. Итого 11 тактов. То есть при частоте 60МГц мы должны получить частоту ~ 5.45. Реально я получаю 3.5. За счёт чего формируется доп задержка? Как обстоят дела с этим в at91sam7s? (Интересуют конкретные цифры) У STR711? STM32?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 16)
|
May 4 2009, 06:05
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата IAR for ARM 5.10. Файл iolpc2104.h EWARM5.30, lpc2104.h Код ... /*************************************************************************** ** ** GPIO ** ***************************************************************************/ __IO_REG32_BIT(IOPIN, 0xE0028000,__READ,__gpio_bits); __IO_REG32_BIT(IOSET, 0xE0028004,__READ_WRITE,__gpio_bits); __IO_REG32_BIT(IODIR, 0xE0028008,__READ_WRITE,__gpio_bits); __IO_REG32_BIT(IOCLR, 0xE002800C,__WRITE,__gpio_bits); __IO_REG32_BIT(FIO0DIR,0x3FFFC000,__READ_WRITE,__fgpio_bits); ... __IO_REG32_BIT(FIO0MASK,0x3FFFC010,__READ_WRITE,__fgpio_bits); ... __IO_REG32_BIT(FIO0PIN,0x3FFFC014,__READ_WRITE,__fgpio_bits); ... __IO_REG32_BIT(FIO0SET,0x3FFFC018,__READ_WRITE,__fgpio_bits); ... __IO_REG32_BIT(FIO0CLR,0x3FFFC01C,__WRITE ,__fgpio_bits); ... Как видите, все на месте
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
May 12 2009, 10:05
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(SasaVitebsk @ May 4 2009, 11:47)  Торжественно ввожу в проект строчку //#define FAST_GPIO // Поддержка кристаллов версии 01  Небольшой hint. Если определение FAST_GPIO задаете в коде, а не в строке компилятора, то вводите лучше #define FAST_GPIO FALSE // set to true when present вместо #ifdef/ifndef пользуйте #if FAST_GPIO ... тады парсеры текста лучше понимают что к чему, и по клику на "FAST_GPIO" сразу видно вкл или откл. FALSE/TRUE ессно должны быть определены раньше, как 0 и 1 ;>
|
|
|
|
|
Jun 1 2009, 11:09
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Между системной шиной и шиной портов стоит делитель ,по умолчанию он 1\4  ,просто сделано в целях экономии потребления Думаю Филипс не против от того ,что бы немного раскочегарить его периферию поменяв значение делителя. Фаст порты ,на мой взгляд,идут мимо периферии ,оставляя ее работать на малой скорости. Еще,фаст портам нужна своя инициализация,не наступи на эти грабли. Ну и еще ,для хорошей скорости нужен асм,в в доке на 2101\2103 там все расписано вместе с оциллограммами.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|