Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Реальное время выполнения инструкций STM32F4xx
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
msn
Разбираюсь с 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 измерить это время?

Спасибо.
brag
1.Инструкции выполняются по логике конвеера,детально расписано в armv7 reference manual
2.Потом сами IO имеют задержку и лимит по частоте.
3.Потом выполнение команды следующей за STR не означает даже начала процесса реального обращения к памяти, см barriers, п.1
Верить конечно же armv7 reference manual. Но учитывать, что код может выполнятся с медленной памяти, те смотреть на даташит на контроллер надо еще.
scifi
Цитата(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. Вот тут написано несколько иначе.
msn
Спасибо за помощь.
Для M4 проморгал таблицу с Cycles.
msn
Еще раз все перепроверил.

Разбираюсь с 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.
scifi
Цитата(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.

Имеется в виду симулятор? Скорее всего он не симулирует с точностью до такта, так что расхождения с жизнью не являются сюрпризом.
msn
Цитата(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.
scifi
Цитата(msn @ Jul 1 2012, 20:07) *
Не отладка в железе на stm32f4discovery.

И отладчик показывает счётчик циклов? В любом случае, это не чистый эксперимент: остановка отладчиком может возмутить процессор. Осциллограф - наиболее объективный способ контроля.
Ndf
Цитата(msn @ Jun 27 2012, 15:01) *
Разбираюсь с STM32F4xx, запустил его на 168 МГц (5.92 нс цикл) ...

Можем для интереса сравнить производительность с ADSP-BF518F (400Мгц), плата под рукой....кто кого сделает?) Например так, зажигаем светодиод, дальше делаем копирование внутренней памяти 1kB с одного места на другое (без ДМА) и гасим светодиод.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.