Я работаю над кодом Ethernet на устройстве STM32F429 ARM Cortex M4 и сталкиваюсь с ситуацией, когда у меня возникает исключение MemManage, причина которого оказывается очень трудно отследить. Из того, что я понимаю, исключение MemManage вызвано некоторым нарушением MPU, таким как попытка выполнить код в защищенном пространстве регистров 0xE0000000 и выше. В документации Cortex M4, которую я прочитал, указано, что причина исключения должна быть зафиксирована в битах регистра MMSFR и что адрес ошибки может быть записан в регистре MMFAR при определенных обстоятельствах.
Меня расстраивает то, что исключение MemManage генерируется со всеми битами в регистре MMSFR, равными нулю. Я выполняю инструкцию точки останова, как только вводится обработчик исключений, так что я почти уверен, что MMSFR не очищается случайно. Кроме того, нигде в моем коде я даже не использую MPU, и он должен быть в состоянии по умолчанию при включении питания. Наконец, я могу преднамеренно создать исключение MemManage в другом месте моего кода, и биты MMSFR правильно идентифицируют возникшую проблему. Разматывая стек из исключения, единственное, что необычно в ПК, это то, что он находится в середине кода, который вызывается на раннем этапе для инициализации ОСРВ, но не должен выполняться позже, когда возникает исключение. Я пытаюсь определить, как ПК достиг того значения, которое он имел, но его трудно изолировать.
Есть ли у кого-то идеи, почему исключение MemManage может возникать без установки битов MMSFR? Или предложения по методам, позволяющим лучше понять обстоятельства, возникающие в моем коде непосредственно перед возникновением исключения.