реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> 2 прошивки в памяти, Странное поведение
Палыч
сообщение Apr 25 2011, 13:02
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(qVlad @ Apr 25 2011, 16:41) *
А вот 4 других вектора или что это, пока не понятно расположены в одном и том же месте. Наверное их тоже можно передвинуть?
"Передвинуть" можно только для загрузчика, и то - не в произвольное место, а только в начало области загрузчика
Go to the top of the page
 
+Quote Post
qVlad
сообщение Apr 25 2011, 13:15
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 10-01-11
Из: Санкт-Петербург
Пользователь №: 62 125



Цитата(Палыч @ Apr 25 2011, 17:02) *
"Передвинуть" можно только для загрузчика, и то - не в произвольное место, а только в начало области загрузчика

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

Не понимаю а как же я тогда смог передвинуть 0 вектор?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 25 2011, 14:29
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(qVlad @ Apr 25 2011, 17:15) *
Неужели нельзя для второй программы создать эмуляцию,что она будет думать что работает так как будто записана в начало флеш памяти?
Э-э-э-э... Сложилось непонимание... Прочитайте внимательно раздел DS "Interrupts"...

Мой "вольный" перевод - разъяснение этого раздела:

Вы можите настройками Вашего транслятора разместить команды перехода на функции/процедуры обработки прерываний в любом месте памяти программ - никто не вправе Вам это запретить. Но! Микроконтроллер при возникновении условия прерывания перейдет на вектор прерывания, расположенный в таблице прерываний. Эта таблица прерываний для МК имеющих поддержку BootLoader'а может находится либо с начала Application Section, либо с начала Boot Loader Section (BLS). Всё! Третьего - не дано! Чтобы управление передалось на "вектора", расположенные в произвольном месте памяти программ, необходимо, чтобы некая программа выполнила в это место переход... В посте №14 я Вам предложил это реализовать из BootLoader'а. Вы - отказались... Теперь Вы опять завели речь о эмуляции прерываний... Дежавю... laughing.gif Пошли на второй круг?
Go to the top of the page
 
+Quote Post
qVlad
сообщение Apr 25 2011, 14:45
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 10-01-11
Из: Санкт-Петербург
Пользователь №: 62 125



Цитата(Палыч @ Apr 25 2011, 18:29) *
Э-э-э-э... Сложилось непонимание... Прочитайте внимательно раздел DS "Interrupts"...

Мой "вольный" перевод - разъяснение этого раздела:

Вы можите настройками Вашего транслятора разместить команды перехода на функции/процедуры обработки прерываний в любом месте памяти программ - никто не вправе Вам это запретить. Но! Микроконтроллер при возникновении условия прерывания перейдет на вектор прерывания, расположенный в таблице прерываний. Эта таблица прерываний для МК имеющих поддержку BootLoader'а может находится либо с начала Application Section, либо с начала Boot Loader Section (BLS). Всё! Третьего - не дано! Чтобы управление передалось на "вектора", расположенные в произвольном месте памяти программ, необходимо, чтобы некая программа выполнила в это место переход... В посте №14 я Вам предложил это реализовать из BootLoader'а. Вы - отказались... Теперь Вы опять завели речь о эмуляции прерываний... Дежавю... laughing.gif Пошли на второй круг?


Спасибо большое,что отвечаете. Становится понятнее...

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

Мое решение:
Сначала грузится bootloader и ждет скажут ему прошивать или нет. Если нет, то он переходит к программе которая расположена в начале флеш памяти. Если пришла команда что нужно перепрошить, то производится загрузка во флеш по адресу 0. При загрузке проверяется что прошивка рабочая, например CRC это еще не реализовано, если не рабочая, то грузимся с адреса 8000, если рабочая то с адреса 0.

Bootloader работает с avrdude по com порту.
Есть идея другой реализации при прошивке записывать программу в свободное место на флеш, там проверять,если все верно то прошивать ее в начало флешки. Но это не гарантирует 100% работу.

Наверное я изобретаю велосипед, раз столько проблем
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 25 2011, 15:12
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(qVlad @ Apr 25 2011, 18:45) *
... При загрузке проверяется что прошивка рабочая, например CRC это еще не реализовано, если не рабочая, то грузимся с адреса 8000, если рабочая то с адреса 0... Наверное я изобретаю велосипед, раз столько проблем
Другими словами: Вы храните в памяти программ с адреса 8000 копию прошивки МК? Зачет тогда такие сложности? Вероятно, будет гораздо проще в загрузчик вставить проверку целостности "основной" копии и, если она повреждена (или плохо "прошилась") банально переписать (скопировать "один к одному") память программ из адресов 8000-ХХХХ в 0000-ХХХХ... А, если новая прошивка с адреса 0000 - верная (перепрошивка прошла успешно), то сделать резервную копию в адресах 8000-ХХХХ. Т.е. программа-приложение всегда работает (размещена) с адреса 0, а с адреса 8000 - резервная копия ("байт в байт") для возможного восстановления программы загрузчиком при её (программы-приложения) восстановлении.
Go to the top of the page
 
+Quote Post
qVlad
сообщение Apr 25 2011, 15:19
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 10-01-11
Из: Санкт-Петербург
Пользователь №: 62 125



Цитата(Палыч @ Apr 25 2011, 19:12) *
Другими словами: Вы храните в памяти программ с адреса 8000 копию прошивки МК? Зачет тогда такие сложности? Вероятно, будет гораздо проще в загрузчик вставить проверку целостности "основной" копии и, если она повреждена (или плохо "прошилась") банально переписать (скопировать "один к одному") память программ из адресов 8000-ХХХХ в 0000-ХХХХ... А, если новая прошивка с адреса 0000 - верная (перепрошивка прошла успешно), то сделать резервную копию в адресах 8000-ХХХХ. Т.е. программа-приложение всегда работает (размещена) с адреса 0, а с адреса 8000 - резервная копия ("байт в байт") для возможного восстановления программы загрузчиком при её (программы-приложения) восстановлении.


Это я и рассматривал как второй вариант, просто я не нашел как при прошивке через avrdude указать с какого адреса начинать писать, я ему просто даю hex файл d котором прописаны все адреса. Буду разбираться как это сделать. Спасибо за помощь
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 25 2011, 16:01
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(qVlad @ Apr 25 2011, 19:19) *
Это я и рассматривал как второй вариант, просто я не нашел как при прошивке через avrdude указать с какого адреса начинать писать
Та-а-а-к... Опять я не понимаю: что Вы не понимаете?... Временно забудьте про avrdude... С помощью avrdude Вы прошьёте свой загрузчик, который:
1. По разработанному Вами протоколу примет новую программу-приложение в разработанном Вами формате (программу, которая взаимодействует с Вашим загрузчиком Вам предстоит разработать). Приём, скорее всего, будет вестись по интерфейсу, который Ваш прибор имеет "наружу" (RS232, RS485, USB, что-то там ещё...).
2. Принимать новую программу-приложение загрузчик будет кусочками (скорее всего равными размеру страницы), проверять контрольную сумму (при несовпадении контрольной суммы загрузчик должен "переспросить" Вашу программу - "попросить" повторить последний кусочек, но не более N раз) и записывать в Aplication Section, начиная с адреса 0 - первый кусочек, с адреса SIZEPAGE - второй кусочек, с адреса 2*SIZEPAGE - третий кусочек ...
3. После каждой прошивки кусочка программы-приложения загрузчик будет проверять правильность "прошивки" этого кусочка (считыванием из памяти программ и сравнением с содержимым приёмного буфера). При несовпадении - попытаться прошить кусочек ещё раз (N раз).
4. Когда программа-приложение будет записана загрузчиком в память программ, загрузчик сделает её резервную копию: скопирует "байт в байт" информацию из памяти программ 0000-ХХХХ в память программ 8000-ХХХХ (так же контролируя процесс).
5. Запустит программу-приложение.
6. Если какой-то из пунктов 1-3 завершится аварийно: программа загрузчик восстановит предыдущую программу-приложение, скопировав память программ из 8000-ХХХХ в 0000-ХХХХ (всё так же - с контролем процесса).

Всё вышеперечисленное - имхо. Вы можете "пойти другим путём"...
Go to the top of the page
 
+Quote Post
Schulz_K
сообщение Apr 26 2011, 09:28
Сообщение #23


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 25-05-10
Из: Киев
Пользователь №: 57 515



Насколько я понимаю - тут должны быть два разных подхода к прошивке памяти: Bootloader и резервная копия прошивки программируется с помощью программатора (того-же AVR Dude) а вот та программа, которую вы хотите удаленно прошивать принимается уже самим Bootloader например по UART и прошивается в программную память по методу Self programming под управлением Bootloader, а не программатора.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 29 2011, 16:09
Сообщение #24


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата
Но это не гарантирует 100% работу.

это признаки паранойи?
Бутлоадер ведь всегда остается в рабочем состоянии это гарантируется фузами запрета записи в BOOT секцию, даже если прошивка залилась неверно, ее можно удаленно перепрошить повторно. А вот секция кода никак не защищена, бутлоадер может с полным успехом убить обе копии программы, поэтому хранить вторую копию по адресу 0x8000 не имеет смысла. Уж если действительно нужна резервная копия - то ставьте внешнюю eeprom'ку с "железным" Write Protection'ом.

Цитата
Вы можете "пойти другим путём"...

Палыч, тонкий намек на смену профессии a14.gif
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01408 секунд с 7
ELECTRONIX ©2004-2016