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

 
 
> Объединение проекта с бутлоадером
Илья Рогожкин
сообщение Aug 25 2011, 06:44
Сообщение #1


Участник
*

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



Здравствуйте. У меня стоит задача объединить один проект с бутлоадером AVR231 (собственный писать не хочется). Первым делом скопировал конфигурационный файл линкера из IAR-а и создал в нем сегмент:
-D_..X_BOOTLOAD_SEGMENT_START=1F000
-Z(CODE)BOOTLOADER=_..X_BOOTLOAD_SEGMENT_START-_..X_FLASH_END

После этого всем процедурам бутлоадера присвоил адрес этого сектора:

__C_task void loader(void) @ "BOOTLOADER"
{
//Code
}

void busInit(void) @ "BOOTLOADER"
{
//Code
}
и т.д.

Также изменил сегмент в ассемблеровских файлах:
//RSEG CODE
RSEG BOOTLOADER

После этого при компиляции выскочила ошибка:
Fatal Error[e72]: Segment NEAR_ID must be defined in a segment definition option (-Z, -b or -P)

Ну что, маст би дефайн, так маст би дефайн. Добавил NEAR_ID в строку конфигурационного файла линкера:
-Z(CODE)TINY_ID,NEAR_ID,__program_start=_..X_INTVEC_SIZE-_..X_FLASH_END

После этого выскочила еще одна ошибка:

Error[e16]: Segment CSTACK (size: 0x200 align: 0) is too long for segment definition. At least 0x1d more bytes needed. The problem occurred while processing the segment placement command "-Z(DATA)CSTACK+_..X_CSTACK_SIZE=_..X_SRAM_BASE-_..X_SRAM_END", where at the moment of placement the available memory ranges were "DATA:f1d-10ff"
Reserved ranges relevant to this placement:
DATA:100-10e NEAR_I
DATA:10f-edc NEAR_Z
DATA:edd-f1c RSTACK
DATA:f1d-10ff CSTACK

На этом месте я зашел в тупик. При чем тут CSTACK ?? Как связаны между собой сегменты DATA и CODE не ясно, поскольку я изменял только CODE. В чем может быть проблема и как ее исправить?

И второй вопрос:
Получилось, что процедура main() присутствует и в бутлоадере и в основном проекте. Естественно, компилятору это не нравилось, и он выдавал ошибку. Поэтому main в бутлоадере я оставил как есть, а main в основном проекте переименовал в main_proj. Когда делал наоборот, то компилятор размещал в области памяти начиная с адреса 0x1f000 не все процедуры бутлоадера. В том числе переименованную мною процедуру main не размещал вообще (она ведь нигде не вызывается). Да и просто из соображений логики : если любая программа в С начинается с процедуры main(), то она и должна присутствовать в бутлоадере, поскольку работа программы начинается с него. А теперь собственно вопрос: как мне поступить, когда после включения устройства я не буду жать на кнопочку, и бутлоадер закончит работу без прошивки флеш? Нужно, чтобы он вывалился в адрес 0x0000 либо прямиком в main_proj?

И еще. В конфигурационном файле компилятора есть сегмент __program_start:
-Z(CODE)TINY_ID,NEAR_ID,__program_start=_..X_INTVEC_SIZE-_..X_FLASH_END
Он же упоминается в настройках проекта: Project -> Options -> Linker -> Config -> Override default program entry -> Entry label
Может ли это помочь мне в решении второго вопроса?
Спасибо.

З.Ы. Я вложил конфигурационный файл линкера в этом письме, если он вдруг понадобится.

Прикрепленные файлы
Прикрепленный файл  lnkm128s.txt ( 5.86 килобайт ) Кол-во скачиваний: 75
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Илья Рогожкин
сообщение Aug 25 2011, 18:24
Сообщение #2


Участник
*

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



Цитата(Илья Рогожкин @ Aug 25 2011, 09:44) *
Error[e16]: Segment CSTACK (size: 0x200 align: 0) is too long for segment definition. At least 0x1d more bytes needed. The problem


Уже сам допетрил. Нужно было в конфигурационном файле размер стека просто уменьшить и все. Правда там еще пару подобных ошибок высветилось, которые решились таким же образом. Однако вопрос остался открытым, поскольку возникла следующая несостыковка. Дело в том, что атмеловский проект бутлоадера написан на С и в опциях проекта (General Options -> Library Configuration -> Library) стоит значение CLIB. У меня же проект написан на С++ и в этих же настройках стоит Full DLIB. Когда сменяю на CLIB, естественно исчезает возможность писать на С++, а когда ставлю на Full DLIB, то IAR не видит ассемблеровкие подпрограммы, которые входят в состав проекта бутлоадера AVR231. Компилятор пишет, что такие внешние процедуры не найдены.
Думаю, спрашивать почему так смысла нет, можеть кто-нибудь подскажет где можно найти информацию по управлению и настройками этих библиотек, кроме как в иаровском мануале на английском?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 29 2011, 05:04
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Илья Рогожкин @ Aug 25 2011, 21:24) *
IAR не видит ассемблеровкие подпрограммы, которые входят в состав проекта бутлоадера AVR231.
Про extern "C" при объявлении таких функций вы, конечно же, помните?
А в целом - прислушайтесь к предыдущим сообщениям. Вы роете себе яму. Поборов линковку вы обнаружите, что и загрузчик и приложение неявно используют библиотечные функции, вроде memcpy(), которые вы не можете объявить как @ "BOOTLOADER", значит они попадут в область приложения и при первом же обновлении ваш загрузчик перестанет работать. Не пытайтесь совокупить приложение и загрузчик. Это совершенно отдельные проекты.
Почитайте более подробное объяснение тут


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


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


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