Я реализовал загрузчик для микроконтроллера Kinetis ARM Cortex-M4.
Основное приложение (начиная с 0x10000
) перепрограммируется через загрузчик через пользовательский интерфейс RS232. Я реализовал функции jumpToApplication
и jumpToBootloader
с точки зрения загрузчика и приложений, и до сих пор все работает нормально.
Одна стратегия, которую я очень хочу понять, - это что делать в случае повреждения поврежденного главного применение?
В настоящее время загрузчик проверяет указатель стека и программный счетчик основного приложения, прежде чем принять решение о переходе. Однако, если основное приложение повреждено, возникнут две проблемы:
- Основное приложение зависнет и затруднит перепрограммирование
- Микроконтроллер перезагрузится и будет застрял в
bootloader
> application
> bootloader
(et c) l oop
У меня есть структура SharedData
, которая позволяет мне обмениваться данными (через фиксированный Расположение ОЗУ) между загрузчиком и приложением. Я рассмотрел добавление rebootCounter
к этой структуре, которая будет увеличиваться при срабатывании HardFaultInterrupt
в основном приложении.
Это значение может быть проверено в загрузчике и, в зависимости от значения счетчика, может быть принято решение о том, оставаться ли в загрузчике или попытаться запустить приложение.
Есть ли больше "отраслевых" стандартных способов решения этой проблемы?
ОБНОВЛЕНИЕ
Чтобы уточнить, конечная причина для того, чтобы задать этот вопрос, состоит в том, чтобы охватить следующий сценарий:
- Загрузчик запрограммирован в устройство на этапе производства с помощью JTAG
- Основное приложение (последняя сборка) загружается на этапе тестирования
- На этапе тестирования происходит отключение питания. обрыв или проблема с подключением, и устройство запрограммировано только частично
- При повторном включении питания загрузчик «предположит», что в основной части fla sh есть действующая программа, и «перейдет» к это приложение
- Микроконтроллер теперь застрял в безлюдной земле, не имея возможности повторно загрузить fla sh через загрузчик снова, не открывая p Вложение продукта и перепрошивка чипа через JTAG - это не то, что мы можем сделать, когда продукт находится в поле.
На этапе программирования загрузчика прошивка программируется и проверяется побайтово -байт, чтобы гарантировать отсутствие повреждений при передаче данных. Если на этом этапе происходит повреждение (например, неправильный пакет из-за проблемы с концентратором USB), загрузчик продолжит принимать команды перепрограммирования.
UPDATE # 2
Следующий пост, кажется, думает в том же духе:
https://interrupt.memfault.com/blog/how-to-write-a-bootloader-from-scratch