Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как разместить bootloader по определённому адресу?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
juvf
прескртптум: AVR Studio 4.17, WinAvr, C++, avr-c++

Есть функция-загрузчик. Её нужно поместить по адресу 0xf000. В мануале на avr-c++ написано как это сделать

Цитата
void boot(void) __attribute__ ((section (".bootloader")));
To relocate the section to a fixed address the linker flag -section-start is used.
This option can be passed to the linker using the -Wl compiler option:
-Wl,--section-start=.bootloader=0x1E000

Но как это сделать в AVR Studio? если не указывать -Wl,--section-start=.bootloader=0xF000, то при линковке получаю ошибку
Код
c:/soft/winavr-20090313/bin/../lib/gcc/avr/4.3.2/../../../../avr/bin/ld.exe: section .bootloader [000072ea -> 0000742f] overlaps section .data [000072ea -> 0000744f]


Пробовал переразместить секцию bootlooader в свойствах проекта на вкладке Costom options добавил опцию -Wl,--section-start=.bootloader=0xF000
но при линковке опять таже ошибка. Пробовал создать свою секцию и загрузчик разместить в неё - в результате при линковке таже ошибка.

Как в AVR Studio разместить функцию по нужному адресу? Как задать адрес секции?
Сергей Борщ
Цитата(juvf @ Dec 9 2009, 13:51) *
если не указывать -Wl,--section-start=.bootloader=0xF000, то при линковке получаю ошибку
Значит, наверное, нужно указывать. Особенно, если документация говорит, что указывать надо.
Цитата(juvf @ Dec 9 2009, 13:51) *
Пробовал переразместить секцию bootlooader в свойствах проекта на вкладке Costom options добавил опцию -Wl,--section-start=.bootloader=0xF000
но при линковке опять таже ошибка.
Вы обратили вниманте, что там отдельно опции "дла всего", "для конкретного файла" и "для линкера"? Вы куда добавляли?
Цитата(juvf @ Dec 9 2009, 13:51) *
Пробовал создать свою секцию и загрузчик разместить в неё - в результате при линковке таже ошибка.
Интересно, а что же такое __attribute__ ((section (".bootloader"))) как не размещение загрузчика в свою секцию?

Хотя самое грамотное - скопировать скрипт линкера в проект и поправить там распределение сегментов. Ибо иначе вы никак не сможете разместить в секции загрузчика библиотечные функции. И второе рекомендуемое действие (скорее даже первое по удобству) - напишите свой makefile и укажите студии использовать его. Ее возможности автоматической генерации сильно ограничены.
juvf
Цитата
Значит, наверное, нужно указывать. Особенно, если документация говорит, что указывать надо.
Конечно надо. Но я не определял ни каких секций типа .data .text и .bootloader. Однако после линковки я получаю увидомление, что в этих секциях занато столько-то памяти. Может где-то avr-c++ берёт эти секции, ведь я указал во фьюзах размер загрузочного сектора и его размещение. По идее этого должно быть достаточно, чтоб ИДЕ всё остальное сделала сама. Вот я пытаюсь с этим разобраться.
Цитата
Вы обратили вниманте, что там отдельно опции "дла всего", "для конкретного файла" и "для линкера"? Вы куда добавляли?

конечно обратил. я добавлял в "Для всего", потом для конкретного сишного файла опцию "-WI, --section-start=.bootloader=0xf000", и пробывал указать опцию линкеру "--section-start=.bootloader=0xf000", "-section-start=.bootloader=0xf000", "section-start=.bootloader=0xf000". Эффект один и тотже - "... overlaps ...". Пробывал по всякому. ((

(блин, Ctrl+C на это компе не работает, не могу цитировать....) Что значит "скопировать скрипт линкера в проект" AVR Studio? И далее... наверно я не так спросил, или вы не так поняли.... я не хочу скопировать библиотечную функцию в секцию загрузчика. Я написал свой загрузчик (точнее скопировал готовый сишный код из примера), т.е. в вайле *.h объявил свою функцию, в *.c определил тело функции. Теперь мне нужно чтоб линкер разместил эту функцию по адресу 0xF000. Как это сделать?
juvf
модераторы..... ну вы блин даёте!!! Тему переместили!!! Ну хоть как-то бы обосновали бы свои действия и на старом месте подсказали бы где искать мне мою тему. Да и Сергея я не понял, он мне отвечает так, как будь-то я действительно как чайник, спросил сколько бит в байте и что такое "напряжометр". А на самом деле проблема пахнет очередной багой в авр студио. Опять придется багрепорт писать. ((
SysRq
Цитата
Project->Configuration Options->Memory Settings
click Add button
Memory Type: Flash
Name: .bootloader
Address (Hex): 0x1C00 (this is a word address)

(c avrfreaks)
juvf
SysRq Спасибо!!! Проблема решена.
Сергей Борщ
Цитата(juvf @ Dec 9 2009, 19:29) *
Конечно надо. Но я не определял ни каких секций типа .data .text и .bootloader. Однако после линковки я получаю увидомление, что в этих секциях занато столько-то памяти. Может где-то avr-c++ берёт эти секции, ведь я указал во фьюзах размер загрузочного сектора и его размещение. По идее этого должно быть достаточно, чтоб ИДЕ всё остальное сделала сама. Вот я пытаюсь с этим разобраться.
секции .text, .data и многие другие определены в дефолтных скриптах линкера. Поэтому одним из моих советов было - скопировать такой скрипт, поправить и подключить его.
Цитата(juvf @ Dec 9 2009, 19:29) *
конечно обратил. я добавлял в "Для всего", потом для конкретного сишного файла опцию "-WI, --section-start=.bootloader=0xf000", и пробывал указать опцию линкеру "--section-start=.bootloader=0xf000", "-section-start=.bootloader=0xf000", "section-start=.bootloader=0xf000". Эффект один и тотже - "... overlaps ...". Пробывал по всякому. ((
вы не попробовали правильную комбинацию - указать -Wl,--section-start=.bootloader=0xf000 в опциях линкера. Обратите внимание, что после -Wl, (Wl, а не WI) пробела быть не должно.
Цитата(juvf @ Dec 9 2009, 19:29) *
Что значит "скопировать скрипт линкера в проект" AVR Studio?
Значить скопировать его в папку проекта и указать на него линкеру ключем -Wl,-T,<имя файла>
Цитата(juvf @ Dec 9 2009, 19:29) *
И далее... наверно я не так спросил, или вы не так поняли.... я не хочу скопировать библиотечную функцию в секцию загрузчика. Я написал свой загрузчик
Даже использование оператора switch() может приводить к вызову библиотечной функции ветвления. Аналогично с умножениями, делениями и т.д. При компиляции с ключем -mcall-prologues даже пролог и эпилог некоторых функций используют библиотечные подпрограммы для сохранения/восстановления регистров (а это иногда полезно для экономии памяти кода, особенно для загрузчика).
Цитата(juvf @ Dec 10 2009, 05:30) *
Да и Сергея я не понял, он мне отвечает так, как будь-то я действительно как чайник, спросил сколько бит в байте и что такое "напряжометр".
Извините, но опция -Wl описана в документации. Студия при компиляции выводит в окно сообщений командную строку, которой вызывает gcc. Не сложить эту информацию вместе может только чайник. Вопросы плана "что значит скопировать скрипт линкера в проект" тоже задают чайники. Это ваше первое сообщение на форуме, поэтому ни у кого не было возможности по предыдущим вашим сообщениям прикинуть ваш уровень.
Цитата(juvf @ Dec 10 2009, 05:30) *
А на самом деле проблема пахнет очередной багой в авр студио. Опять придется багрепорт писать. ((
Баги нет. Я
a) сам лично использовал этот метод передачи параметров когда начинал осваивать gcc
б) проверил перед тем, как писать на форум.
Цитата(juvf @ Dec 10 2009, 06:57) *
SysRq Спасибо!!! Проблема решена.
Заставили оболочку вписать -Wl,--section-start без ошибок и туда, куда надо. Что было причиной, почему заработало - так и не разобрались. "Бага в студии!" Типичный "не чайницкий" подход?

Добалю к вот этому:
Цитата
Но я не определял ни каких секций типа .data .text и .bootloader
В описании линкера сказано, что если линкер не нашел в скрипте указания, куда класть текущую входную секцию - то он создает выходную секцию с таким же именем, что и входная, и размещает ее следом за последней размещенной. Так появляется выходная секция .bootloader

И совсем П.С. Слева вверху есть иконка , под ней прячется линк "новые сообщения". Там ответы на ваше сообщение будут видны независимо от того, куда переместили ветку.
juvf
Сергей Борщ Чем умничать, лучше бы толковое сказали что-нибудь.
Цитата
вы не попробовали правильную комбинацию - указать -Wl,--section-start=.bootloader=0xf000 в опциях линкера.

Цитата
проверил перед тем, как писать на форум.
Может мы с разными процессорами пробуем? Вы с каким пробывали? Я пробовал c такой опцией, проект скомпелялся без ошибок, с выводом
Код
avr-c++ -mmcu=at90can128 -Wl,--section-start=.bootloader=0xf000  -Wl,-Map=interfaces.map main.o spi.o Display.o timer.o initialization.o interrupts.o crc.o connection.o modbus.o tcpip.o iso104.o MapModbus.o extRom.o arm150.o boot.o     -o interfaces.elf
Но моя функция разместилась не по адресу 0xf000.

Разобрался в чём была моя проблема. Оказывается, по каждому адресу в проце лежит слово, линкеру нужно адрес указать байтовый. Т.е. 2*0xf000, и правильная опция будет -Wl,--section-start=.bootloader=0x1e000

p.s.
Цитата
Обратите внимание, что после -Wl, (Wl, а не WI) пробела быть не должно.
)))) - ну это вообще на 5 балоф. Еще туда добавить "W - это дубль Вэ, а не две буквы V" и можно эти советы в тираж отдавать. Без обид wink.gif. Я же эту опцию из пдф-ника скопировал в проект, а потом скопировал из проекта в форум. Видно же что там "-Wl".

Цитата
И совсем П.С. Слева вверху есть иконка , под ней прячется линк "новые сообщения". Там ответы на ваше сообщение будут видны независимо от того, куда переместили ветку.
+1

Цитата
Вопросы плана "что значит скопировать скрипт линкера в проект" тоже задают чайники.
Ну конечно, куда нам, любителям IDE до вас, до ГУРУ, пишущих код в vi и соберающих его из командной строки! Выяснил до конца в чём проблема из-за спортивного интереса. А на самом деле это ни к чему. Программист, пишущий в ИДЭ, не должен беспокоится о скриптах, параметрах линкера и компелятора, makefile-ах и т.п., а должен быть сконцентрирован на решении др. задач. Для того и нужна ИДЭ.

опять bb-offtopic.gif .... сколько раз зарекался ......
Сергей Борщ
Цитата(juvf @ Dec 10 2009, 11:29) *
Сергей Борщ Чем умничать, лучше бы толковое сказали что-нибудь.
Не вопрос. Идите в игнор.
Цитата(juvf @ Dec 10 2009, 11:29) *
p.s.
)))) - ну это вообще на 5 балоф. Еще туда добавить "W - это дубль Вэ, а не две буквы V" и можно эти советы в тираж отдавать. Без обид wink.gif. Я же эту опцию из пдф-ника скопировал в проект, а потом скопировал из проекта в форум. Видно же что там "-Wl".
А WI я взял, значит из воздуха? Нетушки, я скопировал ее из вашего сообщения, и пробел там тоже обнаружил в процессе копирования. Так что не нужно пенять с больной головы.
Цитата(juvf @ Dec 10 2009, 11:29) *
Программист, пишущий в ИДЭ, не должен беспокоится о скриптах, параметрах линкера и компелятора, makefile-ах и т.п., а должен быть сконцентрирован на решении др. задач. Для того и нужна ИДЭ.
IDE должна использоваться в тех аспектах, в которых она расширяет возможности. Не ограничивая.
Успехов в расставлении галочек в новом проекте! Также успехов в попытках заставить студию включить в ваш проект файлы исходников на С++ с расширением .cpp
А я, сирый, скопирую makefile из старого проекта и поправлю при необходимости в нем пару строчек.
zltigo
Цитата(juvf @ Dec 10 2009, 12:29) *
Программист, пишущий в ИДЭ, не должен беспокоится о скриптах, параметрах линкера и компелятора, makefile-ах и т.п.

Слово программист в таком контексте должно употребляться в кавычках и не иначе. Более правильное слово кодировщик.
defunct
to juvf: imho тему нужно было создавать разделе GCC...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.