Здравствуйте. Начал изучать контроллеры STM32 на отладочной плате STM32F407DISCOVERY в программе keil uVision 4. Настроил PLL(На частоту тактирования контроллера 168 МГц).Как показано на рисунке ниже
Написал вот такой код для проверки количества тактов выполнения цикла
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 выдает правильную частоту.Ниже на рисунке приведена проблема. Как уменьшить число тактов вычисления цикла, может кто знает, или я что-то не так понял?
Выполняются лишние такты
- Реклама
Re: Выполняются лишние такты
1. Не смысла это всё определять. Хотя это и не критично.
#define DWT_CYCCNT *(volatile unsigned long *)0xE0001004
#define DWT_CONTROL *(volatile unsigned long *)0xE0001000
#define SCB_DEMCR *(volatile unsigned long *)0xE000EDFC
В новых CMSIS это уже всё давно определено. Инициализацию DWT пишем просто.
2. Настройка частоты не имеет никакого значания. DWT считает в машинных циклах независимо от частоты.
3. Держать в цикле инициализацию DWT
SCB_DEMCR |= 0x01000000;
DWT_CONTROL|= 1;
DWT_CYCCNT = 0;
тоже не имеет смысла. Хотя это тоже не критично.
4. На одну итерацию получаем 1630 / 101 = 16,13 машинных цикла. Много это или мало можно узнать только заглянув в листинг дизасма и настройки компилятора и на уровень оптимизации в частности.
И ещё. Избегайте неоднозначных unsigned long и им подобных. Пользуйтесь однозначными определениями uint32_t uint16_t и так далее.
#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;
3. Держать в цикле инициализацию DWT
SCB_DEMCR |= 0x01000000;
DWT_CONTROL|= 1;
DWT_CYCCNT = 0;
тоже не имеет смысла. Хотя это тоже не критично.
4. На одну итерацию получаем 1630 / 101 = 16,13 машинных цикла. Много это или мало можно узнать только заглянув в листинг дизасма и настройки компилятора и на уровень оптимизации в частности.
И ещё. Избегайте неоднозначных unsigned long и им подобных. Пользуйтесь однозначными определениями uint32_t uint16_t и так далее.
Re: Выполняются лишние такты
Спасибо. Все понял.
Раз уж затронулась тема типов переменных, то не подскажете как быть когда есть отрицательные значения, что тогда делать. Обычные uint32_t uint16_t не поставишь, приходится ставить тип переменной int, но это не оч. хорошо. пытался прописывать что-то вроде signed uint16_t,но компилятор не понимает и ругается
Раз уж затронулась тема типов переменных, то не подскажете как быть когда есть отрицательные значения, что тогда делать. Обычные uint32_t uint16_t не поставишь, приходится ставить тип переменной int, но это не оч. хорошо. пытался прописывать что-то вроде signed uint16_t,но компилятор не понимает и ругается
Re: Выполняются лишние такты
int32_t int16_t и т. д.
Re: Выполняются лишние такты
Большое спасибо! Все работает))
- Реклама

