Перейти к содержанию
    

STM32F407 на частоте 168МГц код работает как на 16МГц (в 10 раз медленнее)

STM32F407 настроен на частоту ядра 168МГц. Проверено через MCO, ошибки нет.

Вот только простой декремент в цикле работает как на частоте 16МГц.

Делаю простую задержку на 1 секунду while(nCount--), т.е. по идее nCount нужно начать со 168 000 000, но на деле всего 16 000 000.

Как так? Вычитал что причина в Latency флеша, мол он не работает на больших частотах. Отсюда вопросы:

  1. ОЗУ тоже не работает на частоте ядра?
  2. nCount хранится не в ОЗУ? При чем тут флеш?
  3. как тогда заставить эту железку выполнять код на максимальной частоте?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, AlexKai said:

т.е. по идее nCount нужно начать со 168 000 000

Это по какой идее? Сколько тактов while(nCount--) занимает?

 

4 minutes ago, AlexKai said:

ОЗУ тоже не работает на частоте ядра?

Работает на частоте ядра.

 

5 minutes ago, AlexKai said:

nCount хранится не в ОЗУ? При чем тут флеш?

В регистре или ОЗУ, смотря как объявлена. Из флеш выполняется программа.

 

6 minutes ago, AlexKai said:

как тогда заставить эту железку выполнять код на максимальной частоте?

Включить кэширование и установить правильную латентность в FLASH_ACR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ассемблерный листинг вам в монитор!
Я на ассемблере делаю цикл за 4 такта.

/*!*****************************************************************************
  @author    ViKo
  @brief    Delay 4 clocks in cycle
  @param    CY4 - количество 4-тактовых циклов
  @note    Delay = 4 * CY4 - 1
  */
#pragma push
#pragma O3
__forceinline void DelayCY4(uint32_t CY4)
{
__asm {
LOOP:
    SUBS CY4, CY4, #1
    BNE LOOP
  }
}
#pragma pop 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, aaarrr сказал:

Это по какой идее? Сколько тактов while(nCount--) занимает?

 

Работает на частоте ядра.

 

В регистре или ОЗУ, смотря как объявлена. Из флеш выполняется программа.

 

Включить кэширование и установить правильную латентность в FLASH_ACR.

ну предположим что не 10 тактов =)

если все работает на частоте ядра, то по прежнему не понятна причина такой медленной работы цикла.

4 минуты назад, ViKo сказал:

Ассемблерный листинг вам в монитор!
Я на ассемблере делаю цикл за 4 такта.


/*!*****************************************************************************
  @author    ViKo
  @brief    Delay 4 clocks in cycle
  @param    CY4 - количество 4-тактовых циклов
  @note    Delay = 4 * CY4 - 1
  */
#pragma push
#pragma O3
__forceinline void DelayCY4(uint32_t CY4)
{
__asm {
LOOP:
    SUBS CY4, CY4, #1
    BNE LOOP
  }
}
#pragma pop 

 

Спасибо за пример) но смысл моего вопроса в том что весь код работает медленнее чем ожидалось. просто на цикле задержки это нагляднее проявляется

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, AlexKai said:

по прежнему не понятна причина

Так и мне непонятна! Но без листинга и знания содержимого FLASH_ACR можно гадать сколько угодно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, AlexKai сказал:

Спасибо за пример) но смысл моего вопроса в том что весь код работает медленнее чем ожидалось. просто на цикле задержки это нагляднее проявляется

Просто у вас цикл выполняется за 10 тактов. От уровня оптимизации зависит. Там у вас и NOP-ы есть, я уверен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

37 минут назад, aaarrr сказал:
42 минуты назад, AlexKai сказал:

ОЗУ тоже не работает на частоте ядра?

Работает на частоте ядра.

На частоте ядра работает часть ОЗУ под названием TCM, остальное на половинной частоте.

24 минуты назад, ViKo сказал:

От уровня оптимизации зависит.

Думаю, что нет. Ибо никакая оптимизация не ускоряет(замедляет в данном случае) в 10 раз.

42 минуты назад, AlexKai сказал:

Делаю простую задержку на 1 секунду while(nCount--), т.е. по идее nCount нужно начать со 168 000 000, но на деле всего 16 000 000.

Нет не будет, ибо это не одна процессорная(ассемблерная) команда, а вообще быстродействие не так оценивается. Делается простой инкремент с зацикливанием, а таймер отсчитывает время 1 сек, по сработке прерывания, содержимое переменной инкремента переносится в другую, для отображения результата и т.д.  По получении результата оценивается время операции инкремента и безусловного перехода (2 такта или 3 в зав-ти от типа перехода).

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, mantech сказал:

Думаю, что нет. Ибо никакая оптимизация не ускоряет(замедляет в данном случае) в 10 раз.

В 10 и не должно. А в 2 - может.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, ViKo сказал:

В 10 и не должно. А в 2 - может.

Конечно, даже в 3 у меня как-то было, но не в 10...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, mantech said:

На частоте ядра работает часть ОЗУ под названием TCM, остальное на половинной частоте.

Нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, aaarrr сказал:
12 минут назад, mantech сказал:

На частоте ядра работает часть ОЗУ под названием TCM, остальное на половинной частоте.

Нет.

Перепутал, CCM.

"Этот блок памяти используется для выполнения критических процедур или для доступа к данным. Доступ к нему может получить только процессор. DMA доступ не разрешен. Эта память адресуется на максимальной частоте ядра без циклов ожидания."

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, aaarrr сказал:

И CCM, и AHB RAM работают на одной частоте HCLK.

Уже давно с СТМом не работал, но это (про меньшую частоту) запомнил, иначе какой смысл в ССМ тогда - непонятно..

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 minutes ago, mantech said:

Уже давно с СТМом не работал, но это (про меньшую частоту) запомнил, иначе какой смысл в ССМ тогда - непонятно..

Screenshot_2020-11-30_14-55-03.png.1966d7736556ea520412c3ed6302eade.png

Смысл в прямой шине мимо коммутатора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, ViKo сказал:

Просто у вас цикл выполняется за 10 тактов. От уровня оптимизации зависит. Там у вас и NOP-ы есть, я уверен.

каким образом? чему там 10 тактов выполняться? и откуда там нопам взяться? это всего пара инструкций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...