Как работает внутриигровое программирование для ARM (Cortex M3)? - PullRequest
16 голосов
/ 03 ноября 2011

Я работаю на собственном устройстве на базе Cortex-M3, и мне нужно реализовать механизм внутрипрограммного программирования (IAP), чтобы можно было обновить прошивку устройства без JTAG (мы будем использовать TFTP или HTTP вместо). Хотя примеры кода, связанные с IAP, которые можно получить в ST Microelectronics, для меня достаточно понятны, я не совсем понимаю, как работает перепрошивка.

Насколько я понимаю, инструкции выбираются процессором из Flash через шину ICode (и, конечно, блок предварительной выборки). Итак, вот мой довольно глупый вопрос: почему не работает испорченная программа, когда она самопроизвольно мигает (т.е. изменяет флэш-память, из которой она запускается)?

Ответы [ 5 ]

10 голосов
/ 03 ноября 2011

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

Конечно, эта небольшая область не перезаписывается при прошивке прошивки, это может быть сделано только другими способами (например, JTAG). Поэтому убедитесь, что эта мигающая программа хорошо работает для начала. :)

6 голосов
/ 03 ноября 2011

Я не знаком с реализацией STM, но в микросхемах NXP подпрограммы IAP хранятся в отдельной зарезервированной области ПЗУ, которая не может быть удалена кодом пользователя.

Если вы реализуете код для записи на флэш-памяти самостоятельно, используя HW-регистры напрямую, вам нужно либо убедиться, что он не касается секторов, из которых он работает, либо работает из ОЗУ.

1 голос
/ 22 апреля 2013

В настоящее время многие микроконтроллеры, поддерживающие IAP, могут программировать свою флэш-память при выполнении программы на одной и той же флэш-памяти.

Для IAP программная память во флэш-памяти может быть разделена на 2 части.один исполняемый и другие резервные части.

Обычно мы программируем флэш-память в определенном месте (скажем, часть-1) через JTAG, версия прошивки которой составляет 0,01.Для IAP, т. Е. Запрограммировать флэш-память в другой части (часть-2) во время выполнения кода, соответствующие версии API должны быть предоставлены в версии прошивки 0.01, что помогает программировать флэш-часть 2, после успешного завершения программирования версия прошивки будетобновленный как 0.02.После перезапуска процессора выполнение программы переходит к последней версии встроенного ПО путем проверки версии встроенного ПО при инициализации.

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

0 голосов
/ 15 апреля 2019

Насколько я понимаю, инструкции выбираются процессором из Flash через шину ICode (и, конечно, блок предварительной выборки). Итак, вот мой довольно глупый вопрос: почему работающая программа не повреждается, когда она самопроизвольно мигает (т.е. изменяет флэш-память, из которой она запускается)?

Это связано с тем, что в общем случае запись / программирование на флэш-память не допускается во время чтения из нее (т. Е. Выполнения кода).

Посмотрите на this для некоторых идей по реализации IAP.

0 голосов
/ 23 января 2018

Еще один хороший способ сделать это - использовать загрузчик на заказ. Однако STM IAP не хранится во Flash, поэтому он не может быть перезаписан самостоятельно. Обычно люди разливают флешку на две части: одна предназначена для загрузчика по индивидуальному заказу, а другая - для применения. Загрузчик следит за тем, чтобы он не записывал в свою назначенную область. Загрузчик может быть запрограммирован через JTAG, и более позднее приложение может использовать загрузчик для программирования.

...