Какая шина данных используется после физического переназначения в ОЗУ в 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 не будет затронут и будет по-прежнему генерироваться ядром на системной шине.