Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Организация памяти STM

Ср ноя 16, 2022 14:52:45

Всем привет! Сейчас изучаю организацию памяти микроконтроллеров (на примере STM32F401ccu6). Не совсем могу понять, почему в даташите начальный и конечный адрес памяти является: 0x00000000 - 0xFFFFFFFF. Почему такое представление указано в даташит, ведь память МК 256 Kbytes?
В интернете сказано, что размер памяти определяется шиной, здесь она 32 битная, и логично предположить, что именно поэтому такая адресация в даташите указана (0x00000000 - 0xFFFFFFFF), но все же остаются вопросы, неиспользуемые блоки, они фзически существуют, если нет, зачем их указывают в даташит?
Что значит зарезервированная память, она есть, но ее не используют? Или физически памяти нет, но есть место для нее?
image_2022_11_16T11_45_14_555Z-1.png
(72.5 KiB) Скачиваний: 38

Re: Организация памяти STM

Ср ноя 16, 2022 15:06:24

потому-что в документации указана вся память в принципе, а вы имеете в виду флеш-память.

Re: Организация памяти STM

Ср ноя 16, 2022 15:08:47

Не надо путать саму память и адресное пространство. Вот так вот, например, распределено пространство в 334 контроллере.
Изображение

Re: Организация памяти STM

Ср ноя 16, 2022 15:17:22

если попробуете обратиться к адресам, которых физически нет в микроконтроллере, то получите что-то вроде bus error, у меня так было, когда я размер стека неправильно указал.

Re: Организация памяти STM

Ср ноя 16, 2022 15:19:34

Не надо путать саму память и адресное пространство. Вот так вот, например, распределено пространство в 334 контроллере.
Изображение

Тогда получается, что я не правильно понимаю, что такое адресной пространство, можете объснить простыми словами пожалуйста?
я понял так, что адресной пространство, это зарезервированное, как бы, место, для памяти в других моделях, но мне кажется это бред.

Re: Организация памяти STM

Ср ноя 16, 2022 15:23:06

есть такая штука, как адресная шина. в ARM она 32-битная, т.е. может адресовать 4 ГБ памяти. это и есть адресное пространство.

Re: Организация памяти STM

Ср ноя 16, 2022 15:35:55

А почему тогда здесь пустота? (см. фото, указал стрелочками). Почему существующие блоки организованы не попорядка, например с адреса 0x00000000 и до 0x60000000, например?
Ведь память, она, по факту, одна, цельная, верно же?
Вложения
image_2022_11_16T12_30_02_803Z-1.png
(104.47 KiB) Скачиваний: 30

Re: Организация памяти STM

Ср ноя 16, 2022 15:44:11

Ведь память, она, по факту, одна, цельная, верно же?

нет. очень часто она разбита на регионы. память это периферия. к каким адресам производиель прибьет эту периферию, там и будет висеть.

Re: Организация памяти STM

Ср ноя 16, 2022 15:44:30

Ну типа дорога есть, адрес есть, а самого дома нет. Вот в городе и оставляют дырки чтобы если нужен квартал побольше, то не приходилось бы двигать все остальные дома.
Для совместимости внутри одного семейства это делается. Оператива, например, начинается в адреса 0х2000 0000 и её не волнует что там до неё, занято место или нет. Физически там что-то расположено или нет. Потому что удобно обращаться к оперативной памяти по этому адресу в любой модели STM32, а не выискивать адреса расположения каждый раз на каждую отдельную модель. Да и производить, подозреваю, так тоже проще.

Re: Организация памяти STM

Ср ноя 16, 2022 16:28:01

Ну и стоит напомнить автору, что адресное пространство таки байтное, а не 32-разрядное. То есть шаг адреса 32-разрядных слов равен 4.

Re: Организация памяти STM

Ср ноя 16, 2022 18:19:27

А знаете, что произойдет при обращении по адресу нереализованного физически блока? Правильно, исключение Hard Fault.
Ну а память - она тоже не цельная. В общем адресном пространстве размером в 4 гига размещаются и флеш, и несколько блоков ОЗУ, и все адреса регистров периферии типа GPIO, SPI, и даже внешняя память SDRAM, NAND Flash...
Адреса SRAM находятся в диапазоне 0x2000'0000 - 0x2001'0000, адреса флеш-памяти в диапазоне 0x0800'0000 - 0x08004'0000, адрес GPIOA - 0x4002'0000. В референс-мануале есть еще одна табличка, STM32F401xB/C and STM32F401xD/E register boundary addresses зовется.

Адресное пространство микроконтроллера следует понимать как почтовый адрес вашего дома, в котором живете, адрес вашей работы, адрес магазина. Что произойдет, если вы отправите посылку по адресу, которого нет физически в адресном пространстве города? Вот именно, почта скажет: "нет такого адреса, доставить невозможно".

Re: Организация памяти STM

Ср ноя 16, 2022 19:54:03

и это хорошо, что будет исключение. А ведь что-то мне попадалось, где такого исключения не было... адресация отрабатывала просто тихо, без результата.

Re: Организация памяти STM

Ср ноя 16, 2022 22:03:17

Довльно доступно обьяснили. Спасибо большое!

Добавлено after 3 minutes 56 seconds:
Ведь память, она, по факту, одна, цельная, верно же?

нет. очень часто она разбита на регионы. память это периферия. к каким адресам производиель прибьет эту периферию, там и будет висеть.

Есть еще парочку вопросов. Что подразумевается под регионами? Регионы - это блоки в адресном пространстве? (см. фото
Screenshot_1.png
(71.23 KiB) Скачиваний: 27
)

Добавлено after 1 minute 39 seconds:
А знаете, что произойдет при обращении по адресу нереализованного физически блока? Правильно, исключение Hard Fault.
.

Что значит исключение?

Re: Организация памяти STM

Ср ноя 16, 2022 22:11:10

исключение - исключительная ситуация, ну то есть "катастрофа, всё пропало!". Дальнейшая работа микроконтроллера будет невозможна, он переходит в специальный режим и остается в нем до сброса. Физически - это прерывание, вызов обработчика прерывания HardFault_Handler(), который представляет собой бесконечный цикл.
И если Hard Fault вызван не явной ошибкой программиста, то в этом прерывании можно сгенерировать программный сброс и перезапуск микроконтроллера. Разумеется, если программист накосячил при написании кода, микроконтроллер снова войдет в эту ошибку.

Re: Организация памяти STM

Чт ноя 17, 2022 08:47:12

понял. спасибо!

Re: Организация памяти STM

Чт ноя 17, 2022 10:12:35

А знаете, что произойдет при обращении по адресу нереализованного физически блока? Правильно, исключение Hard Fault.

Ой, все, что угодно произойти может.Я тут на GD32VF103 пытался поймать исключение доступа к памяти, так тот вообще подобного не умеет.Хочешь прочитать 32-битное слово с адреса 3? Пожалуйста. Хочешь с адреса 0xFFFFFFFF? На здоровье!
Правда он не ARM, а RISC-V (но в целом, чуть ли не 1 в 1 с STM32F103 скопирован), но все же иллюстрирует, что не всегда контроллеры падают в ошибку, иногда просто выполняют подобный код, как будто так и надо.
MLX90640 писал(а):Что произойдет, если вы отправите посылку по адресу, которого нет физически в адресном пространстве города?

Честно отнесет в указанное место, положит на землю и пойдет отчитываться о проделанной работе. Ну вы же хотели положить туда посылку? С чего бы почтальону задумываться о ваших мотивах.
maksimdag0 писал(а):Что значит исключение?

По сути - прерывание, только вызванное не периферией, а самим ядром. Деление на ноль, попытка выполнить несуществующую инструкцию (например, 0xFFFFFFFF), доступ по невыровненному адресу (для 32-битных чисел адрес должен быть кратен 4, для 16-битных - 2, для 8-битных без разницы), выполнение специальных инструкций (может, помните из MS-DOS'а int 10h, int 33h - вот это примерно оно).
MLX90640 писал(а):исключение - исключительная ситуация, ну то есть "катастрофа, всё пропало!". Дальнейшая работа микроконтроллера будет невозможна

Ничего подобного. То же чтение по невыровненному адресу может просто тихо обрабатываться ядром - оно читает адрес, откуда пытались прочитать, само читает два соседних слова, склеивает их в одно, и возвращает в юзерский код, как будто так и надо. Я слышал, так некоторые линуксы делают.
Те же операции вызова ядерного кода (в RISC-V это ecall, в ARM не знаю) используются ровно для того, чтобы сообщить ядру, что юзерский код хочет что-то выполнить с повышенными привилегиями. Не то чтобы в контроллерах это часто использовалось...

Re: Организация памяти STM

Чт ноя 17, 2022 23:18:19

если попробуете обратиться к адресам, которых физически нет в микроконтроллере, то получите что-то вроде bus error
Не факт.

Добавлено after 6 minutes 58 seconds:
А знаете, что произойдет при обращении по адресу нереализованного физически блока? Правильно, исключение Hard Fault.
Опять не факт.

Добавлено after 13 minutes 38 seconds:
И если Hard Fault вызван не явной ошибкой программиста, то в этом прерывании можно сгенерировать программный сброс и перезапуск микроконтроллера.
Можно делать что угодно. Не обязательно сброс. Как в любом другом обработчике. Т.е. - выполнить некую работу и вернуться чуть дальше места fault-а.
Например: на BusFault или MpuFault можно сделать эмуляцию виртуальной памяти.
Также на MpuFault можно организовать защиту отдельных областей программной памяти. Или отлавливать ошибки разрушения памяти (вызванные багами).
А на UsageFault - так и вообще раздолье:
UsageFault деления 0 - эмулировать спец.поведение при делении на 0;
UsageFault несуществующей или запрещённой команды - сделать программную её эмуляцию;
UsageFault невыровненного доступа (там где ядро его не умеет) - опять же программно эмулировать невыровненный доступ.

Добавлено after 9 minutes 9 seconds:
исключение - исключительная ситуация, ну то есть "катастрофа, всё пропало!".
Ничего подобного! Видимо вы никогда не слышали о SysTick-таймере или PendSV (для вызова context switch в OS) или об SVC (предназначенном для реализации системных вызовов и переключения из непривилегированного кода в привилегированный).
Стоит почитать мануал на Cortex-M-ядра. :dont_know:

Re: Организация памяти STM

Пт ноя 18, 2022 06:56:33

Может, стоит вначале почитать контекст предыдущего поста, прежде чем писать столь длинный мессаг?
и вернуться чуть дальше места fault-а

А "чуть дальше" - это куда? Точный адрес не подскажете? А то в точке "чуть дальше" уже может лежать вообще другая функция или вообще байты констант.

Re: Организация памяти STM

Пт ноя 18, 2022 07:36:53

Чуть дальше, это следующая за вызвавшей исключение инструкция. Стандартный отладочный способ обнаружить причину исключения.

Re: Организация памяти STM

Пт ноя 18, 2022 07:55:21

MLX90640 писал(а):Точный адрес не подскажете?

Вроде этот адрес в стек кладётся при переходе в прерывание.
Ответить