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

 
 
 
Reply to this topicStart new topic
> Реальное время выполнения инструкций STM32F4xx
msn
сообщение Jun 27 2012, 11:01
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 1-01-06
Из: Украина, Киев
Пользователь №: 12 759



Разбираюсь с STM32F4xx, запустил его на 168 МГц (5.92 нс цикл) включены все КЕШи (FLASH->ACR = FLASH_ACR_DCEN | FLASH_ACR_ICEN | FLASH_ACR_PRFTEN | FLASH_ACR_LATENCY_5WS) выдаю на PA1 простой меандр:
Код
  while (1)
  {
     GPIOA->BSRR = GPIO_BSRR_BS_1;
    __nop();
    __nop();
    __nop();
    __nop();
    GPIOA->BSRR = GPIO_BSRR_BR_1;
    __nop();
    __nop();
    __nop();
    //__nop();    
  }


Компилируется так:
Код
STR      r1,[r0,#0x18]        
NOP                            
NOP                            
NOP                            
NOP                            
STR      r2,[r0,#0x18]
NOP      
NOP      
NOP      
B        |L1.6|


Смотрю в Keil (отладка на stm32f4discovery) States, все команды выполняются за 1 такт.
Смотрю осцилом, вижу, что 1 на PA1 - 30 нс (5 тактов), а 0 на PA1 - 35 нс (6 тактов), т.е. B |L1.6| выполняется вроде как за 2 такта, а Keil увеличивает States на +1.

Читал http://infocenter.arm.com/help/index.jsp?t...g/BABBCJII.html (If branch taken, pipeline reloads (two cycles are added), т.е. 3 цикла) и STM PM0081 Flash memory interface (про ART - все за 1 цикл), так толком и не понятно кому верить.

Где можно прочитать о времени выполнения инструкций STM32F4xx?
Как можно в Keil измерить это время?

Спасибо.
Go to the top of the page
 
+Quote Post
brag
сообщение Jun 27 2012, 11:58
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



1.Инструкции выполняются по логике конвеера,детально расписано в armv7 reference manual
2.Потом сами IO имеют задержку и лимит по частоте.
3.Потом выполнение команды следующей за STR не означает даже начала процесса реального обращения к памяти, см barriers, п.1
Верить конечно же armv7 reference manual. Но учитывать, что код может выполнятся с медленной памяти, те смотреть на даташит на контроллер надо еще.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 27 2012, 12:18
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(msn @ Jun 27 2012, 15:01) *
Читал http://infocenter.arm.com/help/index.jsp?t...g/BABBCJII.html (If branch taken, pipeline reloads (two cycles are added), т.е. 3 цикла) и STM PM0081 Flash memory interface (про ART - все за 1 цикл), так толком и не понятно кому верить.

Ну вот вы и нашли разницу между M3 и M4. Вот тут написано несколько иначе.
Go to the top of the page
 
+Quote Post
msn
сообщение Jun 27 2012, 17:27
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 1-01-06
Из: Украина, Киев
Пользователь №: 12 759



Спасибо за помощь.
Для M4 проморгал таблицу с Cycles.
Go to the top of the page
 
+Quote Post
msn
сообщение Jul 1 2012, 11:59
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 1-01-06
Из: Украина, Киев
Пользователь №: 12 759



Еще раз все перепроверил.

Разбираюсь с STM32F407.
Запустил его на 168 МГц (5.92 нс цикл) включены все FLASH->ACR = FLASH_ACR_DCEN | FLASH_ACR_ICEN | FLASH_ACR_PRFTEN | FLASH_ACR_LATENCY_5WS.
Выдаю на PA1 простой меандр:

Код
  PM_(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN) = 1;                           // GPIOA clock enabled
  PM_(GPIOA->MODER, GPIO_MODER_MODER1_0) = 1;                           // PA1 - General purpose output mode
  GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR1;                             // PA1 - 100 MHz High speed

  while (1)
  {
    GPIOA->BSRR = GPIO_BSRR_BS_1;
    GPIOA->BSRR = GPIO_BSRR_BR_1;  
    
    GPIOA->BSRR = GPIO_BSRR_BS_1;
    GPIOA->BSRR = GPIO_BSRR_BR_1;      
    
    GPIOA->BSRR = GPIO_BSRR_BS_1;
    GPIOA->BSRR = GPIO_BSRR_BR_1;  
    
    GPIOA->BSRR = GPIO_BSRR_BS_1;
    GPIOA->BSRR = GPIO_BSRR_BR_1;    

    GPIOA->BSRR = GPIO_BSRR_BS_1;
    GPIOA->BSRR = GPIO_BSRR_BR_1;    
  }

Компилируется так:
Код
STR      r1,[r0,#0x18]          
STR      r2,[r0,#0x18]

STR      r1,[r0,#0x18]          
STR      r2,[r0,#0x18]

STR      r1,[r0,#0x18]          
STR      r2,[r0,#0x18]

STR      r1,[r0,#0x18]          
STR      r2,[r0,#0x18]

STR      r1,[r0,#0x18]          
STR      r2,[r0,#0x18]

B        |L1.6|


На осциллографе вижу такой сигнал:
Прикрепленное изображение


Это означает что инструкция Branch выполняться на самом деле за 3 такта?
Я отлаживаю в Keil на stm32f4discovery.
На инструкции Branch счетчик циклов в Keil (States) увеличивается на +1.
Дополнительно использую SysTick и DWT->CYCCNT, они так же увеличивается на +1 на инструкции Branch.

Почему так? Кто-то врет, не может быть так как что бы один системный такт был то 6 ns, то 18 ns.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 1 2012, 15:59
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(msn @ Jul 1 2012, 15:59) *
Это означает что инструкция Branch выполняться на самом деле за 3 такта?

По-видимому так. Только в других ситуациях может быть иное число тактов, согласно информации по ссылке выше.
Кстати, есть еррата на STM32F4xx (chip revision A), там упоминается "ART Accelerator prefetch queue instruction is not supported".

Цитата(msn @ Jul 1 2012, 15:59) *
Я отлаживаю в Keil на stm32f4discovery.
На инструкции Branch счетчик циклов в Keil (States) увеличивается на +1.
Дополнительно использую SysTick и DWT->CYCCNT, они так же увеличивается на +1 на инструкции Branch.

Почему так? Кто-то врет, не может быть так как что бы один системный такт был то 6 ns, то 18 ns.

Имеется в виду симулятор? Скорее всего он не симулирует с точностью до такта, так что расхождения с жизнью не являются сюрпризом.
Go to the top of the page
 
+Quote Post
msn
сообщение Jul 1 2012, 16:07
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 126
Регистрация: 1-01-06
Из: Украина, Киев
Пользователь №: 12 759



Цитата(scifi @ Jul 1 2012, 18:59) *
Кстати, есть еррата на STM32F4xx (chip revision A), там упоминается "ART Accelerator prefetch queue instruction is not supported".

Использую Z ревизию.

Цитата(scifi @ Jul 1 2012, 18:59) *
Имеется в виду симулятор? Скорее всего он не симулирует с точностью до такта, так что расхождения с жизнью не являются сюрпризом.

Не отладка в железе на stm32f4discovery.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 1 2012, 16:16
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(msn @ Jul 1 2012, 20:07) *
Не отладка в железе на stm32f4discovery.

И отладчик показывает счётчик циклов? В любом случае, это не чистый эксперимент: остановка отладчиком может возмутить процессор. Осциллограф - наиболее объективный способ контроля.
Go to the top of the page
 
+Quote Post
Ndf
сообщение Jul 2 2012, 13:42
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 101
Регистрация: 22-08-07
Пользователь №: 29 977



Цитата(msn @ Jun 27 2012, 15:01) *
Разбираюсь с STM32F4xx, запустил его на 168 МГц (5.92 нс цикл) ...

Можем для интереса сравнить производительность с ADSP-BF518F (400Мгц), плата под рукой....кто кого сделает?) Например так, зажигаем светодиод, дальше делаем копирование внутренней памяти 1kB с одного места на другое (без ДМА) и гасим светодиод.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 14th July 2025 - 02:59
Рейтинг@Mail.ru


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