Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Копирование в ОЗУ цикла записи во FLASH
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Desperanto
Помогите пожалуйста реализовать. Работать стал недавно, опыта мало. Суть такова: по UART надо залить прошивку по-битно. Я пересылаю по биту прошивки через UART и записываю во FLASH, предварительно стерев ее. Что бы это реализовать, мой цикл записи должен находиться в ОЗУ, иначе я вешаю контроллер. Если нужен исходник программы, приложу попозже. Такой способ записи выбран из-за довольно большой прошивки и FLASH и маленькой ОЗУ. А если еще сможете помочь реализовать верификацию прошивки после заливки, то буду очень признателен! sm.gif
ЗЫ: целевой контроллер MSP430F1611, но тест проводится на 149ом.
ЗЫ2: использую IAR 4.20 и язык С++.
ih_
Цитата(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 таблицы векторов. Старожилы говорят - это самый безопасный (грамотный) подход.
Desperanto
поиском пользовался, правда через гугл, по ссылкам ничего конкретного не увидел, все только общие советы. мне бы конкретный кусок кода для разбора, или пнуть где его можно увидеть. еще раз повторюсь что у меня мало опыта пока еще и мне бы вместе с советами еще хотя бы примерную их реализацию в коде (желательно на "С/С++").
у меня такая ситуация, что к девайсу нет простого прямого доступа. можно один раз его достать, по JTAG'у зашить прошивку с реализованной возможностью "перепрошивки" по UART. защит от дураков не надо, достаточно просто реализовать по-битную (можно по-байтную, тут не суть) заливку и проверку на правильность перешитой флэш. "трогать" буду только main flash, info оставляю не тронутой.
ЗЫ: почти все время с смомента регистрации пытался найти сам, гуглил везде и по всякому, много перечитал и перекачал...но никак не смог решить свою проблему и решил спрсоить помощи у знающих гуру.

а да, мне ж надо не только скопировать кусок исполняемого кода в RAM, но и запустить его оттуда, что б мог стереть флеш
MrYuran
Цитата(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 ; Разрешение прерываний
Desperanto
готов даже высказать материальное спасибо за помощь, как все получится sm.gif

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

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

алгоритм самой прошивки я хотел сдлеать такой:
-получаю бит/байт и стартовый адрес,
-проверяю не получил ли я команду конца прошивки /символ q например/,
-перехожу в стартовый адрес, стираю флеш,
-записываю полученный бит/байт, адрес++,
-получаю следующий бит/байт, проверяю на конец прошивки и записываю и т.д. до получения 'q'
после чего надо свериться снуля с прошивкой которую загрузил (на случай вдруг какой из пакетов потерялся), если проверка FAIL, то все сначала, если ОК - делаем ресет, дабы новая пошивка подцепилась (во всех последущих прошивках будет использоваться такой же метод обновления)
первая прошивка с этим "модулем" конечно же будет заливаться по JTAG с ПК или "полевым программатором" sm.gif
MrYuran
Цитата(Сергей Борщ @ Feb 17 2011, 11:38) *
6) Если сумма совпала - значит приложение на месте, прописано полностью и без ошибок. Загрузчик копирует вектора прерываний приложения в ОЗУ и передает управление на вектор сброса в этой таблице.

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

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

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

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

P.S. Обманул - 3К занимал загрузчик.
Desperanto
Сергей Борщ ну так вернемся к сути первых моих сообщений? sm.gif можете помочь? могу выслать иходник для большей понятности.
кстати прошивку я планировал брать в ti тхт формате
Сергей Борщ
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;
Desperanto
Сергей Борщ передавать в ti txt потому что так хочется пользователю sm.gif клонировать никто ничего не будет. а Вы на каком языке пишете приложения для мсп? по поводу парсера текста: он же будет не в прошивке, а во внешней программе на ПК, там прошивка загрузится в один массив без пробелов одной строкой и будет передаваться как потребуется,
MrYuran
Цитата(Desperanto @ Feb 17 2011, 14:26) *
Сергей Борщ передавать в ti txt потому что так хочется пользователю sm.gif клонировать никто ничего не будет. а Вы на каком языке пишете приложения для мсп? по поводу парсера текста: он же будет не в прошивке, а во внешней программе на ПК, там прошивка загрузится в один массив без пробелов одной строкой и будет передаваться как потребуется,

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

Ещё есть режим блочной записи, который только из ОЗУ работает.
Я, правда, никогда не пользовался, не было нужды.
Обычно записываю в флешь структуру параметров - максимум десятки байт.
Но вот при перепрошивке как бы напрашивается...

Запись единичного слова при работе из флеши - 33 такта контроллера флеши.
А запись блока из 64 байт в блочном - 20 тактов.
Разница более чем существенная.
rezident
Цитата(MrYuran @ Feb 17 2011, 18:17) *
Разница более чем существенная.
Разница есть, но время записи из Flash сравнимо с временем пересылки такого же количества данных по связи.
jorikdima
Цитата(Desperanto @ Feb 17 2011, 09:38) *
Помогите пожалуйста реализовать.
ЗЫ2: использую IAR 4.20 и язык С++.

email свой скинте в личку. пришлю проект.
Desperanto
jorikdima скинул sm.gif
Desperanto
jorikdima личку то получили? а то не могу посмотреть отправленные сообщения на форуме
Desperanto
друзья, подниму тему sm.gif а кто чем пользуется для работы по UART? каким софтом? rs232 например, а что еще есть? кто чем прошивается? самописные программы? может кто-нибудь поделиться исходниками что бы посмотреть как что?
Ave
Как можно программно запустить BSL для MSP430.
rezident
Цитата(Ave @ Jul 15 2011, 14:18) *
Как можно программно запустить BSL для MSP430.

RTFM! MSP430 Programming Via the Bootstrap Loader (BSL) (Rev. A) (slau319a.pdf + Associated Files)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.