Вам необходимо каким-то образом определить, когда устройство будет сброшено, из какого из двух возможных местоположений оно должно начать выполняться.Но, как правило, устройство с «голым железом» имеет только одно начальное местоположение, из которого оно запускается при сбросе (некоторые контроллеры могут выбирать одну или более точек входа на основе логического уровня некоторых выводов на устройстве).
У нас было аналогичное требование, и мы разработали следующую схему:
- требуется небольшая программа загрузчика - она построена и связана с программой, которая получает управление процессором при сбросе
- образ основной программы фактически создается дважды - по одному разу для каждого возможного местоположения.Примечание: два возможных места загрузки фиксированы и известны загрузчику.
- В начале образа программы имеется небольшая структура данных, которая содержит несколько битов информации, важных для загрузчика.Среди них адрес точки входа программы и контрольная сумма образа программы
. Загрузчик проверяет фиксированные, общеизвестные местоположения, чтобы проверить контрольные суммы двух возможных изображений.
- если он не находит допустимых изображений, он просто зацикливается (сторожевой таймер сбросит устройство, но это не имеет значения - это кирпич, пока не будет загружена действительная основная программа)
- если он находит только одно действительное изображение, это точка входа, к которой он переходит.
- если он находит, что оба изображения действительны, он использует другую информацию в структуре данных, чтобы определить, какой из них передать управление (версияинформация, которая была известна последней, независимо от вашей политики).
Ключ к этому заключается в том, что загрузчик должен быть простым и глупым.Его нелегко обновить, поэтому вы хотите, чтобы он был настолько глуп, чтобы в нем не было ошибок.
Теперь устройство можно обновить, пока оно работает, мигая образом в нерабочее место (Cortex-Устройство M3, которое у нас есть, позволяет это - если LPC1758 не позволяет этого, вам нужно что-то, что запускается из ОЗУ, для обновления флэш-памяти).Сброс, и загрузчик выбирает только что перепрошитый образ.
Системе требуется небольшая предварительная работа, чтобы запустить загрузчик и работать надежно, но как только он заработает, обновления будут на 100% надежными (если новыйflash не завершается, старый образ является единственным, который проверяет контрольную сумму, поэтому он будет работать при следующем сбросе - без кирпичей).Главный недостаток - и это серьезный недостаток - это то, что вы по существу теряете половину адресного пространства флэш-памяти для основной программы, поскольку флэш-память должна содержать два конкурирующих изображения.