Например TDA7294

Форум РадиоКот • Просмотр темы - Установка состояний ожиданий в регистре FLASH_ACR
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Пт июл 18, 2025 22:54:58

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Установка состояний ожиданий в регистре FLASH_ACR
СообщениеДобавлено: Чт дек 26, 2024 18:03:58 
Прорезались зубы

Зарегистрирован: Чт апр 08, 2021 09:46:48
Сообщений: 225
Рейтинг сообщения: 0
Доброго дня!
Разбираюсь и практикую работу с flash.
Камень - stm32f407vet6.
Создал проект(пустой) в cubeMX. В кубе установил частоту тактирования от кварца, на максимум(168Мгц), сгенерировал проект.
Прохожу под отладкой по программе и мониторю регистры FLASH.
При выполнении функции "HAL_Init()" в регистр FLASH_ACR устанавливается значение 0x00000700(то есть включается кеш данных, кеш команд и буфер предварительной выборки, при этом состояния ожидания равно 0). Здесь все понятно, ведь при установки частоты тактирования на максимум, для ускорения нужно включить буфер предварительной выборки, что бы было корректное считывание инструкций с flah. ведь flah работает на меньшой скорости нежели 168мгц.

Далее выполняется функция "SystemClock_Config()" и в ней включаются состояния ожиданий(5 ожиданий). Вопрос, зачем здесь включается состояния ожидания?

На сколько я знаю, состояния ожидания необходимо включать только в том случаи, когда устанавливается частота тактирования на максимум(168мгц) и буфер предварительной выборки отключен. Но если буфер предварительной выборки включен то состояния ожиданий не нужны, ведь благодаря буферу, при частоте 168мгц, считывания данных будет уже корректным.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Установка состояний ожиданий в регистре FLASH_ACR
СообщениеДобавлено: Чт дек 26, 2024 18:11:29 
Друг Кота
Аватар пользователя

Карма: 61
Рейтинг сообщений: 1537
Зарегистрирован: Вт окт 22, 2013 04:37:23
Сообщений: 3326
Откуда: Казань
Рейтинг сообщения: 0
Отключите ожидания вручную и посмотрите как будет работать.

Не исключено, что ожидания задействованы на всякий случай или просто по ошибке - считается, что HAL написан индусами, отчего лапши там может быть намешано направо и налево. То есть, расценивать HAL как истину в последней инстанции было бы ошибочным.

_________________
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезисты Ordyl Alpha 350 и AM 140.
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльная маска XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Установка состояний ожиданий в регистре FLASH_ACR
СообщениеДобавлено: Чт дек 26, 2024 20:13:11 
Встал на лапы

Зарегистрирован: Вт фев 15, 2022 21:28:35
Сообщений: 81
Рейтинг сообщения: 0
FLASH не успевает выставить данные на шину а процессор уже забирает то что есть (not valid data). В результате ядро начинает исполнять всякую фигню.
Латентность (latency) это количество тактов системной шины (ядра) ожидания, достаточное для того чтобы данные стали валидными. То есть проц делает запрос во FLASH, и ждет пока FLASH выставит на шину данные. Я 407 ставил на 192 МГц и латентность 2, все работает стабильно, на 256 МГЦ уже SRAM глючит.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Установка состояний ожиданий в регистре FLASH_ACR
СообщениеДобавлено: Чт дек 26, 2024 20:33:25 
Говорящий с текстолитом

Карма: -10
Рейтинг сообщений: 173
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1503
Рейтинг сообщения: 0
На сколько я знаю, состояния ожидания необходимо включать только в том случаи, когда устанавливается частота тактирования на максимум(168мгц) и буфер предварительной выборки отключен. Но если буфер предварительной выборки включен то состояния ожиданий не нужны, ведь благодаря буферу, при частоте 168мгц, считывания данных будет уже корректным.
Количество wait states никак не зависит от предварительной выборки. Зависит только от частоты CPU.
И wait states нужны не только при "частоте тактирования на максимум(168мгц)". А при любой частоте, превышающей возможности flash.


Вернуться наверх
 
Выбираем индустриальные и медицинские источники питания MEAN WELL в открытом исполнении

Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Установка состояний ожиданий в регистре FLASH_ACR
СообщениеДобавлено: Чт дек 26, 2024 20:44:48 
Мучитель микросхем

Зарегистрирован: Вт окт 01, 2024 15:22:33
Сообщений: 423
Рейтинг сообщения: 0
если буфер предварительной выборки включен то состояния ожиданий не нужны, ведь благодаря буферу, при частоте 168мгц, считывания данных будет уже корректным.

Корректные данные сначала должны быть из флеша корректно прочитаны, а уже потом они попадают(или не попадают) в буфер предвыборки.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Установка состояний ожиданий в регистре FLASH_ACR
СообщениеДобавлено: Пт дек 27, 2024 08:02:10 
Прорезались зубы

Зарегистрирован: Чт апр 08, 2021 09:46:48
Сообщений: 225
Рейтинг сообщения: 0
danone78 писал(а):
FLASH не успевает выставить данные на шину а процессор уже забирает то что есть (not valid data). В результате ядро начинает исполнять всякую фигню.
Латентность (latency) это количество тактов системной шины (ядра) ожидания, достаточное для того чтобы данные стали валидными. То есть проц делает запрос во FLASH, и ждет пока FLASH выставит на шину данные. Я 407 ставил на 192 МГц и латентность 2, все работает стабильно, на 256 МГЦ уже SRAM глючит.

Спасибо за ответы!
Состояния ожидания зависит от частоты CPU, но при подключении буфера предварительной выборке(БПВ), состояния ожидания не нужны, так как CPU уже будет брать инструкции из буфера, а не из флеш. Потому что за раз в буфер будет считано 4 слова(128бит), так как шина от интерфейса flash к, непосредственно, самим ячейкам 128 битная(в stm32f407vet6). То есть пока cpu будет считывать 4 инструкции с БПВ, уже пройдет достаточное время, что бы с flash уже можно было считывать следующие инструкции.

Добавлено after 2 minutes 28 seconds:
Отключите ожидания вручную и посмотрите как будет работать.

Не исключено, что ожидания задействованы на всякий случай или просто по ошибке - считается, что HAL написан индусами, отчего лапши там может быть намешано направо и налево. То есть, расценивать HAL как истину в последней инстанции было бы ошибочным.

сейчас попробую отключить и гляну. Но в теории должно все работать по идеи!


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: Установка состояний ожиданий в регистре FLASH_ACR
СообщениеДобавлено: Пт дек 27, 2024 10:11:03 
Мучитель микросхем

Зарегистрирован: Вт окт 01, 2024 15:22:33
Сообщений: 423
Рейтинг сообщения: 0
Состояния ожидания зависит от частоты CPU, но при подключении буфера предварительной выборке(БПВ), состояния ожидания не нужны, так как CPU уже будет брать инструкции из буфера, а не из флеш.

Еще раз, данные в буфере предвыборки не материализуются чудесным образом, они считываются из флеша по всем правилам, включая правильно заданные wait states. А задавать их нужно перед изменением частоты, потому SystemClock_Config() вполне подходящее для этого место.

maksimdag0 писал(а):
Потому что за раз в буфер будет считано 4 слова(128бит), так как шина от интерфейса flash к, непосредственно, самим ячейкам 128 битная(в stm32f407vet6). То есть пока cpu будет считывать 4 инструкции с БПВ, уже пройдет достаточное время, что бы с flash уже можно было считывать следующие инструкции.

Во-первых, в таком случае нельзя говорить, что состояния ожидания не нужны, они просто компенсируются. Во-вторых, это работает для последовательного кода, пока не попадется инструкция прыгающая куда-то в другое место.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Установка состояний ожиданий в регистре FLASH_ACR
СообщениеДобавлено: Пт дек 27, 2024 14:00:57 
Говорящий с текстолитом

Карма: -10
Рейтинг сообщений: 173
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1503
Рейтинг сообщения: 0
Еще раз, данные в буфере предвыборки не материализуются чудесным образом, они считываются из флеша по всем правилам, включая правильно заданные wait states. А задавать их нужно перед изменением частоты
+++

Во-первых, в таком случае нельзя говорить, что состояния ожидания не нужны, они просто компенсируются. Во-вторых, это работает для последовательного кода, пока не попадется инструкция прыгающая куда-то в другое место.
+++

А кроме переходов есть ещё например чтение констант из флеша. Или чтение векторов прерываний из таблицы прерываний. Или maksimdag0 думает, что у него в коде совсем нет констант? 8)
Количество wait states никак не зависит от предварительной выборки. Зависит только от частоты CPU.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Установка состояний ожиданий в регистре FLASH_ACR
СообщениеДобавлено: Пт дек 27, 2024 16:35:19 
Прорезались зубы

Зарегистрирован: Чт апр 08, 2021 09:46:48
Сообщений: 225
Рейтинг сообщения: 0
В таком случаи мое представление о flash памяти не совсем верное.

Я понял это так: состояния ожидания имеет смысл, когда мы увеличиваем частоту cpu, которая превосходит максимальную частоту flash и при этом буфер предвыборки выключен. То есть если установили 3 состояния ожидания, то на первый такт идет считывания инструкции, последующие 3 так-то пропускаются(cpu ожидает) и на 4ый такт считывается следующая инструкция.

Исходя из ваших доводов, получается что состояния ожидания нужно включать всегда(в независимости от включения бпв), если частота cpu превышает максимальную частоту работы flash? Если да, то почему, не совсем понял? Условно допустим если код выполняется последовательно, без переходов.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Установка состояний ожиданий в регистре FLASH_ACR
СообщениеДобавлено: Пт дек 27, 2024 17:37:09 
Говорящий с текстолитом

Карма: -10
Рейтинг сообщений: 173
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1503
Рейтинг сообщения: 0
Исходя из ваших доводов, получается что состояния ожидания нужно включать всегда(в независимости от включения бпв), если частота cpu превышает максимальную частоту работы flash? Если да, то почему, не совсем понял? Условно допустим если код выполняется последовательно, без переходов.
Сами подумайте - что будет если процессор встретит инструкцию перехода? А целевого адреса инструкции нет в кеше? Да, в этом случае будет обращение к флешу. И процессор должен ждать указанное число тактов завершения этого обращения.
Но даже в случае линейного выполнения кода, не всегда предвыборка будет успевать работать. Ведь ширина шины доступа к флешу - не бесконечная. Ширина шины к флеши у вашего МК = всего 128 бит. Для частоты 168МГц в мануале указано, что CPU требуется 6 тактов на чтение флешь. Из таблицы flash LATENCY "Table 11. Number of wait states according to CPU clock (HCLK) frequency" в мануале можно посчитать макс.частоту чтения флешь. Для 3.3V она = 150/5 = 30МГц

Теперь предположим - у вас тяжёлый линейный вычислительный код. В котором множество 32-битных инструкций. Допустим буфер предвыборки при 168МГц прочитал 128бит из флеши. Потратил на это 6 тактов. 128бит/32=4 инструкции. Всего 4 инструкции! Которые все могут быть однотактовыми и процессор выполнит их за 4 такта. А на чтение следующих 128 бит ему нужно 6 тактов. Т.е. - 2 тактов уже не хватает. Вот здесь, если во FLASH_ACR указано правильное значение (5 wait states), то CPU 2 такта подождёт. Если вы там указали неверное значение wait states, но вместо пачки инструкций CPU прочитает из буфера предвыборки какой-то мусор. Который и выполнит.

PS: Кроме того, думая о линейном выполнении кода, вы почему-то всегда забываете про чтение данных из флешь. А если, в то время как буфер предвыборки читает данные из флешь, какая-то из команд ещё и захочет данные из того же флеша прочитать? Ведь флешь та же самая, и быстрее 30 МГц работать не может. А значит - чтение данных из флеша будет делить такты частоты флешь (30МГц) с буфером предвыборки. Дополнительно замедляя его работу.
А ещё бывает что и другим bus-мастерам нужно читать флешь. DMA например.

Все они должны делить доступ к флешь между собой. И для всех них используется FLASH_ACR.LATENCY.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Установка состояний ожиданий в регистре FLASH_ACR
СообщениеДобавлено: Пт дек 27, 2024 20:17:28 
Прорезались зубы

Зарегистрирован: Чт апр 08, 2021 09:46:48
Сообщений: 225
Рейтинг сообщения: 0
Значит состояния ожидания нужно включать всегда если частота cpu больше чем частота flash, понятно.
Спасибо!)


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y