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:
A teraz wyniki:
Dużo ciekawiej jest natomiast, gdy użyjemy taktowania 48MHz.
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ść.
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
Dużo ciekawiej jest natomiast, gdy użyjemy taktowania 48MHz.
- bez nop: 2283
- 1 nop: 2085
- 2 nop-y: 1998
- 3 nop-y: 1844
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