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

 
 
> 2 прошивки в памяти, Странное поведение
qVlad
сообщение Apr 25 2011, 10:59
Сообщение #1


Участник
*

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



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

Файл конфиг для IAR
Прикрепленный файл  cfgxm64a3_.txt ( 3.36 килобайт ) Кол-во скачиваний: 271


Прошивка с 0 адреса
Прикрепленный файл  Flash.txt ( 191.32 килобайт ) Кол-во скачиваний: 115


Прошивка с 0х8000 адреса
Прикрепленный файл  FLASHdef.txt ( 101.42 килобайт ) Кол-во скачиваний: 123


Подскажите что я делаю не так?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 23)
Палыч
сообщение Apr 25 2011, 11:07
Сообщение #2


Гуру
******

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



Вы бы сами на файлы поглядели бы: неиспользованная память - заполнена FF
Go to the top of the page
 
+Quote Post
qVlad
сообщение Apr 25 2011, 11:08
Сообщение #3


Участник
*

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



Цитата(Палыч @ Apr 25 2011, 15:07) *
Вы бы сами на файлы погляlели бы: неиспользованная память - заполнена FF

А чем ее нужно было заполнять?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 25 2011, 11:12
Сообщение #4


Гуру
******

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



Цитата(qVlad @ Apr 25 2011, 15:08) *
А чем ее нужно было заполнять?
Её, как раз, ничем заполнять не нужно
P.S. Скорее всего, в Вашем случае это заполнение вредно: заполненное кодом FF "перетирает" полезное содержимое другого файла... Слово "флешка" в первом посте - это ведь не flash-память программ Вашего МК?
Go to the top of the page
 
+Quote Post
qVlad
сообщение Apr 25 2011, 11:17
Сообщение #5


Участник
*

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



Цитата(Палыч @ Apr 25 2011, 15:12) *
Её, как раз, ничем заполнять не нужно


Пересобрал прошивки без заполнителя. Результат тот же. При считывание памяти МК неиспользуемая память все равно заполнена FF
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 25 2011, 11:26
Сообщение #6


Гуру
******

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



Цитата(qVlad @ Apr 25 2011, 15:17) *
При считывание памяти МК неиспользуемая память все равно заполнена FF
Ага, значит записываете, всё-така в память программ... FF - это, нормально, стёртая память читается как FF
Цитата(qVlad @ Apr 25 2011, 15:17) *
Пересобрал прошивки без заполнителя. Результат тот же.
А у Вас начало памяти программ заполнено разными данными в обоих файлах!
Go to the top of the page
 
+Quote Post
qVlad
сообщение Apr 25 2011, 11:31
Сообщение #7


Участник
*

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



Цитата(Палыч @ Apr 25 2011, 15:26) *
А у Вас начало памяти программ заполнено разными данными в обоих файлах!


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

Допустим начало памяти разное, сначала я записываю прошивку,которая начинается с 0х8000 адреса. потом записываю прошивку которая начинается с 0 адреса, по идеи хотя бы та что с нулевого должна же грузится. А у меня контроллер не подается признаков того что прошивка начинает работу
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 25 2011, 11:40
Сообщение #8


Гуру
******

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



Цитата(qVlad @ Apr 25 2011, 15:31) *
Допустим начало памяти разное, сначала я записываю прошивку,которая начинается с 0х8000 адреса. потом записываю прошивку которая начинается с 0 адреса, по идеи хотя бы та что с нулевого должна же грузится. А у меня контроллер не подается признаков того что прошивка начинает работу
Каждый файл начинается с расположенной по адресу 0 команды перехода на начало программы: 0C94624B или 0C949551. Первые два байта - одинаковые, а вот адреса переходов - разные. при программировании в предварительно стёртой памяти (содержит FF) "прописываются" нолики, при записи второго файла - эти ячейки уже не будут содержать FF, но "добавятся" нолики из другого файла.
И, вообще, - не понятно: как вы собираетесь запускать программу из второй половины памяти? Вектора у Вас разделятся между программами как будут?
Go to the top of the page
 
+Quote Post
qVlad
сообщение Apr 25 2011, 11:45
Сообщение #9


Участник
*

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



Цитата(Палыч @ Apr 25 2011, 15:40) *
Каждый файл начинается с расположенной по адресу 0 команды перехода на начало программы: 0C94624B или 0C949551. Первые два байта - одинаковые, а вот адреса переходов - разные. при программировании в предварительно стёртой памяти (содержит FF) "прописываются" нолики, при записи второго файла - эти ячейки уже не будут содержать FF, но "добавятся" нолики из другого файла.
И, вообще, - не понятно: как вы собираетесь запускать программу из второй половины памяти? Вектора у Вас разделятся между программыми как будут?


Это все равно не объясняет проблемы что не грузиться даже прошивка расположенная в начале памяти. Ведь получается все данные для нее верные. Или я что-то не понимаю?

Помимо двух прошивок еще есть бутлоадер, который собственно и будет указывать с какого адреса стартовать программе. Сейчас он не используется.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 25 2011, 12:04
Сообщение #10


Гуру
******

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



Цитата(qVlad @ Apr 25 2011, 15:45) *
Или я что-то не понимаю?
Ещё раз: при программировании - "прошиваются" нолики. У Вас в первых четырех байтах одной прошивки 0C94624B, второй - 0C949551... После прошивки памяти этими двумя прошивками: первые четыре байта будет содержать 0С940041 (нолики из обоих файлов - сложатся, добавятся к содержимому ячеек памяти)...
Цитата(qVlad @ Apr 25 2011, 15:45) *
Помимо двух прошивок еще есть бутлоадер, который собственно и будет указывать с какого адреса стартовать программе. Сейчас он не используется.
А откуда BootLoader узнает стартовые адреса ваших программ. При "нормальной"(раздельной) загрузке Ваших файлов вектор 0 содержит команду перехода на "стартовый" адрес (у Вас там ещё какой-то вектор используется, и, может, - не один). Вектора всегда (за исключением BootLoader'а) используют фиксированные адреса для векторов прерываний. Они то и портятся при "заливке" двух прошивок одновременно...

То, что под вторую программу Вы отвели вторую половину памяти, не означает, что "стартовый" адрес второй программы = 8000. С этого адреса распологаются команды, но, команда, которая должна выполнится первой - совсем не с этого адреса!
Go to the top of the page
 
+Quote Post
qVlad
сообщение Apr 25 2011, 12:15
Сообщение #11


Участник
*

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



Цитата(Палыч @ Apr 25 2011, 16:04) *
Ещё раз: при программировании - "прошиваются" нолики. У Вас в первых четырех байтах одной прошивки 0C94624B, второй - 0C949551... После прошивки памяти этими двумя прошивками: первые четыре байта будет содержать 0С940041 (нолики из обоих файлов - сложатся, добавятся к содержимому ячеек памяти)...
А откуда BootLoader узнает стартовые адреса ваших программ. При "нормальной"(раздельной) загрузке Ваших файлов вектор 0 содержит команду перехода на "стартовый" адрес (у Вас там ещё какой-то вектор используется, и, может, - не один). Вектора всегда (за исключением BootLoader'а) используют фиксированные адреса для векторов прерываний. Они то и портятся при "заливке" двух прошивок одновременно...

Спасибо. С этим теперь стало понятно.

Цитата(Палыч @ Apr 25 2011, 16:04) *
То, что под вторую программу Вы отвели вторую половину памяти, не означает, что "стартовый" адрес второй программы = 8000. С этого адреса распологаются команды, но, команда, которая должна выполнится первой - совсем не с этого адреса!


А как же мне тогда быть. Нельзя ли команду перехода перенести из начала памяти в заданную область опять же в 8000 чтобы при переходе туда можно было загрузить вторую программу.
Или тут есть какое-то иное, более правильное решение?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 25 2011, 12:32
Сообщение #12


Гуру
******

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



Цитата(qVlad @ Apr 25 2011, 16:15) *
Или тут есть какое-то иное, более правильное решение?
1. Одна из программ, по всей видимости, не должна использовать прерывания.
2. Труднее с вектором 0. Ваш транслятор (с языка Си - имхо) всегда в прошивку поместит команду по этому вектору (писать на ассемблере - не предлагаю, но там можно это обойти). Когда мне пришлось делать нечто подобное, я "заложил" в BootLoader функцию защиты вектора при заливке не первой программы: загрузчик не прописывал новую команду по этому вектору, но "выкусывал" из неё адрес, который сохранял в особой области памяти, и, в случае необходимости - передавал управление на этот адрес.
Go to the top of the page
 
+Quote Post
qVlad
сообщение Apr 25 2011, 12:41
Сообщение #13


Участник
*

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



Цитата(Палыч @ Apr 25 2011, 16:32) *
1. Одна из программ, по всей видимости, не должна использовать прерывания.

Такой вариант не подходит

Цитата(Палыч @ Apr 25 2011, 16:32) *
2. Труднее с вектором 0. Ваш транслятор (с языка Си - имхо) всегда в прошивку поместит команду по этому вектору (писать на ассемблере - не предлагаю, но там можно это обойти). Когда мне пришлось делать нечто подобное, я "заложил" в BootLoader функцию защиты вектора при заливке не первой программы: загрузчик не прописывал новую команду по этому вектору, но "выкусывал" из неё адрес, который сохранял в особой области памяти, и, в случае необходимости - передавал управление на этот адрес.

Почему в одной программе вектор 0 присутствует,а в другой нет?

По этим адресам получается расположены вектора прерываний?
:04002800
:08006400
:08016000
:0801DC0

Разве переменная -Z(CODE)INTVEC не отвечает за место где будут размещаться вектора прерываний?

Вот еще два mapping

EGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN
======= ===== ============= =========== ==== ==== =====
INTVEC CODE 00008000 - 00008003 4 com 1
CODE CODE 00008004 - 0000AB17 2B14 rel 1
INITTAB CODE 0000AB18 - 0000AB25 E rel 0
NEAR_ID CODE 0000AB26 - 0000AB7E 59 rel 0
ABSOLUTE DATA 00000020 rel 0
DATA 00000034
DATA 000001C0
CSTACK DATA 00002000 - 00002054 55 dse 0
RSTACK DATA 00002055 - 0000206C 18 dse 0
NEAR_I DATA 0000206D - 000020C5 59 rel 0
NEAR_Z DATA 000020C6 - 0000277C 6B7 rel 0
CODE 00000028 - 0000002B 4 aseg
CODE 00000064 - 0000006B 8 aseg
CODE 00000160 - 00000167 8 aseg
CODE 000001DC - 000001E3 8 aseg


SEGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN
======= ===== ============= =========== ==== ==== =====
INTVEC CODE 00000000 - 00000003 4 com 1
CODE CODE 000001E4 - 00002CF7 2B14 rel 1
INITTAB CODE 00002CF8 - 00002D05 E rel 0
NEAR_ID CODE 00002D06 - 00002D5E 59 rel 0
ABSOLUTE DATA 00000020 rel 0
DATA 00000034
DATA 000001C0
CSTACK DATA 00002000 - 00002054 55 dse 0
RSTACK DATA 00002055 - 0000206C 18 dse 0
NEAR_I DATA 0000206D - 000020C5 59 rel 0
NEAR_Z DATA 000020C6 - 0000277C 6B7 rel 0
CODE 00000028 - 0000002B 4 aseg
CODE 00000064 - 0000006B 8 aseg
CODE 00000160 - 00000167 8 aseg
CODE 000001DC - 000001E3 8 aseg


Из них получается что с нулевым вектором у меня проблем нет. для одной программы он расположен по адресу 0, для другой по адресу 8000.
А вот 4 других вектора или что это, пока не понятно расположены в одном и том же месте. Наверное их тоже можно передвинуть?

Сообщение отредактировал qVlad - Apr 25 2011, 12:50
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 25 2011, 12:52
Сообщение #14


Гуру
******

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



Цитата(qVlad @ Apr 25 2011, 16:41) *
Такой вариант не подходит
В таком случае можно предложить: загрузчик прописывае(перехватывает на себя) все вектора прерываний, и, в случае прерывания - получает управление и осуществляет переход на процедуру обработки прерывния одной либо другой программы в памяти...

Цитата(qVlad @ Apr 25 2011, 16:41) *
Почему в одной программе вектор 0 присутствует,а в другой нет?
Команда перехода на обработку этого прерывания содержится в обоих файлах

P.S. Действительно - соврал. Во второй программе эта команда лежит по адресу 8000.

Цитата(qVlad @ Apr 25 2011, 16:41) *
Разве переменная -Z(CODE)INTVEC не отвечает за место где будут размещаться вектора прерываний?
У Вас: вторая программа - загрузчик?

P.P.S. Если вторая программа - не загрузчик, то зачем Вам весь этот "гемморой"? А, если - загрузчик, то зачем "зашивать" оба файла одновременно?
Go to the top of the page
 
+Quote Post
qVlad
сообщение Apr 25 2011, 12:57
Сообщение #15


Участник
*

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



Файлы Flash.txt и FlashDef.txt содержат код одной и той же программы, отличаются же только местом расположения ее в памяти


Цитата(Палыч @ Apr 25 2011, 16:52) *
В таком случае можно предложить: загрузчик прописывае(перехватывает на себя) все вектора прерываний, и, в случае прерывания - получает управление и осуществляет переход на процедуру обработки прерывния одной либо другой программы в памяти...


Наверное это будет сложно реализовать, да и не очень удобно.
Go to the top of the page
 
+Quote Post
Палыч
сообщение 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 Текстовая версия Сейчас: 20th July 2025 - 05:24
Рейтинг@Mail.ru


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