|
Скорость махания ногами lpc1343 |
|
|
|
Jan 16 2011, 09:16
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 3-05-08
Пользователь №: 37 238

|
Здравствуйте, начал осваивать кортексы, взял пример моргания светодиодом, заодно решил проверить максимальную скорость махания ногами, получилось, что при частоте 72мГц максимальная скорость коммутации ~ 0,5мГц. Использовал стандартную функцию: GPIO_SetValue(0, 7); GPIO_ClearValue(0, 7); из примера IARARM 5.50 для lpc1343 SystemTick. Как я понял управление осуществляется через: Код typedef struct { union { __IO uint32_t MASKED_ACCESS[4096]; struct { uint32_t RESERVED0[4095]; __IO uint32_t DATA; }; }; uint32_t RESERVED1[4096]; __IO uint32_t DIR; __IO uint32_t IS; __IO uint32_t IBE; __IO uint32_t IEV; __IO uint32_t IE; __IO uint32_t RIS; __IO uint32_t MIS; __IO uint32_t IC; } LPC_GPIO_TypeDef;
void GPIO_SetValue(uint8_t portNum, uint32_t bitValue) { LPC_GPIO_TypeDef *pGPIO = GPIO_GetPointer(portNum);
if (pGPIO != NULL) { pGPIO->DATA |= (0x1<<bitValue);
} }
void GPIO_ClearValue(uint8_t portNum, uint32_t bitValue) { LPC_GPIO_TypeDef *pGPIO = GPIO_GetPointer(portNum);
if (pGPIO != NULL) { pGPIO->DATA &= ~(0x1<<bitValue); } } что при выполнении вылилось в 53такта на смену состояния, что соответствует ~0,5мГц. Собственно вопрос: можно ли достичь большей скорости используя эти библиотеки и можно ли напрямую использовать регистр GPIOnDATA для управления состоянием вывода поскольку в хедере этих регистров не нашел.
|
|
|
|
2 страниц
< 1 2
|
 |
Ответов
(15 - 29)
|
Jan 19 2011, 14:57
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 3-05-08
Пользователь №: 37 238

|
И опять вы правы, HARMHARM, хоть вход и не cs, но выполняет аналогичную функцию, а то, что не совсем spi так гдеж его найдешь настоящий  . В общем - Спасибо.
|
|
|
|
|
Jan 19 2011, 16:54
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 8-12-10
Пользователь №: 61 494

|
так дрыгать ногами можно быстрее....
static __INLINE void GPIOSetValue( uint32_t portNum, uint32_t bitPosi, uint32_t bitVal ) { LPC_GPIO[portNum]->MASKED_ACCESS[(1<<bitPosi)] = (bitVal<<bitPosi); }
|
|
|
|
|
Jan 19 2011, 18:09
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 3-05-08
Пользователь №: 37 238

|
А у меня, вроде, за один такт получилось (хотя в реальной программе это мало пригодится), но только для pin8-pin11 порта, а для pin0-pin7 два такта (так и не понял почему компилятор так разложил?). Максимальная оптимизация по скорости IAR 5.50 Код LPC_GPIO0->DATA = 0x800; LPC_GPIO0->DATA = 0; LPC_GPIO0->DATA = 0x800; LPC_GPIO0->DATA = 0; LPC_GPIO0->DATA = 0x800; LPC_GPIO0->DATA = 0; LPC_GPIO0->DATA = 0x800; LPC_GPIO0->DATA = 0;
0x424: 0xf44f 0x6100 MOV.W r1, #2048 ; 0x800 0x428: 0x2200 MOVS r2, #0 LPC_GPIO0->DATA = 0x800; ??main_1: 0x42a: 0x6001 STR r1, [r0] LPC_GPIO0->DATA = 0; 0x42c: 0x6002 STR r2, [r0] LPC_GPIO0->DATA = 0x800; 0x42e: 0x6001 STR r1, [r0] LPC_GPIO0->DATA = 0; 0x430: 0x6002 STR r2, [r0] LPC_GPIO0->DATA = 0x800; 0x432: 0x6001 STR r1, [r0] LPC_GPIO0->DATA = 0; 0x434: 0x6002 STR r2, [r0] LPC_GPIO0->DATA = 0x800; 0x436: 0x6001 STR r1, [r0] LPC_GPIO0->DATA = 0; 0x438: 0x6002 STR r2, [r0] 0x43a: 0xe7f6 B.N ??main_1 ; 0x42a 0x43c: 0x0000 MOVS r0, r0 0x43e: 0x0000 MOVS r0, r0 ??DataTable2: 0x440: 0x10000458 DC32 SysTickCnt
LPC_GPIO0->DATA = 0x80; LPC_GPIO0->DATA = 0; LPC_GPIO0->DATA = 0x80; LPC_GPIO0->DATA = 0; LPC_GPIO0->DATA = 0x80; LPC_GPIO0->DATA = 0; LPC_GPIO0->DATA = 0x80; LPC_GPIO0->DATA = 0;
0x422: 0x480c LDR.N r0, ??DataTable2_3 [0x454]; GPIO0DATA LPC_GPIO0->DATA = 0x80; ??main_1: 0x424: 0x2180 MOVS r1, #128 ; 0x80 0x426: 0x6001 STR r1, [r0] LPC_GPIO0->DATA = 0; 0x428: 0x2100 MOVS r1, #0 0x42a: 0x6001 STR r1, [r0] LPC_GPIO0->DATA = 0x80; 0x42c: 0x2180 MOVS r1, #128 ; 0x80 0x42e: 0x6001 STR r1, [r0] LPC_GPIO0->DATA = 0; 0x430: 0x2100 MOVS r1, #0 0x432: 0x6001 STR r1, [r0] LPC_GPIO0->DATA = 0x80; 0x434: 0x2180 MOVS r1, #128 ; 0x80 0x436: 0x6001 STR r1, [r0] LPC_GPIO0->DATA = 0; 0x438: 0x2100 MOVS r1, #0 0x43a: 0x6001 STR r1, [r0] LPC_GPIO0->DATA = 0x80; 0x43c: 0x2180 MOVS r1, #128 ; 0x80 0x43e: 0x6001 STR r1, [r0] LPC_GPIO0->DATA = 0;
Сообщение отредактировал alexey_z83 - Jan 19 2011, 18:32
|
|
|
|
|
Jan 19 2011, 18:57
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 3-05-08
Пользователь №: 37 238

|
CYCLECOUNTER — в симуляторе разве не кол-во тактов показывает? Если так то команда STR (как и смена состояния вывода) выполняется за один такт.
|
|
|
|
|
Jan 19 2011, 19:01
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 3-05-08
Пользователь №: 37 238

|
Как расценивать ваш ответ?
|
|
|
|
|
Jan 19 2011, 19:12
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 3-05-08
Пользователь №: 37 238

|
Хорошо, завтра посмотрю осциллографом, я так понял если частота будет 36mHz, т. е. тактовая(72)/2 тогда ...симулятор истребителя F16 похож на реальный F16  .
|
|
|
|
|
Jan 20 2011, 14:52
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 3-05-08
Пользователь №: 37 238

|
Помогите с ответами на вопросы:
1). В документе DDI0337H_cortex_m3_r2p0_trm.pdf от ARM напротив команды STR стоит два такта и ссылка на:
Neighboring load and store single instructions can pipeline their address and data phases. This enables these instructions to complete in a single execution cycle.
Как я понял в некоторых случаях команда может быть выполнена за один такт?
2). В юзермануале в разделе Flash memory access говориться, что при частоте выше 40mHz требуется 2 такта на доступ.
От величины этой задержки будет зависеть время выполнения команды(в тактах)?, просто в ARM7 NXP есть модуль MAM который компенсировал такты ожидания читая 128 бит за раз, а сколько lpc13xx за раз с flash памяти читает не нашел.
Просто хотел разобраться сколько конкретная команда для конкретного контролера выполняется.
|
|
|
|
|
Jan 23 2011, 13:50
|
Частый гость
 
Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977

|
Цитата(alexey_z83 @ Jan 20 2011, 17:52)  1). В документе DDI0337H_cortex_m3_r2p0_trm.pdf от ARM напротив команды STR стоит два такта и ссылка на:
Neighboring load and store single instructions can pipeline their address and data phases. This enables these instructions to complete in a single execution cycle. А в DDIO337G ( это предыдущая версия ) чуть по другому: b. Generally, load-store instructions take two cycles for the first access and one cycle for each additional access. Stores with immediate offsets take one cycle. Так что, увы, проверять надо. И будет эта штука сильно процессрозависящей.
|
|
|
|
|
Mar 18 2011, 08:52
|
Группа: Новичок
Сообщений: 1
Регистрация: 18-03-11
Пользователь №: 63 683

|
У меня получалось частоту переключения разогнать до 2Мгц на 72Мгц. используй этот код .equ STACK_TOP, 0x10002000 .text .global _start .thumb .syntax unified _start: .word STACK_TOP,start .type start,function .org 0x124 start: ldr.w r0,=0x50008000 @ адресс GPIO0DIR ldr.w r1,=0x00000000 ldr.w r2,=0xFFFFFFFFF str.w r2,[r0] @ порт 0 все порты на выход ldr.w r0,=0x50003FFC @ адресс GPIO0DATA aaaa: str.w r1,[r0] @ порт в 0 dsb.w @ синхронизация str.w r2,[r0] @ порт в 1 dsb.w bx aaaa Весь код написан в thumb2 инструкциях для увеличения бысродействия. Инструкция синхронизации dsb нужна для того что бы значение успело записать в память, так как запись происходит не непосредственно в память а через буфер шины. Если ее не вставить на осцилографе вместо меандра будут палки. Цитата(Kostia87 @ Mar 18 2011, 11:30)  У меня получалось частоту переключения разогнать до 2Мгц на 72Мгц. используй этот код .equ STACK_TOP, 0x10002000
.text .global _start .thumb .syntax unified _start: .word STACK_TOP,start .type start,function
.org 0x124 start: ldr.w r0,=0x50008000 @ адресс GPIO0DIR ldr.w r1,=0x00000000 ldr.w r2,=0xFFFFFFFFF str.w r2,[r0] @ порт 0 все порты на выход ldr.w r0,=0x50003FFC @ адресс GPIO0DATA aaaa: str.w r1,[r0] @ порт в 0 dsb.w @ синхронизация str.w r2,[r0] @ порт в 1 dsb.w b.w aaaa Изменил код переход нужен b.w , а не bx весь код с инициализацией ФАПЧ следующий. .equ STACK_TOP, 0x10002000 .text .global _start .thumb .syntax unified _start: .word STACK_TOP,start .type start,function .org 0x124 start: bl SYS_TACT_INIT ldr.w r0,=0x50008000 @ адресс GPIO0DIR ldr.w r1,=0x00000000 ldr.w r2,=0xFFFFFFFFF str.w r2,[r0] @ порт 0 все порты на выход ldr.w r0,=0x50003FFC @ адресс GPIO0DATA aaaa: str.w r1,[r0] @ порт в 0 dsb.w @ синхронизация str.w r2,[r0] @ порт в 1 dsb.w b.w aaaa SYS_TACT_INIT: push {lr} ldr.w r1,=0x00000001 ldr.w r2,=0x00000000 ldr.w r0,=PDRUNCFG str.w r3,[r0] bic.w r3,#0xA0 ldr.w r3,[r0] ldr.w r0,=SYSPLLCLKSEL str.w r1,[r0] dsb ldr.w r0,=SYSPLLUEN str.w r2,[r0] dsb str.w r1,[r0] bl SYS_PLL_72MHZ ldr.w r0,=MAINCLKSEL ldr.w r3,=0x00000003 str.w r3,[r0] dsb ldr.w r0,=MAINCLKUEN str.w r2,[r0] dsb str.w r1,[r0] ldr.w r0,=SYSAHBCLKCTRL ldr.w r1,[r0] ldr.w r2,=0x00001000 orr.w r1,r2 str.w r1,[r0] dsb pop {pc} SYS_PLL_72MHZ: push {r0-r2} ldr.w r0,=SYSPLLCTRL ldr.w r1,=0x00000005 str.w r1,[r0] dsb ldr.w r0,=SYSPLLSTAT SYS_2: ldr.w r1,[r0] ldr.w r2,=0x00000001 ands.w r2,r1 bne.w SYS_2 pop {r0-r2} bx lr
Сообщение отредактировал Kostia87 - Mar 18 2011, 08:34
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|