shamray
Aug 17 2006, 09:26
Я делаю bootloader для свой программы. Создал 2 проэкта в пределах одного Workspace. Хотелось бы что-бы файлы генерируемые из каждого роекта ложились в один hex.
Для бутлодера определил сегменты так:
Код
//=============================================================================
// Interrupt vectors
-Z(CODE)INTVEC=(FLASH_SIZE-BOOT_SIZE)-(FLASH_SIZE-BOOT_SIZE+IVT_SIZE-1)
//=============================================================================
// Code memory
-Z(CODE)NEAR_F,HUGE_F,SWITCH,INITTAB,CODE=(FLASH_SIZE-BOOT_SIZE)-(FLASH_SIZE-1)
-Z(FARCODE)FAR_F,FARCODE=(FLASH_SIZE-BOOT_SIZE)-(FLASH_SIZE-1)
//=============================================================================
// RAM
-Z(DATA)NEAR_I,NEAR_Z=RAM_BASE-(RAM_BASE+RAM_SIZE-1)
-Z(DATA)RSTACK+40=RAM_BASE-(RAM_BASE+RAM_SIZE-1)
-Z(DATA)CSTACK+(RAM_SIZE-40-APP_SRAM_USAGE)=RAM_BASE-(RAM_BASE+RAM_SIZE-1)
-Z(CODE)TINY_ID,NEAR_ID,HUGE_ID=(FLASH_SIZE-BOOT_SIZE)-(FLASH_SIZE-1)
вроде по map файлу ложится нормально. Но вот как добавить код основной прогаммы с 0-го адреса в выходной файл линковщика?
1. Надо другой программой объеденить 2 HEX файла в один
2. Добавить в проект с основной программой объектный файл скомпилированного бутлоадера
3. В одном проекте и бутлоадер и программа
shamray
Aug 17 2006, 09:55
Цитата(KRS @ Aug 17 2006, 12:43)

1. Надо другой программой объеденить 2 HEX файла в один
2. Добавить в проект с основной программой объектный файл скомпилированного бутлоадера
3. В одном проекте и бутлоадер и программа
1. Если не секрет - какой программой.
2. Не понял.
3. В одном проекте? А как потом задать что-бы одни функции ложились по адресам программы, а другие по адресам бутлодера? Вставлять перед каждой функцией указание на нйжный сегмент? Очень это геморно. Притом файлы из основной проги могут называться так-же как и из бутлодера, а пеименовывать их я не хочу.
Может можно как-то указать инкуру типа с адреса 0 вставляй этот файл, а с адреса хххх другой?
IgorKossak
Aug 17 2006, 13:48
Цитата(shamray @ Aug 17 2006, 12:55)

Цитата(KRS @ Aug 17 2006, 12:43)

1. Надо другой программой объеденить 2 HEX файла в один
1. Если не секрет - какой программой.
Текстовым редактором.
Последняя строка hex файла содержит команду конца файла.
У первого из сливаемых файлов её надо удалить, а вместо этой строки вставить содержимое второго файла.
Весь этот гарнитур можно зашивать сразу в МК.
Harbour
Aug 18 2006, 02:14
Вот один из вариантов для atmega8515, выдержка из makefil'а
....
binmerge:
dd if=/dev/zero of=code.bin bs=1024 count=8
dd if=app.bin conv=notrunc of=code.bin
dd if=boot.bin conv=notrunc of=code.bin bs=1 seek=6144
bin2hex code.bin code.hex
.......
Цитата(shamray @ Aug 17 2006, 13:55)

Цитата(KRS @ Aug 17 2006, 12:43)

2. Добавить в проект с основной программой объектный файл скомпилированного бутлоадера
2. Не понял.
Можно в проект добавить объектный файл, обычным сопсобом как и с файлы.
Можно в xcl файле указать дополнительбные объектники или библиотеки
Но все равно придется код и данные по разным сегментам раскидывать!
с данными и константами проще достаочно один раз
Код
#pragma constseg=
#pragma dataseg=
задать, а вот для кода такой прагмы нету
Господа, теряем суть проблемы: Зачем вообще нужен BOOTLOADER?
Ответ: для загрузки программного кода!
Тогда сначало загружается BOOTLOADER, а затем загружается программный код столько раз сколько нужно!
Зачем две независимые программы объеденять в один файл????
Для первоначальной прошивки кристалла, видимо.
В таком случае первоначальной прошивкой будет прошивка бутлоадера!
Ну, скажем, нужно прошить партию в тысячу кристаллов. Прошивка в два этапа (зашить бутлодер программатором, затем залить программу по UART или другому интерфейсу) усложнит и замедлит процесс.
Согласен! Такой вариант не продумал!
sensor_ua
Aug 28 2006, 13:46
Если программатор коммандной строки (AVReAl, например), то нужно написать правильный батник и усё (разобраться с кодами возврата несложно). Это раз.
IMHO, сливать нужно бинарные файлы. Это самое простое решение. Это два.
Вообще, если использовать IAR, то склеивать можно и в проекте, прописав нужные сегменты, но для простоты в бутлоадере не должны использоваться прерывания (от 2-х таблиц векторов у симулятора раньше срывало крышу, компилер тоже себя вёл неадекватно), а startup бутлоадера нужно тоже не забыть положить в проект и в нужный сегмент приписать. Видел работающее, но сам так не делал.
Думаю, что если нет необходимости, объединять в проекте не стОит.
Andy Great
Aug 28 2006, 20:04
Не бинарные, а *.hex. Это корректнее..., толерантнее (щас так модно выражаться)
sensor_ua
Aug 29 2006, 13:19
В hex можно n раз писать по одному адресу - это практически невидимая и обычно малозначащая проблемка. После перевода в bin получим файл без пустот, отрезаем с бутового адреса и дописываем туда же. Затем можно перевести и в hex.
Иначе можно накатать прогу, залазящую на область бута, склеить так, что вначале не прога, а бут, потом уверенно залить и искать непонятки.
По bin прошивки и сравнивать корректнее - чего записано, чего считано... Ведь исходное в hex с пустотами, а сравниваем обычно файлы как минимум по размеру

, а уж потом по содержимому
Andy Great
Aug 30 2006, 16:07
Где-то видел утилиту типа hexmerge, порылся - не нашел. Objcopy еще можно попробовать - вдруг получится...
Я использую утллиту hexmate для объединения hex файлов
правда задача была прилепить прошивку DSP к прошивке хоста
запускается с коммандной строки, можно в окне cmd, можно BATником,
в CodeVision например можно сразу указать
Project->Configure->After Make->Program Settings .....
hexmate -help для справки
Andy Great
Aug 31 2006, 15:20
А еще есть пакет SRecord, так там столько утилит на все случаи жизни... Понятно, hex тоже понимает.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.