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

XIP — выполнение программы прямо из флеш-памяти

У многих современных микроконтроллеров нет встроенной флеш-памяти: программа лежит во внешней микросхеме SPI-флеш. Чтобы не копировать её в оперативную память, процессор выполняет код прямо из флеш через кэш. Это и называют XIP — execute in place.

Обновлено Редакция GAW

XIP (execute in place — «выполнение на месте») — режим, в котором процессор выполняет программу прямо из внешней флеш-памяти, не копируя её в оперативную. Он нужен микроконтроллерам без встроенной флеш: программа хранится в дешёвой отдельной микросхеме SPI- или QSPI-флеш нужного объёма.

Как устроено на RP2040. По даташиту Raspberry Pi у RP2040 нет встроенной энергонезависимой памяти. Внешняя флеш подключается по QSPI и отображается в адресное пространство процессора: обращение по адресу этой области превращается в чтение из флеш. Чтобы это не было медленно, между процессором и флеш стоит кэш:

Параметр кэша XIP RP2040Значение
Объём16 КБ
Организациядвухвходовый наборно-ассоциативный
Попадание1 такт
Адресуемая флешдо 16 МБ (24-разрядный адрес)

Одна и та же флеш видна по нескольким адресам с разной политикой: с кэшем, без обновления кэша, в обход кэша. А если кэш не нужен, его можно использовать как дополнительные 16 КБ ОЗУ. Raspberry Pi предупреждает: при отключённом кэше обращения идут к флеш напрямую, и выполнение кода сильно замедляется.

У RP2350 подсистема XIP та же по идее: по даташиту к интерфейсу QSPI подключают флеш или PSRAM, есть второй вывод выбора для ещё одной микросхемы, а строки кэша можно закрепить как ОЗУ.

Что это значит для программиста:

  • Промахи кэша стоят времени. Пока код в кэше, он выполняется быстро; при промахе процессор ждёт, пока данные придут из флеш по последовательной шине. Время выполнения становится менее предсказуемым — это аналог тактов ожидания у встроенной флеш.
  • Критичный код — в ОЗУ. Обработчики прерываний, работающие с жёсткими сроками, и функции, которые выполняются во время записи во флеш, размещают в оперативной памяти.
  • Запись во флеш. Пока флеш стирается или программируется, она не может отдавать код, а кэш нужно учитывать, — Raspberry Pi отмечает, что согласованность кэша важна именно при программировании флеш.

Внешнюю флеш используют и чипы Espressif — прошивка записывается в неё по адресам, описанным в статье о прошивке ESP32. Обзор чипов Raspberry Pi — в разделе RP2040 и RP2350.

Частые вопросы

Что такое XIP?

Execute in place — выполнение программы прямо из внешней флеш-памяти, без копирования в ОЗУ. По даташиту RP2040 у чипа нет встроенной флеш: код лежит во внешней микросхеме QSPI-флеш до 16 МБ, а процессор читает команды через кэш XIP на 16 КБ.

Почему код из XIP иногда работает медленно?

Из-за промахов кэша. Пока нужные команды лежат в кэше, они читаются за такт. При промахе кэш читает данные из внешней флеш по последовательному интерфейсу, и процессор ждёт. Raspberry Pi отмечает, что при отключённом кэше выполнение кода сильно замедляется. Критичные по времени функции поэтому размещают в ОЗУ.

Можно ли писать во флеш, из которой выполняется программа?

Только с осторожностью: на время стирания и записи флеш не может отдавать код. Поэтому функции, работающие в это время, размещают в ОЗУ. Raspberry Pi напоминает, что согласованность кэша нужно учитывать именно при программировании флеш.

Источники

  1. Raspberry Pi. RP2040 Datasheet (build-date 2025-02-20) — разд. 1 — нет встроенной энергонезависимой памяти, выполнение из внешней QSPI-флеш через кэш, до 16 МБ; разд. 2.6.3.1 — кэш XIP 16 КБ, двухвходовый, попадание за 1 такт, кэширует 24-разрядное адресное пространство флеш, зеркала адресов с разной политикой кэширования, режим использования кэша как дополнительного ОЗУ; при отключённом кэше обращения идут к флеш напрямую, и выполнение кода сильно замедляется
  2. Raspberry Pi. RP2350 Datasheet — разд. 1 — код может выполняться прямо из внешней памяти через подсистему XIP с кэшем, который значительно ускоряет работу; к интерфейсу QSPI подключают флеш и PSRAM, до 16 МБ плюс второй чип по второму выбору; кэш 16 КБ, строки можно закрепить как ОЗУ

Нашли ошибку?