|
Ногодрыгание у 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?
|
|
|
|
|
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 ;>
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|