|
Производительность ARM, Olimex LPC-L2294 Performance |
|
|
|
Aug 24 2010, 10:15
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 20-09-05
Пользователь №: 8 746

|
Начал пробовать ARM LPC2294(Плата Olimex LPC-L2294). Получаю, на мой взгляд, очень странный резултат. кварц на плате 14 MHz, PLL Множитель = 3. Компилирую - IAR EWARM v5.50, Prcessor mode - Arm, Optimisation - High(speed). так инициализирую PLL Код void LPC2294PLLInit(void) { PLLCFG_bit.MSEL = 2; PLLCFG_bit.PSEL = 1; PLLCON_bit.PLLE = 1; PLLCON_bit.PLLC = 1; PLLFEED_bit.FEED = 0xAA; PLLFEED_bit.FEED = 0x55; } и выполняется код Код unsigned char a_buf[255]; for(unsigned char i=0; i<100; i++) { a_buf[i]=i; } На выполнение этого кода, процессору требуется примерно 100us, что мне кажется очень много. После разрешения прерываний по таймеру(прерывание каждый 15us, обработчик выполняется 7us), это время становится 800us и это уже катастрофически много. я ожидал увеличения примерно в два раза. Не понятно что не так делаю, не могу поверить что, LPC2294 не может работать быстрее Канечно по такому описанию проблемы, трудно посоветовать,  но если кто проходил через это, буду рад любой подсказке.
|
|
|
|
|
Aug 24 2010, 11:47
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 20-09-05
Пользователь №: 8 746

|
Цитата Также можно измерить это косвенно, выведя частоту на какую-нибудь ножку. Либо аппаратно, либо программно накрайняк. Да именно так я измеряю время выполнения кода(Осцилографом). попробую Jlink-ом тоже. спасибо  Я плохо разбираюсь в деталях тактирования и циклов ARM, но должен работать на много быстрее да? или я ошибаюсь и не надо ожидать большей производительности? Но такую произвадительност обеспечивает например ATmega16 на 8MHz, с компиляцией без оптимизаций  при пустом цикле Код unsigned char a_buf[255]; for(unsigned char i=0; i<100; i++) { //a_buf[i]=i; } время выполнения 5us. Запись в рам требует столько времени? a_buf будет расположена в внутреннем RAM, так?
|
|
|
|
|
Aug 24 2010, 12:26
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 20-09-05
Пользователь №: 8 746

|
Цитата Вообще то подсоединять его нужно только после того, как он запустится и настроится на частоту - после установки бита PLOCK так? Код PLLCON_bit.PLLE = 1; while(!PLLSTAT_bit.PLOCK); PLLCON_bit.PLLC = 1; Да, проверил PLLSTAT PLLE=1, PLLC=1, PLOCK=1
|
|
|
|
|
Aug 24 2010, 12:33
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(Dato @ Aug 24 2010, 16:26)  так? Код PLLCON_bit.PLLE = 1; while(!PLLSTAT_bit.PLOCK); PLLCON_bit.PLLC = 1; Да. Только не забудьте каждый раз после записи в PLLCON про feed sequence в PLLFEED. Можете привести ассемблерный листинг функции?
|
|
|
|
|
Aug 24 2010, 12:37
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Dato @ Aug 24 2010, 14:15)  Начал пробовать ARM ... и выполняется код Код unsigned char a_buf[255]; for(unsigned char i=0; i<100; i++) { a_buf[i]=i; } Нативнм типом для ARM является int а не unsigned char...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Aug 24 2010, 12:45
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 20-09-05
Пользователь №: 8 746

|
Цитата Можете привести ассемблерный листинг функции? Код void LPC2294PLLInit(void) 76 { 77 PLLCFG_bit.MSEL = 3; \ LPC2294PLLInit: \ 00000000 ........ LDR R0,??DataTable9_2 ;; 0xe01fc080 \ 00000004 041090E5 LDR R1,[R0, #+4] \ 00000008 1F10C1E3 BIC R1,R1,#0x1F \ 0000000C 031081E3 ORR R1,R1,#0x3 \ 00000010 041080E5 STR R1,[R0, #+4] 78 PLLCFG_bit.PSEL = 1; \ 00000014 041090E5 LDR R1,[R0, #+4] \ 00000018 6010C1E3 BIC R1,R1,#0x60 \ 0000001C 201081E3 ORR R1,R1,#0x20 \ 00000020 041080E5 STR R1,[R0, #+4] 79 80 81 82 83 PLLCON_bit.PLLE = 1; \ 00000024 001090E5 LDR R1,[R0, #+0] \ 00000028 011081E3 ORR R1,R1,#0x1 \ 0000002C 001080E5 STR R1,[R0, #+0] 84 PLLCON_bit.PLLC = 1; \ 00000030 001090E5 LDR R1,[R0, #+0] \ 00000034 021081E3 ORR R1,R1,#0x2 \ 00000038 001080E5 STR R1,[R0, #+0] 85 86 __disable_interrupt(); \ 0000003C 00100FE1 MRS R1,CPSR \ 00000040 C01081E3 ORR R1,R1,#0xC0 \ 00000044 01F021E1 MSR CPSR_c,R1 87 PLLFEED_bit.FEED = 0xAA; \ 00000048 0C1090E5 LDR R1,[R0, #+12] \ 0000004C FF10C1E3 BIC R1,R1,#0xFF \ 00000050 AA1081E3 ORR R1,R1,#0xAA \ 00000054 0C1080E5 STR R1,[R0, #+12] 88 PLLFEED_bit.FEED = 0x55; \ 00000058 0C1090E5 LDR R1,[R0, #+12] \ 0000005C FF10C1E3 BIC R1,R1,#0xFF \ 00000060 551081E3 ORR R1,R1,#0x55 \ 00000064 0C1080E5 STR R1,[R0, #+12] 89 } \ 00000068 1EFF2FE1 BX LR ;; return \ 0000006C REQUIRE _A_PLLCON \ 0000006C REQUIRE _A_PLLCFG \ 0000006C REQUIRE _A_PLLFEED
|
|
|
|
|
Aug 24 2010, 12:50
|
Частый гость
 
Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371

|
Цитата при пустом цикле время выполнения 5us. Запись в рам требует столько времени? a_buf будет расположена в внутреннем RAM, так? При пустом цикле и включенной оптимизации компилятор вероятно выкинет и объявление переменной, и сам цикл, так что это скорее всего просто время на переключение пина, по которому вы замеряете время выполнения.
|
|
|
|
|
Aug 24 2010, 12:54
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 20-09-05
Пользователь №: 8 746

|
Код Нативнм типом для ARM является int а не unsigned char... Не понял, если Вы имеете ввиду разрядность то да, но при обращении к байтам в памяти, должна падать Производительность ?
|
|
|
|
|
Aug 24 2010, 12:57
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(Dato @ Aug 24 2010, 16:45)  Код void LPC2294PLLInit(void) Нет, я имел ввиду код цикла, по которому измеряется время выполнения. Цитата(Юрий Санвальд @ Aug 24 2010, 16:50)  При пустом цикле и включенной оптимизации компилятор вероятно выкинет и объявление переменной, и сам цикл, так что это скорее всего просто время на переключение пина, по которому вы замеряете время выполнения. Время переключения пина, равное пяти микросекундам? Что-то слишком медленно, тут должны быть десятки/сотни наносекунд.
|
|
|
|
|
Aug 24 2010, 13:13
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 20-09-05
Пользователь №: 8 746

|
Цитата При пустом цикле и включенной оптимизации компилятор вероятно выкинет и объявление переменной, и сам цикл, так что это скорее всего просто время на переключение пина, по которому вы замеряете время выполнения. Да Вы прави, об этом не подумал. но значит все еще хуже. 5us только чтоб 100 раз переключить пин Это функция Код void test() { for(unsigned char i=0; i < 100; i++) { //outBuf[i]=i; } if(outBuf[99]==99) { IO1SET = 0x00100000; } for(unsigned char i=0; i < 100; i++) { //inBuf[i]=i; } if(inBuf[99]==99) { IO1CLR = 0x00100000; } } листинг Код 190 void test() 191 { 192 for(unsigned char i=0; i < 100; i++) 193 { 194 //outBuf[i]=i; 195 } 196 if(outBuf[99]==99) \ test: \ 00000000 ........ LDR R0,??DataTable23_7 \ 00000004 0C1090E5 LDR R1,[R0, #+12] \ 00000008 6310D1E5 LDRB R1,[R1, #+99] \ 0000000C 630051E3 CMP R1,#+99 197 { 198 IO1SET = 0x00100000; \ 00000010 ........ LDREQ R1,??DataTable23;; 0xe0028014 \ 00000014 4029A003 MOVEQ R2,#+1048576 \ 00000018 00208105 STREQ R2,[R1, #+0] 199 } 200 for(unsigned char i=0; i < 100; i++) 201 { 202 //inBuf[i]=i; 203 } 204 if(inBuf[99]==99) \ 0000001C 080090E5 LDR R0,[R0, #+8] \ 00000020 6300D0E5 LDRB R0,[R0, #+99] \ 00000024 630050E3 CMP R0,#+99 205 { 206 IO1CLR = 0x00100000; \ 00000028 ........ LDREQ R0,??DataTable23;; 0xe0028014 \ 0000002C 4019A003 MOVEQ R1,#+1048576 \ 00000030 08108005 STREQ R1,[R0, #+8] 207 } 208 } \ 00000034 1EFF2FE1 BX LR ;; return \ 00000038 REQUIRE _A_IO1SET \ 00000038 REQUIRE _A_IO1CLR 209
Сообщение отредактировал Dato - Aug 24 2010, 13:15
|
|
|
|
|
Aug 24 2010, 13:38
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 20-09-05
Пользователь №: 8 746

|
сейчас у меня такой код Код void test() { IO1SET = 0x00100000; IO1CLR = 0x00100000; }
main() { ....
for(;;) { test(); } } пин в "1" в течении 0.4us и пин в "0" в течении 1.7us Цитата Это не функция, а ужас какой-то  Да, но переключает, просто оптимизатор как то странно оптимизиравал, оставил сравнения но выкину переходы
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|