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 напоминает, что согласованность кэша нужно учитывать именно при программировании флеш.
Источники
- Raspberry Pi. RP2040 Datasheet (build-date 2025-02-20) — разд. 1 — нет встроенной энергонезависимой памяти, выполнение из внешней QSPI-флеш через кэш, до 16 МБ; разд. 2.6.3.1 — кэш XIP 16 КБ, двухвходовый, попадание за 1 такт, кэширует 24-разрядное адресное пространство флеш, зеркала адресов с разной политикой кэширования, режим использования кэша как дополнительного ОЗУ; при отключённом кэше обращения идут к флеш напрямую, и выполнение кода сильно замедляется
- Raspberry Pi. RP2350 Datasheet — разд. 1 — код может выполняться прямо из внешней памяти через подсистему XIP с кэшем, который значительно ускоряет работу; к интерфейсу QSPI подключают флеш и PSRAM, до 16 МБ плюс второй чип по второму выбору; кэш 16 КБ, строки можно закрепить как ОЗУ
Нашли ошибку?
Смотрите также
- RP2040 и RP2350RP2040 и RP2350: ядра, память, GPIO, PIO, АЦП, 5 В на выводах, эрраты
- Прошивка ESP32Загрузчик ПЗУ, GPIO0 и автосброс, write-flash и адреса, ошибки esptool и питание
- SPI-флеш-памятьВыводы, страницы и секторы, команды, статус BUSY, время записи и стирания
- Такт ожиданияЛишние такты при обращении к медленной памяти: частоты, настройка, кэш