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

Регистры XIP RP2040

Регистры блока XIP RP2040, через который программа выполняется прямо из внешней флеш-памяти: управление кэшем, его сброс, счётчики попаданий и потоковое чтение флеш-памяти в FIFO для DMA.

Программа RP2040 хранится во внешней флеш-памяти на QSPI и выполняется прямо из неё. Чтобы не ждать флеш-память на каждом обращении, блок XIP держит кэш объёмом 16 КБ — двухканальный, с попаданием за один такт (даташит RP2040, раздел 2.6.3).

Если кэш выключить, его память становится ещё одним банком SRAM на 16 КБ по адресу 0x1500 0000. Сброс кэша регистром FLUSH очищает только теги, а данные в памяти остаются, поэтому содержимое такой SRAM переживает сброс кэша.

Для больших объёмов есть потоковое чтение: адрес задают в STREAM_ADDR, число слов — в STREAM_CTR, и блок в свободных тактах шины QSPI перекладывает данные в FIFO, откуда их забирает DMA.

ЭкземплярБазовый адрес
XIP_CTRL0x1400 0000

В RP2350 блок XIP устроен иначе — регистры и поля отличаются, они описаны на странице «Регистры XIP_CTRL RP2350».

Регистры блока

РегистрСмещениеНазначениеПосле сброса
XIP_CTRL0x00Управление кэшем0x0000 0003
XIP_FLUSH0x04Сброс кэша0x0000 0000
XIP_STAT0x08Состояние кэша и FIFO потокового чтения0x0000 0002
XIP_CTR_HIT0x0CСчётчик попаданий в кэш0x0000 0000
XIP_CTR_ACC0x10Счётчик обращений к XIP0x0000 0000
XIP_STREAM_ADDR0x14Адрес потокового чтения0x0000 0000
XIP_STREAM_CTR0x18Число слов потокового чтения0x0000 0000
XIP_STREAM_FIFO0x1CFIFO потокового чтения0x0000 0000

XIP_CTRL — управление кэшем

Смещение 0x00, адрес 0x1400 0000, после сброса 0x0000 0003. Макросы pico-sdk: XIP_CTRL_…

1514131211109876543210
—POWER_DOWN—ERR_BADWRITEEN
  • POWER_DOWN (бит 3, чтение и запись, после сброса 0x0) — Отключение питания памяти кэша: содержимое сохраняется, но недоступно; заодно выключает кэш.
  • ERR_BADWRITE (бит 1, чтение и запись, после сброса 0x1) — Запись в кэшируемые области, кроме основной, вызывает ошибку шины; при 0 такие записи игнорируются.
  • EN (бит 0, чтение и запись, после сброса 0x1) — Включение кэша; без кэша все обращения идут прямо во флеш-память, а сам кэш доступен как SRAM.

XIP_FLUSH — сброс кэша

Смещение 0x04, адрес 0x1400 0004, после сброса 0x0000 0000, сбрасывается сам. Макросы pico-sdk: XIP_FLUSH_…

Отдельных полей нет: значение занимает бит 0, остальные биты не используются.

XIP_STAT — состояние кэша и FIFO потокового чтения

Смещение 0x08, адрес 0x1400 0008, после сброса 0x0000 0002. Макросы pico-sdk: XIP_STAT_…

1514131211109876543210
—FIFO_FULLFIFO_EMPTYFLUSH_READY
  • FIFO_FULL (бит 2, только чтение, после сброса 0x0) — FIFO потокового чтения заполнено (в нём два слова).
  • FIFO_EMPTY (бит 1, только чтение, после сброса 0x1) — FIFO потокового чтения пусто.
  • FLUSH_READY (бит 0, только чтение, после сброса 0x0) — Сброс кэша завершён; 0 — сброс идёт.

XIP_CTR_HIT — счётчик попаданий в кэш

Смещение 0x0C, адрес 0x1400 000C, после сброса 0x0000 0000, сброс записью 1. Макросы pico-sdk: XIP_CTR_HIT_…

Значение занимает регистр целиком, отдельных полей нет.

XIP_CTR_ACC — счётчик обращений к XIP

Смещение 0x10, адрес 0x1400 0010, после сброса 0x0000 0000, сброс записью 1. Макросы pico-sdk: XIP_CTR_ACC_…

Значение занимает регистр целиком, отдельных полей нет.

XIP_STREAM_ADDR — адрес потокового чтения

Смещение 0x14, адрес 0x1400 0014, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: XIP_STREAM_ADDR_…

Отдельных полей нет: значение занимает биты 31:2, остальные биты не используются.

XIP_STREAM_CTR — число слов потокового чтения

Смещение 0x18, адрес 0x1400 0018, после сброса 0x0000 0000, чтение и запись. Макросы pico-sdk: XIP_STREAM_CTR_…

Отдельных полей нет: значение занимает биты 21:0, остальные биты не используются.

XIP_STREAM_FIFO — fIFO потокового чтения

Смещение 0x1C, адрес 0x1400 001C, после сброса 0x0000 0000, чтение с побочным действием. Макросы pico-sdk: XIP_STREAM_FIFO_…

Значение занимает регистр целиком, отдельных полей нет.

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

Как использовать кэш XIP RP2040 как обычную память?

Сбросьте бит EN регистра CTRL — кэш выключится, и его 16 КБ будут доступны по адресу 0x1500 0000 как дополнительная SRAM. Программа при этом продолжит выполняться из флеш-памяти, но медленнее, без кэша.

Как измерить эффективность кэша XIP?

Обнулите счётчики CTR_HIT и CTR_ACC записью любого значения, выполните нужный участок программы и разделите CTR_HIT на CTR_ACC — это доля обращений, которые обслужил кэш. Счётчики 32-битные и насыщаются, а не переполняются.

Источники

  1. Raspberry Pi. RP2040 Datasheet (build 2025-02-20) — раздел 2.6.3.6: список регистров, назначение полей, тип доступа и значения после сброса
  2. Raspberry Pi. pico-sdk 2.1.1: заголовки src/rp2040/hardware_regs/include/hardware/regs/*.h (коммит bddd20f) — смещения, биты, тип доступа и значение после сброса каждого поля, базовые адреса из addressmap.h; лицензия BSD-3-Clause

Нашли ошибку в регистрах?

Другие регистры RP2040

Статьи и термины