23 października 2018

Wydajność procesora i wpływ pamięci flash

Tym razem kilka słów o wydajności układu - wiadomo producent podaje niesamowite parametry, ale jak to wygląda faktycznie? Niech testem będzie zwykłe zwiększanie wartości zmiennej. Pomiar będzie wykonywany co 1ms, test polega na ustaleniu do ilu program jest w stanie doliczyć.
Testując program szybko odkryłem, że dodawanie nie jest operacją atomową, stąd wyłączanie przerwań. To oczywiście spowalnia działanie programu, ale chociaż daje powtarzalne wyniki. Pierwsza wersja programu używa wbudowanego generatora 8MHz i nie ma dodatkowych instrukcji NOP. Testy będą polegały na dokładaniu instrukcji pustych i pomiarze ich wpływu.
Kod programu testowego:

#include "stm32f0xx.h"

volatile uint32_t counter;
volatile uint32_t counter_shadow;

void clock_init(void)
{
    RCC->CFGR = RCC_CFGR_PLLSRC_HSI_DIV2 | RCC_CFGR_PLLMUL12;
 RCC->CR |= RCC_CR_PLLON;
    while ((RCC->CR & RCC_CR_PLLRDY) == 0) ;

 FLASH->ACR |= FLASH_ACR_LATENCY;

    RCC->CFGR |= RCC_CFGR_SW_PLL;
    while ((RCC->CFGR & RCC_CFGR_SWS_PLL) != RCC_CFGR_SWS_PLL) ;
}

void SysTick_Handler(void)
{
 counter_shadow = counter;
 counter = 0;
}

int main(void)
{
 //clock_init();

 SysTick_Config(8000);

 while (1)
 {
  __disable_irq();
  counter++;
  //asm volatile ("nop");
  //asm volatile ("nop");
  //asm volatile ("nop");
  __enable_irq();
 }
}

A teraz wyniki:
  • bez nop: 568
  • 1 nop: 530
  • 2 nop-y: 497
  • 3 nop-y: 468
W ciągu 1ms wykonywanych jest 8000 cykli zegara - jak widać maksymalny wynik licznika to 568, to nieco mniej niż można byłoby oczekiwać.

Dużo ciekawiej jest natomiast, gdy użyjemy taktowania 48MHz.
  • bez nop: 2283
  • 1 nop: 2085
  • 2 nop-y: 1998
  • 3 nop-y: 1844
Tutaj mamy dwa wnioski, pierwszy dla mnie niespodziewany to raptem 4 krotny wzrost wydajności przy 6 krotnym wzroście częstotliwości taktowania.
Drugi wniosek, tym razem spodziewany, to wpływ opóźnień dostępu do pamięci flash na działanie programu. Widać to na małej różnicy w wydajności programu z jedną i dwoma instrukcjami nop. Po prostu dodatkowy dostęp do pamięci zajmuje i tak cykl zegara, stąd podobna wydajność.



Brak komentarzy:

Prześlij komentarz