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

 
 
> Реальное время выполнения инструкций 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
 
Start new topic
Ответов
msn
сообщение Jul 1 2012, 11:59
Сообщение #2


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

Группа: Свой
Сообщений: 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
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #4


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

Группа: Свой
Сообщений: 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
Сообщение #5


Гуру
******

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



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

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



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 12:05
Рейтинг@Mail.ru


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