Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2740
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Управление Flash-памятью

563

21.5. Задержка чтения Flash-памяти и ускоритель ART™ Accelerator

В Главе 1 мы увидели, что ядра Cortex-M предоставляют n-ступенчатый8 конвейер инструкций, предназначенный для ускорения выполнения программы. Однако этот конвейер должен заполняться машинными инструкциями, обычно хранящимися во Flashпамяти. Данная операция является существенным узким местом, поскольку Flashпамять медленнее тактовой частоты ЦПУ.

Если и ЦПУ, и Flash-память работают с одинаковой скоростью, ЦПУ может заполнять свой внутренний конвейер без каких-либо промахов (penalty)9. Например, микроконтроллер STM32F401RE, работающий на тактовой частоте ниже 30 МГц, может получить доступ к Flash-памяти без задержек. К сожалению, в более производительных микроконтроллерах требуется чередовать два последовательных доступа к Flash-памяти с одной или несколькими (в некоторых случаях даже до десяти) задержками, называемыми состояниями ожидания (wait states). Состояния ожидания соответствуют аппаратным «циклам активного ожидания», выполняемым за один или несколько тактовых циклов ЦПУ, и они являются способом синхронизации ЦПУ с более медленной Flashпамятью. Состояния ожидания значительно снижают эффективную производительность процессора. Это ограничение обычно устраняется с помощью выделенной кэшпамяти.

Конфигурирование точного количества необходимых состояний ожидания является критически важным шагом, который зависит от конкретного рассматриваемого вами микроконтроллера STM32. Данная операция обычно выполняется во время конфигурации SYSCLK, поскольку чем выше частота ЦПУ, тем больше требуется состояний ожидания. Конфигурирование правильного количества состояний ожидания имеет решающее значение, особенно когда мы увеличиваем частоту ЦПУ: мы должны установить правильное количество состояний ожидания, прежде чем увеличивать частоту ЦПУ, иначе сгенерируется отказ шины BusFault. Однако CubeMX разработан для абстрагирования от этих подробностей и генерирует правильный код конфигурации в зависимости от конкретного микроконтроллера STM32 и требуемой частоты ядра (взгляните на код внутри

процедуры SystemClock_Config()).

Компания ST разработала отличительную технологию, доступную в более мощных микроконтроллерах STM32: ускоритель ART™ Accelerator. Ускоритель ART™ Accelerator – это технология пула кэша (см. рисунок 2), внешнего по отношению к ядру Cortex-M, который может обнулять действие состояний ожидания. Ускоритель ART™ Accelerator спроектирован таким образом, что он сохраняет гарвардскую архитектуру микроконтроллеров Cortex-M, предоставляя отдельные пулы кэш-памяти для I-Bus

и D-Bus.

8Точное количество ступеней конвейера зависит от конкретного ядра Cortex-M.

9Говорить о «скорости» в этом контексте неуместно, потому что мы должны говорить о «задержке», необходимой для выполнения операций машины. Эта задержка, по существу, формируется временем, необходимым ЦПУ для декодирования и выполнения инструкции машины, плюс временем, необходимым контроллеру Flash-памяти для извлечения необходимой инструкции из памяти NVM. Однако здесь нас интересует тот факт, что этим двум «устройствам» (ЦПУ и Flash-памяти с ее контроллером) может потребоваться различное количество времени для выполнения их действий.

Управление Flash-памятью

564

Рисунок 2: Основные блоки, формирующие ускоритель ART™ Accelerator

Ускоритель ART™ Accelerator состоит из:

буфера предварительной выборки инструкций;

выделенного кэша инструкций для уменьшения влияния ветвления;

кэша данных для литеральных пулов;

алгоритма планирования шины AHB, который облегчает доступ ЦПУ к контроллеру Flash-памяти через шину D-Bus.

Давайте проанализируем точную роль этих технологий.

Буфер предварительной выборки инструкций

Когда ЦПУ обращается к Flash-памяти, оно не извлекает один байт за раз, а обычно считывает от 64 до 256 бит за раз в зависимости от конкретного микроконтроллера STM32. Эти биты содержат разное количество инструкций, и по этой причине они называются строками инструкций (instruction lines): если предположить, что ЦПУ считывает 128 бит (это то, что происходит в микроконтроллерах STM32F4), они могут содержать четыре 32-битных инструкции или восемь 16-битных инструкций (зависит от того, работает ли ЦПУ в режиме thumb или нет). Таким образом, в случае последовательного кода необходимо, по крайней мере, четыре тактовых цикла ЦПУ для выполнения предыдущей считанной строки инструкций. Предварительная выборка на шине I-Bus может использоваться для считывания следующей последовательной строки инструкций из Flashпамяти, пока ЦПУ запрашивает текущую строку инструкций. Эта функция полезна, если для доступа к Flash-памяти требуется хотя бы одно состояние ожидания.

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

PREFETCH_ENABLE значение 1 в файле stm32xxxx_hal_conf.h.

Кэш-память инструкций

Содержимое буфера предварительной выборки может быть аннулировано из-за ветвления. Чтобы ограничить время, потерянное из-за переходов, можно сохранить заданное количество строк инструкций в кэш-памяти инструкций. Каждый раз, когда происходит потеря (запрошенные данные отсутствуют в текущей используемой строке инструкций, в предварительно выбранной строке инструкций или в кэш-памяти инструкций), считанная строка копируется в кэш-память инструкций. Если ЦПУ запрашивает данные, содержащиеся в кэш-памяти инструкций, они предоставляются без вставки какой-либо задержки. После того, как все «пустые» строки кэш-памяти инструкций заполнены, для определения строки, подлежащей замене в кэш-памяти инструкций, используется