Какая шина данных используется после физического переназначения в ОЗУ в STM32F4?

Контроллеры STM32F4 (с процессором ARM Cortex M4) допускают так называемое физическое переназначение самых низких адресов в области памяти (от 0x00000000 до 0x03FFFFFF) с использованием регистра SYSCFG_MEMRMP. Что я понимаю, так это то, что регистр выбирает, какая память (FLASH/RAM/ и т. Д.) Привязана к самым низким адресам и, следовательно, из какой памяти выбирается вектор сброса и указатель стека после сброса.

В документации [1] также упоминается, что

В режиме переназначения ЦП может получить доступ к внешней памяти через шину ICode вместо системной шины, что повышает производительность.

Это означает, что после переназначения, например, в ОЗУ, будет использоваться инструкция, извлеченная из адресного пространства псевдонима (от 0x00000000 до 0x03FFFFFF), шина ICode.

Теперь мой вопрос: после такой операции переназначения, например, в ОЗУ, будет ли выборка в несмещенное место ОЗУ использовать системную шину или шину ICode?

Подоплекой вопроса является то, что я хочу написать скрипт компоновщика для изображения, выполняющегося только из оперативной памяти (под управлением отладчика). В какую область памяти должен идти раздел.text? Псевдоним пространства или физического пространства?

[1] ST DocID018909 Rev 7


Благодаря Шону я смог найти ответ в разделе 2.3.1 Технического справочного руководства по процессору ARM® Cortex® ‑ M4: шинные интерфейсы:

Интерфейс памяти ICode: выборки инструкций из пространства памяти кода, от 0x00000000 до 0x1FFFFFFC, выполняются по [sic!: this] 32-битной шине AHB-Lite.

Интерфейс памяти DCode: доступ к данным и отладке в область памяти кода, от 0x00000000 до 0x1FFFFFFF, осуществляется по 32-битной шине AHB-Lite [sic!: this].

Системный интерфейс: Извлечение инструкций и доступ к данным и отладке для диапазонов адресов от 0x20000000 до 0xDFFFFFFF и от 0xE0100000 до 0xFFFFFFFF выполняются по [sic!: this] 32-битной шине AHB-Lite.

Это также проясняет, что флэш-память микроконтроллеров STM32F4, расположенная по адресу 0x08000000, всегда доступна (ядром ЦП) с использованием шин ICode/DCode, независимо от того, переназначена ли она. Это связано с тем, что как исходное, так и переназначенное местоположение находятся в области памяти кода (от 0x00000000 до 0x1FFFFFFF).

Однако если код находится в SRAM по адресу 0x20000000, то для доступа к переназначенному расположению по адресу 0x00000000 используются шины ICode/DCode, а для доступа к исходному расположению (вне пространства памяти кода) используется системная шина.

1 ответ

Решение

Выбор шинного интерфейса на ядре зависит от адресов, к которым осуществляется доступ. Если вы обращаетесь к инструкции по адресу 0x00000004, это делается на шине ICode. Доступ к 0x20000004 осуществляется через системную шину.

Функция REMAP изменяет физическую систему памяти таким образом, чтобы доступ к 0x00000004 (шина ICode) использовал ту же оперативную память, что и доступ к системной шине. Любой доступ к 0x20000004 не будет затронут и будет по-прежнему генерироваться ядром на системной шине.

Другие вопросы по тегам