Страница 1 из 1

Выполняются лишние такты

Добавлено: Вт дек 08, 2015 17:54:03
Radist228
Здравствуйте. Начал изучать контроллеры STM32 на отладочной плате STM32F407DISCOVERY в программе keil uVision 4. Настроил PLL(На частоту тактирования контроллера 168 МГц).Как показано на рисунке ниже
takt.jpg
(79.97 КБ) 285 скачиваний
Написал вот такой код для проверки количества тактов выполнения цикла

int main(void)
{
SystemCoreClockUpdate();
SysTick_Config(SystemCoreClock/1000);
#define DWT_CYCCNT *(volatile unsigned long *)0xE0001004
#define DWT_CONTROL *(volatile unsigned long *)0xE0001000
#define SCB_DEMCR *(volatile unsigned long *)0xE000EDFC

while(1)
{
SCB_DEMCR |= 0x01000000;
DWT_CONTROL|= 1;
DWT_CYCCNT = 0;
for(i=0;i<=100;i++){}
count_tic = DWT_CYCCNT;
}
}

В результате получаю 1630 тактов на вычисление простого цикла, что очень много, SystemCoreClock выдает правильную частоту.Ниже на рисунке приведена проблема. Как уменьшить число тактов вычисления цикла, может кто знает, или я что-то не так понял?
for.jpg
(227.13 КБ) 395 скачиваний

Re: Выполняются лишние такты

Добавлено: Вт дек 08, 2015 18:58:11
scorpi_0n
1. Не смысла это всё определять. Хотя это и не критично.

#define DWT_CYCCNT *(volatile unsigned long *)0xE0001004
#define DWT_CONTROL *(volatile unsigned long *)0xE0001000
#define SCB_DEMCR *(volatile unsigned long *)0xE000EDFC

В новых CMSIS это уже всё давно определено. Инициализацию DWT пишем просто.

Код: Выделить всё

    
    CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
    DWT->CYCCNT       = 0;
    DWT->CTRL        |= DWT_CTRL_CYCCNTENA_Msk;

2. Настройка частоты не имеет никакого значания. DWT считает в машинных циклах независимо от частоты.
3. Держать в цикле инициализацию DWT

SCB_DEMCR |= 0x01000000;
DWT_CONTROL|= 1;
DWT_CYCCNT = 0;

тоже не имеет смысла. Хотя это тоже не критично.
4. На одну итерацию получаем 1630 / 101 = 16,13 машинных цикла. Много это или мало можно узнать только заглянув в листинг дизасма и настройки компилятора и на уровень оптимизации в частности.

И ещё. Избегайте неоднозначных unsigned long и им подобных. Пользуйтесь однозначными определениями uint32_t uint16_t и так далее.

Re: Выполняются лишние такты

Добавлено: Вт дек 08, 2015 19:57:31
Radist228
Спасибо. Все понял.
Раз уж затронулась тема типов переменных, то не подскажете как быть когда есть отрицательные значения, что тогда делать. Обычные uint32_t uint16_t не поставишь, приходится ставить тип переменной int, но это не оч. хорошо. пытался прописывать что-то вроде signed uint16_t,но компилятор не понимает и ругается

Re: Выполняются лишние такты

Добавлено: Вт дек 08, 2015 19:59:37
scorpi_0n
int32_t int16_t и т. д.

Re: Выполняются лишние такты

Добавлено: Вт дек 08, 2015 20:22:13
Radist228
Большое спасибо! Все работает))