lift_indicator_suite/docs/bootloader/BOOT_FLAGS.md

9 KiB
Raw Permalink Blame History

Boot-дефайны IMXRT1052

Manufacturing User's Guide

Процесс загрузки

При старте BootROM читает QSPI Flash через FlexSPI и ищет специальные структуры по фиксированным смещениям от начала Flash (0x60000000):

0x60000000  FDCB — FlexSPI NOR Configuration Block (512 bytes)
0x60000400  IVT  — Image Vector Table
0x60000420  Boot Data
0x60000430  DCD  — Device Configuration Data (опционально)

После разбора структур BootROM передаёт управление на точку входа прошивки.


XIP_EXTERNAL_FLASH=1

Код исполняется напрямую из QSPI Flash через XIP (Execute-In-Place) без копирования в RAM. FlexSPI отображает Flash в адресное пространство начиная с 0x60000000. Стартап и SDK знают что копирование кода из Flash в RAM не требуется. Код в стартапе, который отвечает за инициализацию частоты FlexSPI не выполняется

XIP_BOOT_HEADER_ENABLE=1

Включает генерацию FDCB и IVT в начале Flash-образа.

XIP_BOOT_HEADER_DCD_ENABLE=1

Включает DCD внутри boot header. DCD — список команд для BootROM (запись регистров, ожидание флагов), которые выполняются до передачи управления прошивке. Используется для ранней инициализации SDRAM, чтобы линкер мог размещать данные в SDRAM с самого старта.

Если SDRAM инициализируется вручную в main() — DCD можно отключить, убрав этот дефайн.

SKIP_SYSCLK_INIT

Запрещает SystemInit() (вызывается из стартапа до main()) настраивать системные часы. Конфигурация тактирования полностью делегируется BOARD_BootClockRUN() из clock_config.c. Без этого флага часы инициализировались бы дважды, что может привести к нестабильной работе на этапе старта.


Сценарии размещения кода

Справка: внутренняя RAM IMXRT1052

IMXRT1052 имеет три региона внутренней RAM:

Регион Адрес Размер Назначение
ITCM 0x00000000 512 KB Tightly Coupled Instruction Memory — код, ISR
DTCM 0x20000000 512 KB Tightly Coupled Data Memory — стек, критичные данные
OCRAM 0x20200000 512 KB On-Chip RAM — общего назначения, доступна DMA

ITCM — лучший выбор для исполнения кода из RAM. Подключена напрямую к ядру по выделенной шине, работает без wait states и без кэша. Даёт максимальную детерминированность — критично для ISR и time-critical кода.

OCRAM подключена через системную шину и кэш — выше латентность, но доступна периферии и DMA.


Сценарий 1: хранение и исполнение из Flash (XIP)

Код хранится в QSPI Flash и исполняется напрямую оттуда через FlexSPI. Копирования не происходит. Простейший вариант — минимум настроек.

Применение: большинство приложений где производительность не критична, быстрый старт разработки.

target_compile_definitions(bsp_board PUBLIC
    XIP_EXTERNAL_FLASH=1         # исполнение прямо из Flash
    XIP_BOOT_HEADER_ENABLE=1     # FDCB + IVT в начале образа
    XIP_BOOT_HEADER_DCD_ENABLE=1 # DCD для инициализации SDRAM если нужна
    SKIP_SYSCLK_INIT
)

Линкерный скрипт: MIMXRT1052xxxxx_flexspi_nor.ld

Flash (XIP): 0x60000000  — код и константы
DTCM:        0x20000000  — стек, .data, .bss

Ограничения: FlexSPI шина делится между исполнением кода и доступом к данным Flash. При интенсивной работе с Flash (запись, чтение данных) производительность кода падает.


Сценарий 2: хранение во Flash, исполнение из внутренней RAM (ITCM)

Код хранится в QSPI Flash, при старте стартап копирует секцию .text в ITCM. BootROM загружает стартап из Flash, стартап копирует остальной код и передаёт управление.

Применение: ISR с жёсткими временными требованиями, алгоритмы управления, участки кода где нужна детерминированная латентность.

target_compile_definitions(bsp_board PUBLIC
    # XIP_EXTERNAL_FLASH не определяем — код копируется в ITCM
    XIP_BOOT_HEADER_ENABLE=1     # FDCB + IVT нужны — BootROM всё равно грузит из Flash
    XIP_BOOT_HEADER_DCD_ENABLE=1 # DCD нужен если SDRAM используется под данные
    SKIP_SYSCLK_INIT
)

Линкерный скрипт: MIMXRT1052xxxxx_flexspi_nor_txt_itcm.ld (или кастомный)

Flash:           0x60000000  — хранение образа
ITCM (LMA→VMA):  0x00000000  — исполнение кода
DTCM:            0x20000000  — стек, .data, .bss

Ограничения: ITCM всего 512 KB — весь исполняемый код должен в него поместиться. Время старта увеличивается на время копирования из Flash.


Сценарий 3: хранение во Flash, исполнение из SDRAM

Код хранится в QSPI Flash, при старте копируется в SDRAM (32 MB, 0x80000000). SDRAM должна быть инициализирована до копирования — через DCD BootROM.

Применение: большие приложения которые не помещаются во внутреннюю RAM и слишком медленно работают из Flash — например, UI с графикой, обработка изображений.

target_compile_definitions(bsp_board PUBLIC
    # XIP_EXTERNAL_FLASH не определяем — код копируется в SDRAM
    XIP_BOOT_HEADER_ENABLE=1
    XIP_BOOT_HEADER_DCD_ENABLE=1  # обязательно — DCD инициализирует SDRAM до старта
    SKIP_SYSCLK_INIT
)

Линкерный скрипт: кастомный с регионом SDRAM

Flash:             0x60000000  — хранение образа
SDRAM (LMA→VMA):   0x80000000  — исполнение кода (32 MB)
DTCM:              0x20000000  — стек, критичные данные
ITCM:              0x00000000  — ISR и time-critical функции

Для ISR и критичного кода используй атрибут __attribute__((section(".itcm"))) чтобы разместить их в ITCM отдельно от основного кода в SDRAM.

Ограничения: SDRAM работает через SEMC с несколькими wait states — медленнее ITCM. DCD усложняет конфигурацию — при смене частоты тактирования SEMC параметры DCD нужно пересчитывать.


Сводная таблица

Сценарий XIP_EXTERNAL_FLASH XIP_BOOT_HEADER_ENABLE XIP_BOOT_HEADER_DCD_ENABLE SKIP_SYSCLK_INIT
XIP из Flash 1 1 1 (если SDRAM нужна) да
Копирование в ITCM не определять 1 1 (если SDRAM нужна) да
Копирование в SDRAM не определять 1 1 (обязательно) да