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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
Radist228
Родился
Сообщения: 15
Зарегистрирован: Ср ноя 25, 2015 18:05:40

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

Сообщение 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 скачиваний
Реклама
Аватара пользователя
scorpi_0n
Вымогатель припоя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

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

Сообщение 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 и так далее.
Реклама
Аватара пользователя
Radist228
Родился
Сообщения: 15
Зарегистрирован: Ср ноя 25, 2015 18:05:40

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

Сообщение Radist228 »

Спасибо. Все понял.
Раз уж затронулась тема типов переменных, то не подскажете как быть когда есть отрицательные значения, что тогда делать. Обычные uint32_t uint16_t не поставишь, приходится ставить тип переменной int, но это не оч. хорошо. пытался прописывать что-то вроде signed uint16_t,но компилятор не понимает и ругается
Аватара пользователя
scorpi_0n
Вымогатель припоя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

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

Сообщение scorpi_0n »

int32_t int16_t и т. д.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Radist228
Родился
Сообщения: 15
Зарегистрирован: Ср ноя 25, 2015 18:05:40

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

Сообщение Radist228 »

Большое спасибо! Все работает))
Реклама
Ответить

Вернуться в «ARM»