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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Копирование в ОЗУ цикла записи во FLASH, Помогите пожалуйста реализовать
Desperanto
сообщение Feb 17 2011, 06:38
Сообщение #1


Участник
*

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



Помогите пожалуйста реализовать. Работать стал недавно, опыта мало. Суть такова: по UART надо залить прошивку по-битно. Я пересылаю по биту прошивки через UART и записываю во FLASH, предварительно стерев ее. Что бы это реализовать, мой цикл записи должен находиться в ОЗУ, иначе я вешаю контроллер. Если нужен исходник программы, приложу попозже. Такой способ записи выбран из-за довольно большой прошивки и FLASH и маленькой ОЗУ. А если еще сможете помочь реализовать верификацию прошивки после заливки, то буду очень признателен! sm.gif
ЗЫ: целевой контроллер MSP430F1611, но тест проводится на 149ом.
ЗЫ2: использую IAR 4.20 и язык С++.
Go to the top of the page
 
+Quote Post
ih_
сообщение Feb 17 2011, 06:58
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 77
Регистрация: 2-04-08
Из: Россия, Киров
Пользователь №: 36 422



Цитата(Desperanto @ Feb 17 2011, 09:38) *
Поиск по форуму Вам в помощь

http://electronix.ru/forum/index.php?showtopic=76384&hl=
http://electronix.ru/forum/index.php?showt...p;hl=bootloader
http://electronix.ru/forum/index.php?showtopic=37867&hl=
http://electronix.ru/forum/index.php?showtopic=75592&hl=

Тема очень популярна, и активная позиция (с поиском) выгодней... Дерзайте. sm.gif Не забудте про reMapping таблицы векторов. Старожилы говорят - это самый безопасный (грамотный) подход.
Go to the top of the page
 
+Quote Post
Desperanto
сообщение Feb 17 2011, 07:51
Сообщение #3


Участник
*

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



поиском пользовался, правда через гугл, по ссылкам ничего конкретного не увидел, все только общие советы. мне бы конкретный кусок кода для разбора, или пнуть где его можно увидеть. еще раз повторюсь что у меня мало опыта пока еще и мне бы вместе с советами еще хотя бы примерную их реализацию в коде (желательно на "С/С++").
у меня такая ситуация, что к девайсу нет простого прямого доступа. можно один раз его достать, по JTAG'у зашить прошивку с реализованной возможностью "перепрошивки" по UART. защит от дураков не надо, достаточно просто реализовать по-битную (можно по-байтную, тут не суть) заливку и проверку на правильность перешитой флэш. "трогать" буду только main flash, info оставляю не тронутой.
ЗЫ: почти все время с смомента регистрации пытался найти сам, гуглил везде и по всякому, много перечитал и перекачал...но никак не смог решить свою проблему и решил спрсоить помощи у знающих гуру.

а да, мне ж надо не только скопировать кусок исполняемого кода в RAM, но и запустить его оттуда, что б мог стереть флеш

Сообщение отредактировал Desperanto - Feb 17 2011, 07:55
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 17 2011, 07:59
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Desperanto @ Feb 17 2011, 10:51) *
а да, мне ж надо не только скопировать кусок исполняемого кода в RAM, но и запустить его оттуда, что б мог стереть флеш

В инструкции по эксплуатации, заботливо переведённой компэлом и выложенной на gaw.ru вроде бы всё предельно чётко расписано.
Вот, например:
CODE
; Запись одного блока, начиная с адреса 0F000h.
; Запись должна выполняться из ОЗУ; предполагается, что
флэш-память уже стерта.
; 514 кГц < SMCLK < 952 кГц
; Принимается ACCVIE = NMIIE = OFIE = 0.
MOV #32,R5 ; Используется как счетчик записи
MOV #0F000h,R6 ; Указатель записи
MOV #WDTPW+WDTHOLD,&WDTCTL ; Отключение сторожевого таймера
DINT ; Запрещение прерываний
L1 BIT #BUSY,&FCTL3 ; Проверка BUSY
JNZ L1 ; Ожидание в цикле, пока занято
MOV #FWKEY+FSSEL1+FN0,&FCTL2 ; SMCLK/2
MOV #FWKEY,&FCTL3 ; Очистка LOCK
MOV #FWKEY+BLKWRT+WRT,&FCTL1 ; Разрешение записи блока
L2 MOV Write_Value,0(R6) ; Месторасположение записи
L3 BIT #WAIT,&FCTL3 ; Проверка WAIT
JZ L3 ; Ожидание в цикле, пока WAIT=0
INCD R6 ; Указание на следующее слово
DEC R5 ; Декремент счетчика записи
JNZ L2 ; Конец блока?
MOV #FWKEY,&FCTL1 ; Очистка WRT,BLKWRT
L4 BIT #BUSY,&FCTL3 ; Проверка BUSY
JNZ L4 ; Ожидание в цикле, пока занято
MOV #FWKEY+LOCK,&FCTL3 ; Установка LOCK
... ; Повторный запуск сторожевого таймера,
; если необходимо
EINT ; Разрешение прерываний


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Desperanto
сообщение Feb 17 2011, 08:14
Сообщение #5


Участник
*

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



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

MrYuran, с ассемблером я не знаком никак. смог бы кто перевести на С? да и мне помимо просто инициализации стирания/записи, надо бы целый кусок кода запустить из ОЗУ (в том куске я получаю бит прошивки по UART и пишу его во флеш, ну и это в цикле пока не кончится прошивка).
я так понимаю я могу сделать указатель на функцию, который вернет мне ее адрес, потом надо с этого адреса до конца функции скопировать в ОЗУ и запустить оттуда (как я не знаю), и работать из ОЗУ пока не получу команду конца прошивки и ресета.

Сообщение отредактировал Desperanto - Feb 17 2011, 08:16
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 17 2011, 08:38
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Desperanto @ Feb 17 2011, 08:38) *
Такой способ записи выбран из-за довольно большой прошивки и FLASH и маленькой ОЗУ.
Связь двухстороняя? Посылающая сторона может послать один блок (содержимое одного сектора) и замолчать в ожидании подтверждения от устройства?

QUOTE (Desperanto @ Feb 17 2011, 08:38) *
А если еще сможете помочь реализовать верификацию прошивки после заливки, то буду очень признателен! sm.gif
Я вам распишу как сделано у меня, возможно такой вариант вам подойдет:
1) При старте загрузчик получает управление.
2) Он проверяет - не было ли это передачей управления из приложения
3) Если это был вызов из приложения - переход на шаг 9
4) В противном случае он проверяет ногу принудительного запуска загрузки, если нога активирована - переход к шагу 7
5) Загрузчик считает контрольную сумму приложения.
6) Если сумма совпала - значит приложение на месте, прописано полностью и без ошибок. Загрузчик копирует вектора прерываний приложения в ОЗУ и передает управление на вектор сброса в этой таблице.
Если сумма не совпала, значит приложения нет.
7) Загрузчик ожидает по интерфейсу команды начала заливки.
8) Загрузчик получает эту команду.
9) Загрузчик отвечает "Я стартовал, к загрузке готов".
10) Запускается собака.
11) Загрузчик ожидает пакет с содержимым очередной страницы
12) Получив пакет он записывает страницу
13) Записав страницу он сбрасывает собаку и посылает ответ "пакет обработан, готов"
14) переход на шаг 11

Если это был последниу пакет - в процессе ожидания на шаге 11 сработает собака, проц попадает в состояние 1.
После этого начнется выполнение с самого начала, загрузчик проверит контрольную сумму приложения и если обновление удалось - запустит приложение.

Приложение штатно общается с внешним миром по какому-то протоколу, одна из команд которого - начать обновление. Получив эту команду приложение запрещает прерывания и передает управление на вектор сброса процессора. Запускается загрузчик и уже он посылает подтверждение на эту команду. Эта же команда - единственная, которую поддерживает сам загрузчик (на самом деле у меня загрузчик поддерживает еще одну команду - сообщить о версии софта. Он отвечает версию 0, что означает "голый загрузчик, приложения нет". Приложение же в ответ на эту команду сообщает свою версию).

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

Да, и при этом в ОЗУ нет ни одной функции.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Desperanto
сообщение Feb 17 2011, 10:01
Сообщение #7


Участник
*

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



Сергей Борщ, связь дусторонняя, отправить могу хоть байт, хоть бит хоть сколько влезет в РАМ (сектор влезет) Ваш алгоритм вцелом подходит. У моего девайса следующий алгоритм работы:
-девайс все вермя получает данные по радиоканалу и отправляет их дальше через UART на РС.
-с РС по UART я отсылаю команду на прошивку, девайс встает в паузу и ждет повтора запроса на прошивку (на случай если ошибочно отправил команду)
-далее выполняется пошивки по-битно/байтно/как удобно

алгоритм самой прошивки я хотел сдлеать такой:
-получаю бит/байт и стартовый адрес,
-проверяю не получил ли я команду конца прошивки /символ q например/,
-перехожу в стартовый адрес, стираю флеш,
-записываю полученный бит/байт, адрес++,
-получаю следующий бит/байт, проверяю на конец прошивки и записываю и т.д. до получения 'q'
после чего надо свериться снуля с прошивкой которую загрузил (на случай вдруг какой из пакетов потерялся), если проверка FAIL, то все сначала, если ОК - делаем ресет, дабы новая пошивка подцепилась (во всех последущих прошивках будет использоваться такой же метод обновления)
первая прошивка с этим "модулем" конечно же будет заливаться по JTAG с ПК или "полевым программатором" sm.gif

Сообщение отредактировал Desperanto - Feb 17 2011, 10:02
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 17 2011, 10:10
Сообщение #8


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Сергей Борщ @ Feb 17 2011, 11:38) *
6) Если сумма совпала - значит приложение на месте, прописано полностью и без ошибок. Загрузчик копирует вектора прерываний приложения в ОЗУ и передает управление на вектор сброса в этой таблице.

Сергей, а можно вот этот момент поподробнее?
Я что-то никак ниасилю сакральный смысл этой манипуляции...

А вместо штатных векторов тогда что будет?
И при возникновении прерывания обращение всё равно будет к стандартным векторам, а не в ОЗУ?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 17 2011, 10:14
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Desperanto @ Feb 17 2011, 11:44) *
алгоритм самой прошивки я хотел сдлеать такой:
-получаю бит/байт и стартовый адрес,
-проверяю не получил ли я команду конца прошивки /символ q например/,
-перехожу в стартовый адрес, стираю флеш,
-записываю полученный бит/байт, адрес++,
-получаю следующий бит/байт, проверяю на конец прошивки и записываю и т.д. до получения 'q'
после чего надо свериться снуля с прошивкой которую загрузил (на случай вдруг какой из пакетов потерялся), если проверка FAIL, то все сначала, если ОК - делаем ресет, дабы новая пошивка подцепилась (во всех последущих прошивках будет использоваться такой же метод обновления)
У меня в протоколе общения с собственно загрузчиком 6 команд, но сейчас я понял, что достаточно всего четырех:
- Стереть всю флешь приложения
- Записать сектор начиная с адреса N
- Записать блок в EEPROM (для АВР)
- Мусор (для внесения энтропии в зашифрованный бинарник).
Отдельной команды на окончание прошивки не нужно - в любом случае будет вылет по тайм-ауту.

Прошивка кодируется AES128, в качестве основы брал пример AVR231.

С проверкой как-то у вас замудрено получилось. Достаточно подсчитать контрольную сумму. Я делал загрузчик для MSP430F2618, была возможность подсчета отдельно суммы приложения в нижних 64К и "верхней памяти", весь загрузчик уложился в 2.4К (это с выводом линейки прогресса на i2c ЖКИ), писался под mspgcc. На верхней памяти кажется даже проверял и все работало.

P.S. Обманул - 3К занимал загрузчик.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Desperanto
сообщение Feb 17 2011, 10:30
Сообщение #10


Участник
*

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



Сергей Борщ ну так вернемся к сути первых моих сообщений? sm.gif можете помочь? могу выслать иходник для большей понятности.
кстати прошивку я планировал брать в ti тхт формате
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 17 2011, 11:01
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (MrYuran @ Feb 17 2011, 12:10) *
Сергей, а можно вот этот момент поподробнее?
Я что-то никак ниасилю сакральный смысл этой манипуляции...
Да, память подводит - вектора не копируются (копируются они у меня в ARM7), на всех векторах кроме сброса висят затычки-перенаправления на вектора приложения. Это добавляет одну лишнюю команду BR в каждый обработчик, но позволяет защитить загрузчик от случайного стирания.

QUOTE (Desperanto @ Feb 17 2011, 12:30) *
Сергей Борщ ну так вернемся к сути первых моих сообщений? sm.gif можете помочь? могу выслать иходник для большей понятности.
кстати прошивку я планировал брать в ti тхт формате
А в чем суть? Копировать функции в ОЗУ можно (вам придется разобраться с поддержкой сегментов линкером), но считаю это неверным подходом - ведь можно выполнять загрузчик прямо из флеша. Какой смысл передавать ti txt формат - чтобы засовывать в загрузчик еще и парсер текстовых строк? Гораздо проще на PC перевести прошивку сразу в двоичный формат. А потом вы отправите прибор заказчику и потребуется перепрошивка - будете посылать прошивку в открытом виде? Так почему бы изначально не заложить шифрование и защититься от клонирования?
С ИАРом давно не работаю, поэтому помочь навряд ли смогу.
Вся процедура записи сводится к записи данных по указателю и команде FCTL1 = FWKEY | WRT;


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Desperanto
сообщение Feb 17 2011, 11:26
Сообщение #12


Участник
*

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



Сергей Борщ передавать в ti txt потому что так хочется пользователю sm.gif клонировать никто ничего не будет. а Вы на каком языке пишете приложения для мсп? по поводу парсера текста: он же будет не в прошивке, а во внешней программе на ПК, там прошивка загрузится в один массив без пробелов одной строкой и будет передаваться как потребуется,
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 17 2011, 11:36
Сообщение #13


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Desperanto @ Feb 17 2011, 14:26) *
Сергей Борщ передавать в ti txt потому что так хочется пользователю sm.gif клонировать никто ничего не будет. а Вы на каком языке пишете приложения для мсп? по поводу парсера текста: он же будет не в прошивке, а во внешней программе на ПК, там прошивка загрузится в один массив без пробелов одной строкой и будет передаваться как потребуется,

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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 17 2011, 11:39
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Desperanto @ Feb 17 2011, 13:26) *
Сергей Борщ передавать в ti txt потому что так хочется пользователю sm.gif клонировать никто ничего не будет. а Вы на каком языке пишете приложения для мсп? по поводу парсера текста: он же будет не в прошивке, а во внешней программе на ПК, там прошивка загрузится в один массив без пробелов одной строкой и будет передаваться как потребуется,
Пишу на С++. Если парсится на стороне PC, то уже без разницы какой формат. Да, а чем вас bsl не устраивает, MrYuran прав!


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Desperanto
сообщение Feb 17 2011, 12:10
Сообщение #15


Участник
*

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



Сергей Борщ, MrYuran, хм...а слона то я и не заметил sm.gif надо поглядеть как разведена плата и попробовать sm.gif спасибо за ответы!
Go to the top of the page
 
+Quote Post

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

 


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


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