В настоящее время я разрабатываю прошивку для микроконтроллера Arm Cortex-M0 +, и я столкнулся с довольно интересной проблемой.Я не ищу никаких ответов, а хотел бы поделиться этой проблемой с другими разработчиками, чтобы я мог (надеюсь) пролить свет на проблему, с которой я столкнулся.Я опишу это ниже:
У меня есть программа, которая динамически загружает (должным образом скомпилированный и связанный) код из внешнего Flash-чипа, который будет выполняться прямо из ОЗУ MCU.Интересно, что я могу прекрасно выполнить загруженный в ОЗУ код при пошаговом выполнении (через отладчик), но он всегда будет аварийно завершать работу [формально HardFault] при свободном запуске.Я пытался отключить все прерывания, я дважды проверил инструкции, адреса памяти, выравнивания байтов, все, но я все еще не могу определить причину исключения.
У некоторых из вас есть какой-нибудь намек на то, чтомогло случиться?Мне очень интересно узнать больше о вашем опыте!Спасибо,
Обновление 1 (30/05)
Свободный запуск в этом случае означает, что установка точки останова непосредственно перед переходом к ОЗУ невозможна,Всякий раз, когда я захожу в ветку и выполняю инструкции в оперативной памяти, она будет работать правильно и возвращаться.Везде, где нет точки останова (и, таким образом, MCU выполняет масштабирование с переходом), наблюдается HardFault.Обратите внимание, что он будет зависать даже при загрузке с включенным отладчиком, но без установленной точки останова.
Обновление 2 (30/05)
Я использую Cypress S6E1C3 Серия Arm Cortex M0 + FM0 + Микроконтроллер .
Обновление 3 (30/05)
После копания и игры с кодом, яможет заставить его работать правильно!Однако это вызвало больше вопросов, чем ответов для меняЧитая официальную документацию ARM об инструкции BLX ( BLX ), я обнаружил, что младший бит адреса ветвления определяет режим команды процессора (1 заставляет его работать в режиме большого пальца).Явно установив этот бит, заставляет код работать всегда, даже в режиме свободного запуска .Дело в том, что код в ОЗУ не был скомпилирован в режиме Thumb, и нет очевидной причины, по которой при пошаговом выполнении кода с помощью отладчика режим команд может измениться ...Есть идеи?
К.