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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Cамопрограммирование flash, ( Запись flash ), bootload, переход из RWW в NRWW, чтение констант из flash
Jhohn
сообщение Nov 13 2008, 13:38
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579



Здравствуйте!

Разрабатываемое устройство на Atmel 168 (flash = 16k, bootloader = 2048 byte) принимает данные по USB (эта часть уже реализована программно). Среда разработки WinAvr. Программная реализация USB (программа-usb) не маленькая больше чем bootloader. По USB принимаются данные (основная-программа + константы) и перепрошивается flash. Код основной-программы не писался, оочень большая вероятность что это будет > 2 к. У устройства есть два режима программирование (задание конфигурации) и работа самого устройства, для выбора режима имеется вход +5 В на ножку МК при программировании. EEPROM может не хватить поэтому предполагаю запись констант в флеш.

Вопросы:

1) При включении устройства мы переходим в bootload, проверяем вывод и соответственно переходим к jmp(необходимый адрес в flash) ?

2) Можно ли программу-usb расположить в flash принимать данные в ОЗУ потом jmp bootload, писать там код основной программы и обратно в программу в flash? (т.к. программа-usb не помещается в bootload )
т.е. вопрос могу ли я перейти из RWW в загрузчик (NRWW) КАК ? jmp (адрес) ?

3) Ход программирования предполагаю таким:
------( bootload_start см рис память flash ) загрузчик (nrww) [if (port == 1) ] ->
------( Jmp 1 ) к программе-usb ->
------( Jmp 1 ) пишем в озу 128 б принятые данные по usb ->
------( bootload ) оттуда пишем память > Jmp_2 ->
------( Jmp 1 )
reset
Ход выполнения основной программы:
------( bootload ) загрузчик (nrww) [if (port == 0) ] ->
------( Jmp 2 ) к основной-программе

ЕСТЬ ЗАМЕЧАНИЯ?


4) При выполнении основной-программы при считывании констант из flash, как прочесть константы ? (снова в загрузчик читать в озу и обратно?)



Жду замечаний ) Спасибо. smile.gif

Сообщение отредактировал Jhohn - Nov 13 2008, 13:54
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
GDI
сообщение Nov 13 2008, 14:06
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Почему тут http://www.obdev.at/products/avrusb/prjprog.html люди молут разместить бутлоадер а вы нет?


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Nov 13 2008, 14:10
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579



Цитата(GDI @ Nov 13 2008, 17:06) *
Почему тут http://www.obdev.at/products/avrusb/prjprog.html люди молут разместить бутлоадер а вы нет?


спасибо за ссылку.

Вопрос о размещении bootloader не стоял. я так понял вы не сталкивались с этим...

Жду замечаний по существу smile.gif

Сообщение отредактировал Jhohn - Nov 13 2008, 14:57
Go to the top of the page
 
+Quote Post
GDI
сообщение Nov 13 2008, 14:57
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата
Программная реализация USB (программа-usb) не маленькая больше чем bootloader.

Я так по этой фразе понял.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Nov 13 2008, 16:09
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579



Хочется получить грамотный ответ на поставленный вопрос smile.gif
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Nov 13 2008, 16:43
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Jhohn @ Nov 13 2008, 20:09) *
Хочется получить грамотный ответ на поставленный вопрос smile.gif

Принципиально - ничто не мешает. В своё время я планировал расположить в буте (в неизменяемой области) драйвера устр-в включая RS232 (по нём и обновление). В этом случае гарантировано один протокол обмена и при буте и при работе. Потом отказался от этой идеи.
Несколько непонятно зачем такие сложности.
1) я делаю так при старте бута смотрю ногу принудительного перехода в бут и смотрю DDR порта, который гарантировано не 0 при работе приложения (принудительный переход из приложения в бут) Считаю CRC области приложения (при несовпадении - в бут)
2)Учитывая, что загрузчик занимает > места чем область загрузчика у вас будут следующие ограничения.
a) Старт будет осуществлятся не с начала загрузчика, а с середины
б) область приложения будет кратна размеру страницы и требуется следить за тем, чтобы не запортить загрузчик.
в) вектора будут находится посередине.
Если это не пугает, то вперёд.

насчёт констант - какие вопросы?
Не знаю как это в WinAvR сделать - в IAR весьма всё просто осуществляется.
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Nov 13 2008, 21:19
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579



Цитата(SasaVitebsk @ Nov 13 2008, 19:43) *
Несколько непонятно зачем такие сложности.
....
Если это не пугает, то вперёд.


А у вас есть более "интересное" решение, данной задачи? smile.gif

К сожалению другого решения не вижу.

Сообщение отредактировал Jhohn - Nov 13 2008, 21:22
Go to the top of the page
 
+Quote Post
plombir
сообщение Nov 13 2008, 21:28
Сообщение #8


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

Группа: Участник
Сообщений: 99
Регистрация: 14-12-05
Пользователь №: 12 191



Цитата(Jhohn @ Nov 13 2008, 16:38) *
Здравствуйте!

Разрабатываемое устройство на Atmel 168 (flash = 16k, bootloader = 2048 byte) принимает данные по USB
...

2) Да можно.
В IARе я использовал #pragma location=bootadr для 2-х процедур (загрузка в буфер и прошить страницу), которые располагались в буте. Больше там ничего не было. К процедурам обращался как обычно call. Так как грузил я только таблицы, контроллер после не ресетил.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Nov 13 2008, 23:04
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Jhohn @ Nov 14 2008, 01:19) *
А у вас есть более "интересное" решение, данной задачи? smile.gif
К сожалению другого решения не вижу.

Это же программирование. Здесь решений - огромное количество. smile.gif

Во первых, при построении таких систем, я бы взял за основу стандартное построение мониторов и биосов. То есть наличие чётко описаных процедур и данных находящихся по фиксированным адресам.
Ну например:
E000: StartBoot
E002: ReadPacket
E004: SendPacket
E006: CRC8
Что там разместить - вам решать (я указал от балды), но надеюсь понятна идея, зачем это сделано?

Во вторых в верхней части разместил бы мааалюсенький boot. Идею на этом форуме кто-то из великих уже подкидывал. Правда назначение другое было Boot для Boot-а. Здесь таже хрень. Сам маленький бут понятия не имеет как данные поступают в МК. Он просто их берёт и записывает.

Размещение данных для бута может быть - озу, EEPROM, FLASH. То есть любое.

Конечно для эфективной работы такой системы предпочтительным является размер буфера превышающий размер апликейшена. Либо апликейшн строится по типу перемещаемого кода. В противном случае требуется несколько итераций для восстановления работоспособности всей системы в целом. Всё прописывается в проге зашивальщике.

Это усложнённо.
Если упростить, то размер приложения должен быть меньше свободного размера флэш в 2 раза.
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 17 2008, 00:18
Сообщение #10


кекс
******

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



Цитата(Jhohn @ Nov 13 2008, 23:19) *
А у вас есть более "интересное" решение, данной задачи? smile.gif

Есть
Берем внешний копеечный eeprom на 16KB. USB программой загоняем туда образ "программы которую надо зашить", и перезагружаем МК. Стартует загрузчик, проверяет нет ли во внешнем eeprom более свежей копии основной программы, если есть то он шьет ее в МК и передает управление по адресу 0.
Плюсы:
1. МК защищен от случайного перетирания флеша, бутлоадер всегда сможет восстановить основную программу из внешнего eeprom.
2. Бутлоадер может стать меньше (не 2K, а 1K) т.к. ему не нужно общаться с внешним компом.
3. Нет никаких манипуляций с программированием не из boot секции.
4. Основная программа совмещена с USB программой, т.е. всего два независимых модуля, а не три.

Минусы:
доп корпус.
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Nov 19 2008, 11:50
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579



В процессе записи в Flash сталкнулся с ошибкой:

Петедаю массив (в озу) - {1,1,1.. (128)...1,1,} в bootload, чтоб там записать во flash, но при записи получаю результат


:1019F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7
:101A000001020102010201020102010201020102BE
:101A100001020102010201020102010201020102AE
:101A2000010201020102010201020102010201029E
:101A3000010201020102010201020102010201028E
:101A4000001A009D7550400702BFC2880001A12204
:101A5000000121230102010201000000000000003A
:101A60000000FFFEFFFEFFFEFFFEFFFEFFFEFFFE8B
:101A7000FFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFE7E
:101A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66

вместо

:1019F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7
:101A000001010101010101010101010101010101C6
:101A100001010101010101010101010101010101B6
:101A200001010101010101010101010101010101A6
:101A30000101010101010101010101010101010196
:101A40000101010101010101010101010101010186
:101A50000101010101010101010101010101010176
:101A60000101010101010101010101010101010166
:101A70000101010101010101010101010101010156
:101A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66

Код загрузчика (функция взятая из avr/boot.h )
................................................................................
...................................................................
BOOTLOADER_SECTION
void boot_write_page(unsigned int page, unsigned int *buf)
{
unsigned int i;
unsigned int w;

eeprom_busy_wait ();
boot_page_erase (page);..............................// Стереть страницу
boot_spm_busy_wait ();................................// Ждем пока не сотрем страницу


for (i=0; i<PAGE_SIZE; i+=2)
{
w = *buf++;............................................// Запись w (2 байта) байт_старш + байт_младш
w += (*buf++) << 8;
boot_page_fill (page + i, w);.....................// Заносим в буфер данные [ addrerss, data_16 ]
}

boot_page_write (page);...............................// Запись в Флеш страницы
boot_spm_busy_wait();................................// Ждем пока не запишем страницу
boot_rww_enable ();.................................. // Разрешение адресации в области памяти программ

LED_OFF;

}
................................................................................
...................................................................
Вызов функции
................................................................................
...................................................................
boot_write_page(addr,usb_ram);........ //аргументы 1 - адрес по которуму пишем в флеш
........................................................//2 - массив (в озу) - {1,1,1.. (128)...1,1}

***************************************************************************
***************************************************************************
Вся проблема кроется здесь

w = *buf++;............................................// Запись w (2 байта) байт_старш + байт_младш
w += (*buf++) << 8;

неверно передаются данные из "*buf" в "w"

Сообщение отредактировал Jhohn - Nov 19 2008, 11:51
Go to the top of the page
 
+Quote Post
aesok
сообщение Nov 19 2008, 11:57
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Jhohn @ Nov 19 2008, 14:50) *
BOOTLOADER_SECTION
void boot_write_page(unsigned int page, unsigned int *buf)
{
...
}

Вся проблема кроется здесь

w = *buf++;............................................// Запись w (2 байта) байт_старш + байт_младш
w += (*buf++) << 8;

неверно передаются данные из "*buf" в "w"


buf - указатель на int, поэтому buf++ инкрементирует buf на 2.

Анатолий.
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Nov 19 2008, 12:35
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579



smile.gif Вы правы. Спасибо.
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Nov 24 2008, 11:21
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579



Мучаю Код help.gif

//////////////////////////////////////////////////////////////////////////////////////////////////////

if (val < PAGE_SIZE - 1)
{
.........usb_in_ram[val] = USBBuffer[5];

.........val += 1;
}
else
{
.........usb_in_ram[val] = USBBuffer[5];

.........boot_program_page(addr_word_flash, usb_in_ram); // запись страницы
..........addr_word_flash += 128;

..........val = 0;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////

записываемый флай в флеш

:101A000011111111111111111111111111111111C6
:101A100022222222222222222222222222222222A6
:101A20003333333333333333333333333333333386
:101A30004444444444444444444444444444444466
:101A40005555555555555555555555555555555546
:101A50006666666666666666666666666666666626
:101A60007777777777777777777777777777777706
:101A700088888888888888888888888888888888E6
:101A800099999999999999999999999999999999C6
:101A900022222222222222222222222222222222A6
:101AA0003333333333333333333333333333333386
:101AB0004444444444444444444444444444444466
:101AC0005555555555555555555555555555555546
:101AD0006666666666666666666666666666666626
:101AE0007777777777777777777777777777777706
:101AF00011111111111111111111111111111111E6

== 1 байту == 256 значений

РЕЗУЛЬТАТ:

:101A000011111111111111111111111111111111C6
:101A100022222222222222222222222222222222A6
:101A20003333333333333333333333333333333386
:101A30004444444444444444444444444444444466
:101A40005555555555555555555555555555555546
:101A50006666666666666666666666666666666626
:101A60007777777777777777777777777777777706
:101A700088888888888888888888888888888888E6
:101A800088999999999999999999999999999999D7
:101A900099222222222222222222222222222222AF
:101AA0002233333333333333333333333333333317
:101AB00033444444444444444444444444444444F7
:101AC00044555555555555555555555555555555D7
:101AD00055666666666666666666666666666666B7
:101AE0006677777777777777777777777777777797
:101AF0007711111111111111111111111111111170


В записанном файле первые 128 пишутся нормально, А ВТОРЫЕ 128 В НАЧАЛЕ добавляется БАЙТ ???

Где может быть проблема?
help.gif

Сообщение отредактировал Jhohn - Nov 24 2008, 11:24
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Nov 24 2008, 12:35
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579



может в функции проблема boot_program_page() ? хотя она стандартная в AVR ...

Сообщение отредактировал Jhohn - Nov 24 2008, 12:36
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 17th June 2025 - 17:05
Рейтинг@Mail.ru


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