Существует множество микросхем NOR QSPI FLASH, которые поддерживают XIP (eXecute In Place). В этом режиме встроенный процессор (или MCU) может напрямую выполнять коды, хранящиеся во флэш-памяти. Но, как мы знаем, флэш-память qspi может выводить только 4-битные данные за такт, в то время как многим микроконтроллерам, таким как серия ARM Cortex-M, требуется 32-битная инструкция за такт. Таким образом, MCU должен ждать не менее 8 циклов, чтобы получить правильную инструкцию, что кажется очень медленным. Кроме того, максимальная частота флэш-памяти nor qspi часто ниже 150 МГц, а частота STM32F407 составляет 168 МГц, что означает более длительную задержку процессора для получения правильной инструкции.
Я не знаю, правильно ли я понимаю, но я действительно не смог найти много подробностей о XIP. В технических справочных руководствах STM32Fxxx только говорится, что они имеют встроенную флэш-память и поддерживают XIP, но не показывают никаких подробностей. Кроме того, я думаю, нам также нужно реализовать очень сложный контроллер QSPI в MCU для поддержки XIP.
Может ли кто-нибудь дать мне несколько рекомендаций по этому вопросу?
![[UX] Категории и настройки внешнего вида Flash-сообщений](https://i.imgur.com/5LZljB8b.jpeg)
Насколько я знаю, MCU использует буфер в оперативной памяти для чтения команд из внешней флэш-памяти, а затем выполняет их. Он читает их кусками. Теперь размер одного фрагмента очень сильно зависит от реализации каждого поставщика (т.е. сколько оперативной памяти доступно, как подключена флэш-память: SPI, Dual SPI, Quad SPI, Octal SPI, возможен ли прямой доступ к памяти (DMA), поддерживает ли флэш-память Режим непрерывного чтения). Таким образом, если фрагмент маленький, ядро остановится в ожидании инструкций. Если фрагмент большой, то он использует ОЗУ, а также при ветвлении фрагменты, которые уже были загружены в ОЗУ, будут перезагружены для нового кода.
Итак, допустим, что флэш-память подключена через Dual SPI, и возможен DMA. Тогда для XiP контроллер начнет выполнение кода загрузчика (обычно из некоторой внутренней памяти ПЗУ. Загрузчик настраивает контроллер флэш-памяти QSPI и DMA ядра для копирования инструкций из внешней флэш-памяти в буфер ОЗУ. Затем он начнет выполнение кода в этот буфер. Теперь DMA будет асинхронно копировать инструкции в ОЗУ. Это означает, что реальное ядро MCU почти не тратит время на копирование кода.
Вы сказали, что не смогли найти подробностей о XiP. Лучшим источником информации для меня были заметки по применению различных производителей. Реализации разные, но имеют много общего.
Вот 3 примера документов:
Микрочип AN44065 дает обзор XiP: http://ww1.microchip.com/downloads/en/AppNotes/Atmel-44065-Execute-in-Place-XIP-with-Quad-SPI-Interface-SAM-V7-SAM-E7-SAM-S7_Application-Note. пдф
ST.com AN5188, стр. 15, содержит сравнение производительности инструкций в ОЗУ и внешней флэш-памяти, которое может представлять особый интерес: https://www.st.com/content/ccc/resource/technical/document/application_note/group0/d8/39/10/2f/ee/c9/4b/19/DM00514974/files/DM00514974.pdf/jcr: содержание/переводы/en.DM00514974.pdf
ST.com AN4760 стр. 26 описывает, как можно добиться повышения скорости, и подробно описывает архитектуру XiP, в нем также есть несколько интересных формул: https://www.st.com/content/ccc/resource/technical/document/application_note/group0/b0/7e/46/a8/5e/c1/48/01/DM00227538/files/DM00227538.pdf/jcr: содержание/переводы/en.DM00227538.pdf
Во втором документе, который я добавил к своему ответу, есть сравнение скорости, и я был удивлен, увидев, что XiP не так сильно отстает от оперативной памяти. Таким образом, они должны использовать некоторые довольно умные схемы, чтобы получить производительность на уровне оперативной памяти. Если вы действительно хотите понять оптимизацию низкого уровня, которая делает это возможным, я думаю, что для этого потребуется больше, чем один ТАК вопрос и ответ :)
Спасибо, но я все еще в замешательстве. Я рассматриваю ситуацию, когда все коды пользовательских приложений хранятся в
an external qspi flash, кроме кодов загрузчика. Невозможно, чтобы nor flash работал быстрее, чем MCU. Многие высококачественные микроконтроллеры, такие как STM32H7xx, могут работать на частоте 400 МГц. Флэш-память qspi может выводить только 4 бита за каждый цикл. Кроме того, аппаратный контроллер QSPI должен отправлять байты команд во флэш-память перед чтением данных. В результате ядру MCU могут потребоваться десятки циклов для получения полной 32-битной инструкции, что кажется чрезвычайно медленным.