Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Объединение проекта с бутлоадером
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Илья Рогожкин
Здравствуйте. У меня стоит задача объединить один проект с бутлоадером 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
Может ли это помочь мне в решении второго вопроса?
Спасибо.

З.Ы. Я вложил конфигурационный файл линкера в этом письме, если он вдруг понадобится.
Палыч
Цитата(Илья Рогожкин @ Aug 25 2011, 10:44) *
У меня стоит задача объединить один проект с бутлоадером

ИМХО, задача абсолютно безполезная... Какова необходимость проделывать такое? Bootloader должен жить в своем проекте, Аpplication - свой проект, и я не знаю условий, при которых необходимо было бы их объединять в один проект...
Илья Рогожкин
Цитата(Илья Рогожкин @ 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. Компилятор пишет, что такие внешние процедуры не найдены.
Думаю, спрашивать почему так смысла нет, можеть кто-нибудь подскажет где можно найти информацию по управлению и настройками этих библиотек, кроме как в иаровском мануале на английском?
arttab
У меня была похожая задача. решил так: делаю 2 проекта. потом один проект в raw-binary и в этом виде как "образ" вставляю в другой проект.

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

или объединяйте проекты в один проект. а там уже выделите сегмент загрузчику

или иначе ощущения не те? wink.gif
Altemir
Цитата(Сергей Борщ @ Aug 29 2011, 09:04) *
значит они попадут в область приложения и при первом же обновлении ваш загрузчик перестанет работать. Не пытайтесь совокупить приложение и загрузчик. Это совершенно отдельные проекты.

+1
Разделите проекты, не мучайтесь. У нас на предприятии так на всех устройствах сделано. Если требуется залить ПО обоих проектов вместе (что ооооочень редко требуется, в зависимости от особенностей железа), то проекты можно склеить через слияние bin или hex файлов стандартными утилитами.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.