AlexKai 0 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба STM32F407 настроен на частоту ядра 168МГц. Проверено через MCO, ошибки нет. Вот только простой декремент в цикле работает как на частоте 16МГц. Делаю простую задержку на 1 секунду while(nCount--), т.е. по идее nCount нужно начать со 168 000 000, но на деле всего 16 000 000. Как так? Вычитал что причина в Latency флеша, мол он не работает на больших частотах. Отсюда вопросы: ОЗУ тоже не работает на частоте ядра? nCount хранится не в ОЗУ? При чем тут флеш? как тогда заставить эту железку выполнять код на максимальной частоте? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба Ассемблерный листинг вам в монитор! Я на ассемблере делаю цикл за 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexKai 0 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба 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 Спасибо за пример) но смысл моего вопроса в том что весь код работает медленнее чем ожидалось. просто на цикле задержки это нагляднее проявляется Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба Just now, AlexKai said: по прежнему не понятна причина Так и мне непонятна! Но без листинга и знания содержимого FLASH_ACR можно гадать сколько угодно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба 2 минуты назад, AlexKai сказал: Спасибо за пример) но смысл моего вопроса в том что весь код работает медленнее чем ожидалось. просто на цикле задержки это нагляднее проявляется Просто у вас цикл выполняется за 10 тактов. От уровня оптимизации зависит. Там у вас и NOP-ы есть, я уверен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 57 30 ноября, 2020 Опубликовано 30 ноября, 2020 (изменено) · Жалоба 37 минут назад, aaarrr сказал: 42 минуты назад, AlexKai сказал: ОЗУ тоже не работает на частоте ядра? Работает на частоте ядра. На частоте ядра работает часть ОЗУ под названием TCM, остальное на половинной частоте. 24 минуты назад, ViKo сказал: От уровня оптимизации зависит. Думаю, что нет. Ибо никакая оптимизация не ускоряет(замедляет в данном случае) в 10 раз. 42 минуты назад, AlexKai сказал: Делаю простую задержку на 1 секунду while(nCount--), т.е. по идее nCount нужно начать со 168 000 000, но на деле всего 16 000 000. Нет не будет, ибо это не одна процессорная(ассемблерная) команда, а вообще быстродействие не так оценивается. Делается простой инкремент с зацикливанием, а таймер отсчитывает время 1 сек, по сработке прерывания, содержимое переменной инкремента переносится в другую, для отображения результата и т.д. По получении результата оценивается время операции инкремента и безусловного перехода (2 такта или 3 в зав-ти от типа перехода). Изменено 30 ноября, 2020 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба 5 минут назад, mantech сказал: Думаю, что нет. Ибо никакая оптимизация не ускоряет(замедляет в данном случае) в 10 раз. В 10 и не должно. А в 2 - может. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 57 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба 1 минуту назад, ViKo сказал: В 10 и не должно. А в 2 - может. Конечно, даже в 3 у меня как-то было, но не в 10... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба 7 minutes ago, mantech said: На частоте ядра работает часть ОЗУ под названием TCM, остальное на половинной частоте. Нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 57 30 ноября, 2020 Опубликовано 30 ноября, 2020 (изменено) · Жалоба 4 минуты назад, aaarrr сказал: 12 минут назад, mantech сказал: На частоте ядра работает часть ОЗУ под названием TCM, остальное на половинной частоте. Нет. Перепутал, CCM. "Этот блок памяти используется для выполнения критических процедур или для доступа к данным. Доступ к нему может получить только процессор. DMA доступ не разрешен. Эта память адресуется на максимальной частоте ядра без циклов ожидания." Изменено 30 ноября, 2020 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба 1 minute ago, mantech said: Перепутал, CCM. И CCM, и AHB RAM работают на одной частоте HCLK. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 57 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба 2 минуты назад, aaarrr сказал: И CCM, и AHB RAM работают на одной частоте HCLK. Уже давно с СТМом не работал, но это (про меньшую частоту) запомнил, иначе какой смысл в ССМ тогда - непонятно.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба 15 minutes ago, mantech said: Уже давно с СТМом не работал, но это (про меньшую частоту) запомнил, иначе какой смысл в ССМ тогда - непонятно.. Смысл в прямой шине мимо коммутатора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexKai 0 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба 1 час назад, ViKo сказал: Просто у вас цикл выполняется за 10 тактов. От уровня оптимизации зависит. Там у вас и NOP-ы есть, я уверен. каким образом? чему там 10 тактов выполняться? и откуда там нопам взяться? это всего пара инструкций. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться