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

 
 
> Размещение bootloader по произвольному адресу
athlon64
сообщение Aug 29 2010, 06:14
Сообщение #1


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

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



SAM7X512, IAR 5.50
Реализую bootloader, который должен располагаться в конце флеша с адреса 0x177FFF. Изменив в ICF-файле значение __ICFEDIT_region_ROM_start__ на 0x177FFF, получаю нерабочую прошивку.
Как я понимаю, это происходит потому что таблица векторов прерываний должна остаться по адресу 0x100000 и иметь соответствующее смещение. Как это сделать? Править startup?

Сейчас стартап от одного из примеров в IAR
Прикрепленные файлы
Прикрепленный файл  board_cstartup_iar.zip ( 1.53 килобайт ) Кол-во скачиваний: 26
 


--------------------
Руслан
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
kosyak©
сообщение Aug 29 2010, 06:51
Сообщение #2


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

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Скорее править скрипт линкера.
Нужно указать линкеру, чтобы секцию vectors из вашего стартапа он ложил всегда в начало флэши.
Go to the top of the page
 
+Quote Post
athlon64
сообщение Aug 29 2010, 10:12
Сообщение #3


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

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Подправил адрес размещения секции STA:
Код
define region STA_region = mem:[from 0x100000 size __ICFEDIT_size_startup__];

Теперь программа стартует


--------------------
Руслан
Go to the top of the page
 
+Quote Post
athlon64
сообщение Aug 29 2010, 11:24
Сообщение #4


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

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



А возможно ли указать линкеру помещать копию стартапа ещё по одному адресу?
Пробовал так:
Код
define symbol __ICFEDIT_region_ROM_start__      = 0x177FFF;
define symbol __ICFEDIT_region_ROM_end__        = 0x17FEFF;

define symbol __ICFEDIT_region_COPY_STA_start__ = 0x17FF00;
define symbol __ICFEDIT_region_COPY_STA_end__   = 0x17FFFF;

define symbol __ICFEDIT_region_RAM_start__      = 0x200000;
define symbol __ICFEDIT_region_RAM_end__        = 0x21FFFF;

/*-Sizes-*/
define symbol __ICFEDIT_size_startup__  = 0x100;
define symbol __ICFEDIT_size_vectors__  = 0x100;
define symbol __ICFEDIT_size_cstack__   = 0x1000;
define symbol __ICFEDIT_size_sysstack__ = 0x60;
define symbol __ICFEDIT_size_irqstack__ = 0x60;
define symbol __ICFEDIT_size_heap__     = 0x0;

/*-Exports-*/
export symbol __ICFEDIT_region_ROM_start__;
export symbol __ICFEDIT_region_ROM_end__;
export symbol __ICFEDIT_region_RAM_start__;
export symbol __ICFEDIT_region_RAM_end__;
export symbol __ICFEDIT_size_startup__;
export symbol __ICFEDIT_size_vectors__;
export symbol __ICFEDIT_size_cstack__;
export symbol __ICFEDIT_size_sysstack__;
export symbol __ICFEDIT_size_irqstack__;
export symbol __ICFEDIT_size_heap__;
/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;

define region STA_region      = mem:[from 0x100000 size __ICFEDIT_size_startup__];
define region ROM_region      = mem:[from __ICFEDIT_region_ROM_start__+__ICFEDIT_size_startup__ to __ICFEDIT_region_ROM_end__];
define region COPY_STA_region = mem:[from __ICFEDIT_region_COPY_STA_start__ size __ICFEDIT_size_startup__];

define region VEC_region      = mem:[from __ICFEDIT_region_RAM_start__ size __ICFEDIT_size_vectors__];
define region RAM_region      = mem:[from __ICFEDIT_region_RAM_start__+__ICFEDIT_size_vectors__ to __ICFEDIT_region_RAM_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block SYS_STACK with alignment = 8, size = __ICFEDIT_size_sysstack__ { };
define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

initialize by copy { readwrite };
initialize by copy { section .vectors };
do not initialize  { section .noinit };

place in STA_region { section .cstartup };
place in ROM_region { readonly };
place in COPY_STA_region { section .cstartup };
place in VEC_region { section .vectors };
place in RAM_region { readwrite, block IRQ_STACK, block SYS_STACK, block CSTACK, block HEAP };

ругается что стартап размещается дважды

Сообщение отредактировал athlon64 - Aug 29 2010, 11:25


--------------------
Руслан
Go to the top of the page
 
+Quote Post
athlon64
сообщение Sep 7 2010, 04:48
Сообщение #5


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

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Реализовал приём и запись прошивки во флеш. Логика следующая:
Бутлодер расположен в конце флешки начиная с адреса 0x177FFF, но его стартап расположен по адресу 0x100000. Последняя страница флешки зарезервирована для хранения резервной копии стартапа бутлодера, необходимой для переключения из user режима в boot.
Пользовательская программа слинкована так что в 1 странице флеша (с адреса 0x100000) лежит её стартап и далее сама программа (с адреса 0x100100).

Стартапы стандартные, взяты из примеров в IAR.
По отдельности обе прошивки (user и boot), прошитые самбой, работают нормально.
Программа на компьютере берёт bin-файл скомпилированный в IAR, разбивает его на страницы и отсылает блоками по 64 байта в ком-порт контроллера, бутлодер набирает буфер страницы, после чего пишет его во флеш. Первая страница (со стартапом) пишется в последнюю очередь.
Проверял то, что записывается во флеш - совпадает с bin-файлом пользовательской прошивки байт в байт начиная с адреса 0x100000.

После перезагрузки пользовательская программа не запускается. Нужны ли ещё какие то манипуляции после записи прошивки во флеш?
Отладчика нет, к сожалению


Всё заработало, косяк был в неправильном порядке байт в 32 битных элементах буфера записи, тот же косяк был и при последующем чтении флеша, поэтому не заметил. Всем спасибо smile.gif


--------------------
Руслан
Go to the top of the page
 
+Quote Post

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

 


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


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