Что такое методы для разрешения безопасных обновлений программного обеспечения во встроенных системах

Если вы хотите, чтобы что-то происходило до тех пор, пока не будет выполнено определенное условие, но вы точно не знаете, когда это произойдет, вам понадобится Do-Loop:

Do While Range("H83").Value < 23
 Range("R14").Value = Range("R14").value + 0.01
 Range("H83").value = Range("H83").value + x 'If you don't do something with Range("H83"), the loop will go on forever
Loop

Редактировать: От того, кто это сделал ошибка больше, чем желание признать: если вы создаете цикл do, убедитесь, что вы не создаете бесконечный цикл, потому что велика вероятность того, что VBA больше не будет отвечать.

11
задан Lance Richardson 18 May 2009 в 12:35
поделиться

9 ответов

Все зависит от того, насколько критично приложение. Два основных подхода (резервное копирование и загрузчик) также иногда комбинируются.

Многие системы имеют загрузчик только для чтения (например, redboot ), а затем два банка флэш-памяти (на одном чипе, чаще всего ). Затем загрузчик имеет флаг для выбора банка для загрузки. Затем флаг будет изменяться в зависимости от таких событий, как обновление (неудачное или успешное) и т. Д.

Таким образом, при обновлении работающая версия копирует новую загрузку в резервный банк, проверяет контрольную сумму, переключает флаг загрузки и затем перезагружает устройство. Устройство перезагружается в новом банке с новой нагрузкой. После перезагрузки новая нагрузка может скопировать себя в резервный банк.

Часто также имеется сторожевой таймер с аппаратным сбросом. Таким образом, если прошивка сойдет с ума,

11
ответ дан 3 December 2019 в 03:53
поделиться
  1. Сохранять в памяти загрузчик только для чтения
  2. В загрузчике разрешить отказоустойчивый метод (например, удерживая кнопку X во время перезапуска) перезагрузки новой памяти программ из доступной источник ввода (SD-карта, RS232, что угодно).
2
ответ дан 3 December 2019 в 03:53
поделиться

More specifically...

Download the replacement image to an area of memory without overwriting ANY of the current program space. Wait until the download is complete, THEN compute and compare CRCs.

If space is really a problem, you can do the 'default backup' AKA 'recovery mode' sort of thing, but it's much slicker to not do this destructively.

If you're -really- slick... you can do a single write update to FLASH to direct the device to boot from the new code location. This will ping/pong between two totally seperate code sections. This is about the safest way you can do this:

  • ALWAYS have a non-updatable recovery bootloader (Nano-loader) which can be signaled to load new code somehow if everything goes wrong.
  • Two seperate program spaces
  • Each program space has a "CRC" field, a "burn number" (higher than the other code page's number), and an "invalid" word (all Fs - don't require an erase to update the "invalid" marker)
  • Once a download is complete, verify the CRC. If it's good, burn the 'invalid' marker on the old version's program space.
  • The Nano-loader checks the 'invalid' marker to know which to boot to. In the case that they're both valid, do a CRC check. If they're still both valid, then take the higher burn number entry

Oh, and when people say checksum... don't 'check the sum'... Do a proper CRC.

4
ответ дан 3 December 2019 в 03:53
поделиться

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

2
ответ дан 3 December 2019 в 03:53
поделиться

Чтобы ответить на оба вопроса, независимо от каких-либо конкретных аппаратных ресурсов:

  • Убедитесь, что перед запуском любого кода приложения (при запуске или после завершения загрузки) загрузчик выполняет Проверка CRC в приложении. Если он недействителен, загрузчик не запускает код.

  • Если загрузчик решает, что он не может запустить код приложения, он должен иметь возможность сообщить об этом пользователю и начать загрузку снова.

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

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

2
ответ дан 3 December 2019 в 03:53
поделиться

контрольные суммы на внутренней флеш-памяти с резервной копией по умолчанию, если CRC / контрольная сумма не работает. Таким образом, если устройство получает неверную контрольную сумму, тогда оно знает, что обновление было неполным, и может сбросить прошивку по умолчанию / предыдущую прошивку, сохраненную на другом устройстве.

Это требует некоторой предварительной загрузки (возможно, в загрузчике) для проверки контрольной суммы. Статический бит кода.

редактировать : Дополнение к комментариям в другом месте. Если вы хотите проверить неправильную прошивку, а не только поврежденную прошивку, ваша контрольная сумма / контрольные данные также могут инкапсулировать информацию о версии (и проверку этого заголовка), я думаю, что маршрутизаторы Linksys делают это, что может затруднить их перепрошивку с помощью специальной прошивки.

2
ответ дан 3 December 2019 в 03:53
поделиться

На некоторых лабораторных (а не потребительских) устройствах я видел платы, построенные на схемах программатора. В худшем случае вы можете открыть корпус, подключиться к программатору и перезагрузить программное обеспечение по умолчанию - или отправить его обратно, чтобы вы сделали то же самое. «Конечно, это стоит реальных денег.

На некоторых пользовательских платах, используемых в некоторых из моих проектов, были заменяемые ПЗУ. Это дешевле, но менее удобно.

0
ответ дан 3 December 2019 в 03:53
поделиться

по моему опыту, все сводится к вашей стоимости, если вы можете позволить себе иметь вдвое больше места для кода / данных на устройстве, чем вам нужно, и можете перезагрузить , это просто, сохраните новую версию во всем дополнительном пространстве, выполните надлежащую проверку контрольной суммы на новом образе, и я также рекомендую более тщательно проверить новый образ прошивки, поскольку он может быть подделан, если вы этого не сделаете, например, какой-то зашифрованный ключ, гарантирующий происхождение нового воображения. Вы также можете сделать это с внешней памятью, например, в одном проекте с использованием PIC у меня была внешняя EEPROM для нового образа прошивки и флаг, который, если установить при загрузке, будет загружено новое изображение из EEPROM.

если вам не повезло, то есть вы не можете позволить себе это пространство, тогда жизнь станет более интересной и, вероятно, нет гарантированного способа полностью избежать шанса сбой во время обновления. Во всех случаях загрузчик должен находиться в защищенной от записи части памяти, и если вы можете позволить себе место, он должен иметь некоторую базовую форму внешнего подключения, я сделал системы с очень простыми драйверами USB в загрузчике и системы с ДЕЙСТВИТЕЛЬНО простыми UDP только сетевые стеки. Любой из них позволит вам по крайней мере по-новому представить устройство в случае сбоя во время обновления. В этих случаях я настоятельно рекомендую поместить загрузчик в область памяти только для чтения, вы потеряете возможность его обновлять, но обновление haywire также не оставит вас с полностью заблокированным устройством. В таком случае загрузчик достаточно мал, чтобы вы могли быть уверены в его правильности.

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

2
ответ дан 3 December 2019 в 03:53
поделиться

I know this Q is answered, but some people have a need for more reliability. If your project is really mission critical you can go this route.

Basic plan is to always have a backup plan that cannot fail.

  1. have PIC or other microcontroller that can program the real processor's flash memory. You make it use a checksum on a block of data, and interface it via serial, usb or even ethernet ( don't laugh it's not that hard) This device CANNOT be reprogrammed in the field ( or maybe even EVER) so you always have a backup plan. PIC's can run web servers over PPP/SLIP or ehternet so interfacing to it is NOT necessarilty awkward. Google TCP-Lean. Try not to titter. (Site is suitable for work). Put the progrmming port somewhere else. Security is not ensured.

  2. The program runs on the main CPU and runs a boot loader of it's own. У вас есть три программы: загрузчик, программа обслуживания и настоящая программа.

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

Итак, у вас есть обновляемое встроенное приложение, обновляемый загрузчик и обновляемый режим обслуживания. И режим резервного копирования, который не может выйти из строя.

Надеюсь, никому это не пригодится.

1
ответ дан 3 December 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: