Илья Рогожкин
Aug 25 2011, 06:44
Здравствуйте. У меня стоит задача объединить один проект с бутлоадером 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, 18:24
Цитата(Илья Рогожкин @ 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
Aug 29 2011, 01:41
У меня была похожая задача. решил так: делаю 2 проекта. потом один проект в raw-binary и в этом виде как "образ" вставляю в другой проект.
мне нужно было калибровать встроенный осциллятор. сделал программы генерации частоты (на вывод выводит меандр). и образ генератора "засунул" в прогу калибровки. При запуску калибратор зашивал программу генератора в калибруемый мк, а калибратор мерил частоту. подстройку сделал через изменение значения байта в еепром.
Сергей Борщ
Aug 29 2011, 05:04
QUOTE (Илья Рогожкин @ Aug 25 2011, 21:24)

IAR не видит ассемблеровкие подпрограммы, которые входят в состав проекта бутлоадера AVR231.
Про extern "C" при объявлении таких функций вы, конечно же, помните?
А в целом - прислушайтесь к предыдущим сообщениям. Вы роете себе яму. Поборов линковку вы обнаружите, что и загрузчик и приложение неявно используют библиотечные функции, вроде memcpy(), которые вы не можете объявить как @ "BOOTLOADER", значит они попадут в область приложения и при первом же обновлении ваш загрузчик перестанет работать. Не пытайтесь совокупить приложение и загрузчик. Это совершенно отдельные проекты.
Почитайте более подробное объяснение
тут
arttab
Aug 29 2011, 06:23
не понятно чем Вас не устраивает мой вариант. создать 2 не зависимых проекта. и они будут действительно не зависимы. правда в случаи обновления кода загрузчика придется перекомпилировать и прогу в которую он включается. ну или найти вариант как в hex вписать образ нового загрузчикаю
или объединяйте проекты в один проект. а там уже выделите сегмент загрузчику
или иначе ощущения не те?
Altemir
Aug 29 2011, 06:44
Цитата(Сергей Борщ @ Aug 29 2011, 09:04)

значит они попадут в область приложения и при первом же обновлении ваш загрузчик перестанет работать. Не пытайтесь совокупить приложение и загрузчик. Это совершенно отдельные проекты.
+1
Разделите проекты, не мучайтесь. У нас на предприятии так на всех устройствах сделано. Если требуется залить ПО обоих проектов вместе (что ооооочень редко требуется, в зависимости от особенностей железа), то проекты можно склеить через слияние bin или hex файлов стандартными утилитами.