реклама на сайте
подробности

 
 
> Как оценить время в Keil, Не могу посчитать количество тактов
Nikitoc
сообщение Mar 16 2010, 14:30
Сообщение #1


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Всем здравствуйте. Я недавно перепрыгнул (вернее нахожусь в прыжке) с PIC'ов на ARM'ы. После привычного Mplab'a Keil кажется враждебным biggrin.gif А если конкретней мне никак не удается оценить количество тактов за которое выполняется команда. В Mplab'e есть очень удобный инструмент Stopwatch - который, собственно, за все эти ф-ции отвечает. А в Keil'e такого нет. Посоветуйте, как мерить время (в тактах, или наносекундах) выполнения команд. Пишу на Си. Камень at91sam7s256.
Да, и еще, если разогнать проц до 80Мгц и выполнять программу из оперативной памяти, будут ли быстрее выполняться команды обращения к портам? Мне нужно максимально быстро их сканировать для считывания видео с простенькой CMOS-камеры.

Сообщение отредактировал Nikitoc - Mar 16 2010, 14:35
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Nikitoc
сообщение Mar 19 2010, 12:23
Сообщение #2


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Типа отчет, о том что получилось. Тестовая программка:
Код
while (1) {
    AT91C_BASE_PIOA -> PIO_SODR = AT91C_BASE_PIOA -> PIO_SODR | 0x00000800;           //  PA11    = 1
    AT91C_BASE_PIOA -> PIO_CODR = AT91C_BASE_PIOA -> PIO_CODR | 0x00000800;           //  PA11    = 0
}

Мне удалось разогнать процессор (at91sam7s256) до 100 Мгц.
При выполнении программы из ОЗУ период меандра на ножке PA11 был примерно 200 нс.
И это при тактовом цикле 10нс!
Дизассемблер показал, что изменение состояния ножки занимает 4-5 команд:
Код
   319:         while (1) {
0x00102CE0  EA000008  B         0x00102D08
   320:         AT91C_BASE_PIOA -> PIO_SODR = AT91C_BASE_PIOA -> PIO_SODR | 0x00000800;     //  PA11      = 1
0x00102CE4  E3A00000  MOV       R0,#0x00000000
0x00102CE8  E5100BD0  LDR       R0,[R0,#-0x0BD0]
0x00102CEC  E3800B02  ORR       R0,R0,#0x00000800
0x00102CF0  E3A01000  MOV       R1,#0x00000000
0x00102CF4  E5010BD0  STR       R0,[R1,#-0x0BD0]
   321:         AT91C_BASE_PIOA -> PIO_CODR = AT91C_BASE_PIOA -> PIO_CODR | 0x00000800;                   //  PA11     = 0
0x00102CF8  E3A00000  MOV       R0,#0x00000000
0x00102CFC  E5100BCC  LDR       R0,[R0,#-0x0BCC]
0x00102D00  E3800B02  ORR       R0,R0,#0x00000800
0x00102D04  E5010BCC  STR       R0,[R1,#-0x0BCC]
   319:         while (1) {
0x00102D08  EAFFFFF5  B         0x00102CE4

Если каждая команда будет выполняться ровно 2 такта, то все складывается. Но, если я не ошибаюсь, у армов большинство команд выполняется за один такт. Может кто-нибудь подскажет, в чем дело?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 19 2010, 13:24
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Nikitoc @ Mar 19 2010, 15:23) *
Мне удалось разогнать процессор (at91sam7s256) до 100 Мгц.

Что за стремление разогнать процессор, даже не попытавшись сначала освоить работу с ним в штатном режиме?

Цитата(Nikitoc @ Mar 19 2010, 15:23) *
Но, если я не ошибаюсь, у армов большинство команд выполняется за один такт.

Ошибаетесь. Только MOV и ORR в приведенном листинге выполняются за один такт.

Цитата(Nikitoc @ Mar 19 2010, 15:23) *
Может кто-нибудь подскажет, в чем дело?

Оптимизатор надо было включить. Ну и на чтениях порта теряете время.
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Mar 19 2010, 13:47
Сообщение #4


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Цитата(aaarrr @ Mar 19 2010, 17:24) *
Ошибаетесь. Только MOV и ORR в приведенном листинге выполняются за один такт.


А не подскажете, случайно, где можно подробно посмотреть время исполнения (в тактах) ассемблерных команд?

Цитата
Оптимизатор надо было включить. Ну и на чтениях порта теряете время.


Ну да. При включенной оптимизации по времени 3-го уровня компилятор сократил код до 3-х команд:

Код
   319:            AT91C_BASE_PIOA -> PIO_CODR = AT91C_BASE_PIOA -> PIO_CODR | 0x00000800;
0x00102BC4  E5140BCC  LDR       R0,[R4,#-0x0BCC]
0x00102BC8  E3800B02  ORR       R0,R0,#0x00000800
0x00102BCC  E5040BCC  STR       R0,[R4,#-0x0BCC]
   320:                 AT91C_BASE_PIOA -> PIO_SODR = AT91C_BASE_PIOA -> PIO_SODR | 0x00000800;
0x00102BD0  E5140BD0  LDR       R0,[R4,#-0x0BD0]
0x00102BD4  E3800B02  ORR       R0,R0,#0x00000800
0x00102BD8  E5040BD0  STR       R0,[R4,#-0x0BD0]
   318:          while (1) {
0x00102BDC  EAFFFFF8  B         0x00102BC4

Но измерить разницу (увидеть на осциллографе) в периоде мне не удалось. Я имею в виду, что период так и остался равным примерно 200 нс...

А по поводу разгона... так я ж говорил это мне видео хочется поснимать biggrin.gif При таких условиях мне удается захватить примерно 3,5 fps (QCIF 176x144). Но меня ограничивает скорость COM-порта PC - 115200. Поэтому следующий этап - освоение SPI и DMA. Хочется сделать потоковую запись на SD-карточку. Если это конечно будет иметь смысл (по скорости).

Сообщение отредактировал Nikitoc - Mar 19 2010, 13:48
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 19 2010, 14:14
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Nikitoc @ Mar 19 2010, 16:47) *
А не подскажете, случайно, где можно подробно посмотреть время исполнения (в тактах) ассемблерных команд?

В даташите на ARM7TDMI.

Цитата(Nikitoc @ Mar 19 2010, 16:47) *
Но измерить разницу (увидеть на осциллографе) в периоде мне не удалось. Я имею в виду, что период так и остался равным примерно 200 нс...

Было 22 такта, стало 19. Уберите чтение PIO_SODR и PIO_CODR - это регистры только для записи. И почитайте даташит на процессор.
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Mar 19 2010, 14:27
Сообщение #6


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Цитата(aaarrr @ Mar 19 2010, 18:14) *
В даташите на ARM7TDMI.
Было 22 такта, стало 19. Уберите чтение PIO_SODR и PIO_CODR - это регистры только для записи. И почитайте даташит на процессор.

:-) Все, я ушел просвещаться. Спасибо за помощь.
P.S. Хотя по поводу PIO_SODR и PIO_CODR я не понял.
Код
AT91C_BASE_PIOA -> PIO_CODR = AT91C_BASE_PIOA -> PIO_CODR | 0x00000800

Я здесь вроде не читаю, а записываю...
Как это сделать - на асме или на Си тоже можно?

Сообщение отредактировал Nikitoc - Mar 19 2010, 14:42
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 19 2010, 20:37
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Nikitoc @ Mar 19 2010, 17:27) *
Код
AT91C_BASE_PIOA -> PIO_CODR = AT91C_BASE_PIOA -> PIO_CODR | 0x00000800

Я здесь вроде не читаю, а записываю...
Как это сделать - на асме или на Си тоже можно?

Читаете, естественно. Откуда иначе возьмется содержимое PIO_CODR, над которым производится операция bitwise OR?

Если принять во внимание совершенную бесполезность чтения PIO_CODR (вредность, точнее, ибо никто даже не гарантирует,
что из этого регистра будет считан 0, хотя на практике это и так), то останется:
Код
AT91C_BASE_PIOA->PIO_CODR = 0x00000800;

И этот код даст точно такой же результат.

P.S. Запись вида a |= 1 вместо a = a | 1 делает код гораздо более удобочитаемым.
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Mar 19 2010, 22:45
Сообщение #8


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Огромное спасибо за пояснения уважаемым гуру. Я, видите ли, не силен в arm-ассемблере (в СИ тоже не профессор biggrin.gif ), знаю более-менее только микрочиповский, для 8-битников, но это совсем другое дело . С этим чтением запутался вообще. В общем сделал как вы рекомендовали и скомпилилось компактней:
Код
0x00103C14  E3A01B02  MOV       R1,#0x00000800
0x00103C18  E3A00000  MOV       R0,#pI2C(0x00000000)
0x00103C1C  E5001BD0  STR       R1,[R0,#-0x0BD0]
  3169:       AT91C_BASE_PIOA -> PIO_CODR =  0x00000800;
0x00103C20  E5001BCC  STR       R1,[R0,#-0x0BCC]
0x00103C24  EAFFFFFC  B         0x00103C1C

здесь:
Код
AT91S_TWI  * pI2C = AT91C_BASE_TWI;
#define AT91C_BASE_TWI       (AT91_CAST(AT91PS_TWI)     0xFFFB8000) // (TWI) Base Address


Вроде бы (особенно с вашими разъяснениями) код стал понятен, кроме строки:
Код
0x00103C18  E3A00000  MOV       R0,#pI2C(0x00000000)

Как я не отнимал от 0xFFFB8000 0x0BD0 и 0x0BCC, базовых адресов регистров PIO_CODR (0xFFFFF434) PIO_SODR (0xFFFFF430) я не получил wacko.gif . Что я неправильно понимаю? Почему нельзя занести в регистр R0 значение не pI2C, а pPIO? Относительно него смещения были бы меньше.

Сообщение отредактировал Nikitoc - Mar 19 2010, 22:47
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 19 2010, 22:51
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Nikitoc @ Mar 20 2010, 01:45) *
Вроде бы (особенно с вашими разъяснениями) код стал понятен, кроме строки:
Код
0x00103C18  E3A00000  MOV       R0,#pI2C(0x00000000)

Как я не отнимал от 0xFFFB8000 0x0BD0 и 0x0BCC, базовых адресов регистров PIO_CODR (0xFFFFF434) PIO_SODR (0xFFFFF430) я не получил. Что я неправильно понимаю? Почему нельзя занести в регистр R0 значение не pI2C, а pPIO? Относительно него смещения были бы меньше.

А почему от 0xFFFB8000, а не от 0, как, собственно, и написано в команде? 0 - 0x0BD0 = 0xFFFFF430; 0 - 0x0BCC = 0xFFFFF434
Откуда в листинге взялся pI2C - остается только гадать. Вполне допускаю, что это просто своеобразный глюк дизассемблера.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Nikitoc   Как оценить время в Keil   Mar 16 2010, 14:30
- - aaarrr   Цитата(Nikitoc @ Mar 16 2010, 17:30) Посо...   Mar 16 2010, 15:09
|- - Nikitoc   Цитата(aaarrr @ Mar 16 2010, 19:09) Debug...   Mar 16 2010, 18:48
|- - aaarrr   Цитата(Nikitoc @ Mar 16 2010, 21:48) А ес...   Mar 16 2010, 19:31
|- - Nikitoc   Цитата(aaarrr @ Mar 16 2010, 22:31) И бли...   Mar 16 2010, 20:24
- - aaarrr   Поподробнее можно посмотреть в даташите. Если крат...   Mar 16 2010, 20:30
|- - Nikitoc   Угу, ясненько. И если можно последний моментик: Вы...   Mar 16 2010, 20:39
- - aaarrr   Периферия находится на "медленной" шине ...   Mar 16 2010, 20:46
|- - Nikitoc   Цитата(aaarrr @ Mar 16 2010, 23:46) Периф...   Mar 16 2010, 20:53
||- - RabidRabbit   Цитата(Nikitoc @ Mar 19 2010, 17:27) Я зд...   Mar 19 2010, 20:29
|- - defunct   Цитата(Nikitoc @ Mar 19 2010, 15:47) А не...   Mar 21 2010, 00:23
- - toweroff   ЦитатаAT91C_BASE_PIOA -> PIO_SODR = AT91C_BASE_...   Mar 19 2010, 20:04
- - Nikitoc   Хм. Ну ладно, но нафига тогда эта петрушка со смещ...   Mar 19 2010, 23:11
- - aaarrr   Потому что в 32 бита команды не получится упихать ...   Mar 19 2010, 23:15
- - Nikitoc   Да я вообще и пытаюсь это делать. Но блин, тяжело ...   Mar 19 2010, 23:27
|- - aaarrr   Цитата(Nikitoc @ Mar 20 2010, 02:27) Да я...   Mar 19 2010, 23:39
- - Nikitoc   Пасибки. Попробую дочитать хотя бы до половины ...   Mar 20 2010, 09:49
- - aaarrr   По такой логике LDR и STR должны занимать одинаков...   Mar 21 2010, 01:11
|- - defunct   Цитата(aaarrr @ Mar 21 2010, 03:11) По та...   Mar 21 2010, 01:34
|- - aaarrr   Цитата(defunct @ Mar 21 2010, 04:34) ...А...   Mar 21 2010, 01:47
|- - defunct   Цитата(aaarrr @ Mar 21 2010, 03:47) И мож...   Mar 21 2010, 02:09
- - Nikitoc   Продолжаю терзать at91sam7s256. Привожу код котор...   Apr 6 2010, 15:59
|- - aaarrr   Цитата(Nikitoc @ Apr 6 2010, 19:59) ...те...   Apr 6 2010, 16:08
|- - Nikitoc   Цитата(aaarrr @ Apr 6 2010, 19:08) Предла...   Apr 6 2010, 16:26
|- - aaarrr   Цитата(Nikitoc @ Apr 6 2010, 20:26) Такое...   Apr 6 2010, 16:39
|- - Nikitoc   Цитата(aaarrr @ Apr 6 2010, 19:39) А он в...   Apr 6 2010, 16:44
- - aaarrr   pP_M_C чему равен? И зачем вообще использовать эти...   Apr 6 2010, 17:12
|- - Nikitoc   ЦитатаpP_M_C чему равен? И зачем вообще использова...   Apr 6 2010, 17:27
- - aaarrr   Для write only есть соответствующие status-регистр...   Apr 6 2010, 17:29
|- - Nikitoc   Цитата(aaarrr @ Apr 6 2010, 20:29) Провер...   Apr 6 2010, 17:33
- - Nikitoc   Вот здесь http://electronix.ru/forum/index.php?sho...   Apr 6 2010, 19:02
- - aaarrr   Цитата(Nikitoc @ Apr 6 2010, 23:02) ...я ...   Apr 6 2010, 19:21
- - Nikitoc   Проблема решилась. Оказалось что SD-шка мертвая. П...   Apr 7 2010, 09:52


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 20:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01475 секунд с 7
ELECTRONIX ©2004-2016