А зачем Вам шить область бута? пусть там будит самый необходимый и отлаженный функционал. У меня была задача осуществлять удаленное обновление прошивки некоего модуля на ATmega128. Каналы и протоколы могут быть разные их реализация и уже заложены в основной прошивке. Так как программная паять занята примерно на треть я разбил ее на три логические части. в первой храниться основная программа, во второй загружаемая и в третьей бутлоадер. Бутлоадер является отдельным проектом определенными по заданным адресам функциями и занимается проверкой контрольных сумм, перезаписью в случае необходдимости основной части на загруженную, и сохранением данных полученных основной программой в области загружаемой. бут к проекту линкуется как RAW файл, а его интерфей для основной программы определен так в отдельном заголовочном файле в таком виде
/*
Функция void erase_flash() осуществляет полное стирание области памяти, в
которой храниться обновляющая прошивка. Эту функцию необходимо вызывать перед
началом загрузки новой версии
*/
inline void erase_flash()
{
(*((void(*)())0x0FFE0))();
}
/*
Функция unsigned char write_page(USHORT page, UCHAR* data) осуществляет запись
страницы памяти в область FLASH памяти контроллера предназначенной для хранения
обновляющей прошивки. Значение переменной page может принимать значение от
0(PAGE_MIN) до 495(PAGE_MAX) адресуя таким образом 62 кБ памяти. Если значение
page привысит допустимый диапазан, то функция вернет ILLEGAL_PAGE. В случае
успеха функция вернет NO_ERRROR.
*/
inline unsigned char write_page(unsigned short page, unsigned char* data)
{
return (*((unsigned char(*)(unsigned short, unsigned char*))0x0FFE2))(page, data);
}
/*
Функция void restart_device() осуществляет сброс устройства. после сброса
управление получает boot loader
*/
inline void restart_device()
{
(*((void(*)())0x0FFE4))();
}
/*
Функция unsigned char chek_crc() проверяет CRC обновляющей прошивки
в случае успеха возвращает NO_ERRROR иначе ILLEGAL_CRC
*/
inline unsigned char chek_crc()
{
return (*((unsigned char(*)())0x0FFE6))();
}
/*
Функция unsigned short get_info(unsigned char field) возвращает значение
соответствующего поля необходимой структуры или FIELD_NOT_FOUND если структура
не найдена
*/
inline unsigned short get_info(unsigned char field)
{
return (*((unsigned short(*)())0x0FFE8))(field);
}
Если будут вопросы - пишите на е-майл desh#front.ru