А знаете, что произойдет при обращении по адресу нереализованного физически блока? Правильно, исключение 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 не знаю) используются ровно для того, чтобы сообщить ядру, что юзерский код хочет что-то выполнить с повышенными привилегиями. Не то чтобы в контроллерах это часто использовалось...